Files
hms/docs/superpowers/specs/2026-05-01-ai-action-loop-design.md
iven 31e623a947
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
docs(ai): AI→行动闭环设计规格
发散式讨论产出的设计文档,定义了 AI 分析结果如何自动转化为
可执行行动(随访计划/智能预约/风险预警),通过 BPMN 工作流
引擎编排分级自动化,形成数据→分析→行动→评估的完整闭环。
2026-05-01 01:19:28 +08:00

325 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI→行动闭环设计规格
> 日期: 2026-05-01 | 状态: 讨论完成,待实施
> 模块: erp-ai + erp-workflow + erp-health
## 1. 背景与动机
erp-ai Phase 1 MVP 已完成 4 种分析类型(化验单解读、趋势分析、体检方案、报告摘要),支持 Claude SSE 流式输出和自动分析调度器。但 AI 分析结果目前仅是文字——没有创建随访计划、没有预约复查、没有跟踪建议是否被执行。
本设计目标是建立**AI→行动闭环**:让 AI 建议自动转化为可执行的行动追踪执行效果形成数据采集→AI 解读→行动→评估→再调整的完整循环。
## 2. 核心决策
| 决策点 | 选择 | 原因 |
|--------|------|------|
| 行动类型 | 随访计划 + 智能预约 + 风险预警 | 覆盖主要医患互动场景;用药调整涉及处方权暂不纳入 |
| 自动化程度 | 分级(低→自动 / 中→医生审批+超时 / 高→必须确认) | 平衡效率与医疗安全 |
| 输出结构 | 双通道(可读文本 + 结构化 JSON | 人机各取所需 |
| 架构模式 | Workflow 引擎编排BPMN | 利用现有 erp-workflow流程可视化+审批关卡+审计轨迹 |
| 风险判定 | AI 判定 + 可配置阈值 | 智能判定+租户自定义灵活覆盖 |
| 效果评估 | 前后对比分析 | 随访后再分析,对比 baseline 指标快照 |
## 3. 双通道输出 Schema
### 3.1 响应结构
AI 分析响应从纯文本升级为双通道:
```json
{
"analysis_id": "uuid",
"patient_id": "uuid",
"text_content": "张三的收缩压在过去 90 天呈上升趋势...",
"structured_output": {
"risk_level": "medium",
"risk_factors": ["收缩压连续7天>140", "心率变异性下降15%"],
"suggestions": [
{
"id": "uuid",
"type": "followup",
"priority": 1,
"timing": "14天内",
"reason": "收缩压趋势异常,需要监测用药效果",
"params": {
"followup_type": "血压监测",
"metrics": ["systolic_bp", "diastolic_bp", "heart_rate"],
"interval_days": 14
},
"auto_executable": false
}
],
"baseline_summary": {
"analysis_date": "2026-05-01",
"key_metrics": {
"systolic_bp": {"value": 148, "trend": "rising"},
"diastolic_bp": {"value": 92, "trend": "stable"},
"heart_rate": {"value": 88, "trend": "rising"}
}
}
}
}
```
### 3.2 字段说明
- `text_content`: 保留现有能力,给医生/患者阅读的文本分析
- `risk_level`: `low` / `medium` / `high`,由 AI 基于临床阈值判定
- `suggestions[]`: 建议数组,每个含 `type`(followup/appointment/alert)、`priority``timing``params``auto_executable`
- `baseline_summary`: 分析时的指标快照,用于闭环前后对比
### 3.3 安全与访问控制
- `structured_output` 存储前必须经过 PII 脱敏(复用现有 `SanitizationService``baseline_summary` 不包含患者姓名、身份证号等 PII
- `ai_suggestion` 表的 `params``action_result` JSONB 字段存储前需 AES-256-GCM 加密(复用项目已有 KEK/DEK 模式)
- 建议查询 API 必须带 `tenant_id` 过滤 + 权限校验(`ai.suggestion.list` / `ai.suggestion.manage`
- `auto_executable``risk_level` 决定:`low` = true`medium`/`high` = false。AI 不可覆盖此规则
### 3.4 边界情况
- **空建议列表**AI 未生成任何建议时,不创建工作流实例,记录日志,不通知医生(正常行为)
- **所有建议参数不完整**:等同于空建议,降级为纯文本,触发 `ai.suggestion.parse_failed` 事件通知医生
- **闭环对比无变化**:生成"指标稳定"对比报告,不触发新一轮建议流程
## 4. BPMN 流程定义
> **前置条件**Phase 2 启动前,需审计 erp-workflow 的 BPMN 功能覆盖度。本流程依赖排他网关条件分支、定时器边界事件超时升级、用户任务医生审批。如审计发现能力缺失MVP 回退为 erp-health 中的直接服务层编排Action Registry 模式),不依赖 BPMN。
### 4.1 通用流程骨架
```
[AI分析完成] → [风险分级网关]
┌─────────┼─────────┐
↓ ↓ ↓
低风险 中风险 高风险
│ │ │
↓ ↓ ↓
[自动执行] [创建待办] [紧急通知]
│ ↓ ↓
│ [医生审批] [医生确认]
│ ↓ ↓ ↓
│ [批准][拒绝] [确认][拒绝]
│ ↓ ↓ ↓ ↓
│ [执行][记录] [执行][记录]
↓ ↓ ↓
[执行完成] ←←←←←←←←←←
[等待随访/复查完成]
[触发再分析]
[生成对比报告]
```
### 4.2 三个流程变体
**随访流程** (`ai_followup_workflow`)
- 自动创建随访计划 + 关联 AI 建议来源
- 医生可修改随访时间/内容后再确认
- 随访到期 → 提醒患者记录体征 → 提醒医生查看
**预约流程** (`ai_appointment_workflow`)
- AI 推荐科室 + 时间段(基于排班数据)
- 患者收到推送,一键确认或选择其他时段
- 预约前 24h 自动提醒
**预警流程** (`ai_alert_workflow`)
- 低风险 → 直接发送(患者 + 医生双通道)
- 中风险 → 推送给医生24h 未读升级
- 高风险 → 即时推送 + 仪表盘标红 + 超时升级到科室主任
### 4.3 超时与升级策略
| 等级 | 医生响应时限 | 超时动作 |
|------|-------------|---------|
| 低 | 不需要审批 | — |
| 中 | 24 小时 | 自动提醒 + 标记待跟进 |
| 高 | 4 小时 | 升级到上级医生 + 通知科室 |
### 4.4 闭环触发
- 随访完成 → 提取随访期间新数据 → 对比 baseline_summary → 生成对比报告
- 趋势好转 → 记录有效 + 降低后续监测频率
- 趋势恶化 → 触发新一轮建议流程(可能升级风险等级)
## 5. 事件流与模块集成
### 5.1 核心事件链
```
erp-ai erp-workflow erp-health
│ │ │
│ ai.analysis.completed │ │
│──────────────────────────→│ │
│ (payload: structured_ │ │
│ output + risk_level) │ │
│ │ │
│ [风险分级网关] │
│ │ │
│ │ workflow.ai_action.created│
│ │──────────────────────────→│
│ │ (创建待办/随访/预警) │
│ │ │
│ │ [执行行动]
│ │ │
│ │ health.ai_action.executed │
│ │←──────────────────────────│
│ │ │
│ [等待随访完成] │
│ │ │
│ ai.reanalysis.requested │ │
│←──────────────────────────│ │
│ │ │
│ [前后对比分析] │ │
│ │ │
│ ai.analysis.completed │ │
│──────────────────────────→│ │
│ (新一轮,带 baseline) │ [对比报告]
```
### 5.2 新增事件
| 事件 | 发布方 | 消费方 | Payload |
|------|--------|--------|---------|
| `ai.analysis.completed` | erp-ai | erp-workflow | 已有,扩展 payload 含 structured_output |
| `ai.reanalysis.requested` | erp-workflow | erp-ai | `{analysis_id, followup_id, trigger}` |
| `workflow.ai_action.created` | erp-workflow | erp-health | `{workflow_id, suggestion_type, params, risk_level}` |
| `health.ai_action.executed` | erp-health | erp-workflow | `{action_id, action_type, result}` |
| `ai.suggestion.parse_failed` | erp-ai | erp-message | `{analysis_id, patient_id, error}` — 通知医生手动查看 |
### 5.3 数据库扩展
**`ai_suggestion` 表**erp-ai crate
| 字段 | 类型 | 说明 |
|------|------|------|
| id | UUID v7 | 主键 |
| tenant_id | UUID | 租户 |
| analysis_id | UUID | 关联分析记录 |
| suggestion_type | ENUM | followup / appointment / alert |
| risk_level | ENUM | low / medium / high对应 Rust `RiskLevel` 枚举) |
| params | JSONB | 建议参数AES-256-GCM 加密存储) |
| status | ENUM | pending/approved/rejected/executed/expired/parse_failed对应 Rust `SuggestionStatus` 枚举) |
| workflow_instance_id | UUID | 关联工作流实例 |
| action_result | JSONB | 执行结果AES-256-GCM 加密存储) |
| baseline_snapshot | JSONB | AI 分析时的指标快照 |
| reanalysis_id | UUID | 闭环后再分析的 ID |
| 标准审计字段 | — | created_at, updated_at, created_by, updated_by, version, deleted_at |
**`ai_risk_threshold` 表**erp-ai crate
| 字段 | 类型 | 说明 |
|------|------|------|
| id | UUID v7 | 主键 |
| tenant_id | UUID | 租户 |
| metric_name | VARCHAR | 指标名systolic_bp 等) |
| low_threshold | JSONB | 低风险阈值范围 |
| medium_threshold | JSONB | 中风险阈值范围 |
| high_threshold | JSONB | 高风险阈值范围 |
| 标准审计字段 | — | 同上 |
全局默认阈值通过 `config.toml` 配置文件加载(`[ai.risk_thresholds]` section不使用 `tenant_id = null` 的数据库行。租户级覆盖通过此表按 `tenant_id` 查询,查询优先级:租户配置 > 全局默认。
### 5.4 Rust 类型定义
新增枚举(与现有 `AnalysisType` 并列,位于 `crates/erp-ai/src/dto.rs`
```rust
enum SuggestionType { Followup, Appointment, Alert }
enum RiskLevel { Low, Medium, High }
enum SuggestionStatus { Pending, Approved, Rejected, Executed, Expired, ParseFailed }
```
## 6. Prompt 工程与降级
### 6.1 Prompt 模板改造
现有模板从"纯文本输出"改为"双通道输出"
```
system: "你是健康趋势分析专家。请同时输出两部分:
1. PATIENT_TEXT给患者/医生的文字解读
2. STRUCTURED_JSON系统用的结构化建议
风险等级判定规则:
- low: 所有指标在正常范围内,仅有轻微波动
- medium: 有1-2个指标超出正常范围
- high: 多个指标严重异常,需要紧急干预
可执行建议类型followup / appointment / alert
输出格式:
===PATIENT_TEXT===
(可读文本)
===STRUCTURED_JSON===
JSON"
user: "{{data}}
参考阈值:{{risk_thresholds}}"
```
### 6.2 输出解析流程
```
AI 响应 → 分割(===PATIENT_TEXT=== / ===STRUCTURED_JSON===)
JSON 解析 → Schema 校验(字段完整性、类型正确性)
┌─ 校验通过 → 存储双通道输出 → 触发 ai.analysis.completed
└─ 校验失败 → 降级为纯文本分析
suggestion_status = "parse_failed"
触发 ai.suggestion.parse_failed 事件
→ erp-message 消费,通知医生手动查看
```
### 6.3 降级策略
| 场景 | 降级行为 |
|------|---------|
| JSON 解析失败 | 保留文本,不触发自动化,通知医生手动查看 |
| 风险等级缺失 | 默认 medium需要医生确认 |
| 建议参数不完整 | 只执行有完整参数的建议 |
| AI Provider 不可用 | 使用本地规则引擎(预定义临床规则) |
### 6.4 本地规则引擎
当 AI Provider 不可用时,预设临床规则直接生成结构化建议:
```rust
struct LocalRule {
metric: String, // "systolic_bp"
operator: CompareOp, // GreaterThan
threshold: f64, // 160.0
risk_level: RiskLevel, // High
suggestion_type: SuggestionType, // Alert
message_template: String, // "收缩压异常偏高({value}mmHg),请立即就医"
}
```
匹配到的规则直接生成结构化建议,走相同的 Workflow 流程。
## 7. 前端展示
### 7.1 Web 管理端
- AI 分析详情页增加「建议面板」:显示结构化建议列表、风险等级标签、执行状态
- 医生工作台增加「AI 待办」区域:中/高风险建议等待审批,显示倒计时
- 随访详情页增加「AI 闭环」标签:显示前后对比报告
### 7.2 小程序患者端
- 健康页面增加「AI 建议卡片」:显示最新建议摘要和风险等级
- 预约页面增加「AI 推荐时段」:标记 AI 建议的预约时间段
- 消息页面增加「风险预警」通知类型
## 8. 实施分期建议
| Phase | 内容 | 预计周期 |
|-------|------|---------|
| Phase 1 | 双通道输出 Schema + Prompt 改造 + 解析校验 + `ai_suggestion` 表 | 1-2 周 |
| Phase 2 | BPMN 流程定义 + 事件集成 + `ai_risk_threshold` 表 + 前端建议面板 | 2 周 |
| Phase 3 | 闭环对比分析 + 本地规则引擎 + 超时升级 + 前端闭环标签 | 2 周 |
| Phase 4 | 前端完整体验(医生工作台 + 小程序卡片)+ 配额管控集成 | 1-2 周 |