发散式讨论产出的设计文档,定义了 AI 分析结果如何自动转化为 可执行行动(随访计划/智能预约/风险预警),通过 BPMN 工作流 引擎编排分级自动化,形成数据→分析→行动→评估的完整闭环。
14 KiB
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 分析响应从纯文本升级为双通道:
{
"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_executablebaseline_summary: 分析时的指标快照,用于闭环前后对比
3.3 安全与访问控制
structured_output存储前必须经过 PII 脱敏(复用现有SanitizationService),baseline_summary不包含患者姓名、身份证号等 PIIai_suggestion表的params和action_resultJSONB 字段存储前需 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):
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 不可用时,预设临床规则直接生成结构化建议:
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 周 |