docs(ai): AI→行动闭环设计规格
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

发散式讨论产出的设计文档,定义了 AI 分析结果如何自动转化为
可执行行动(随访计划/智能预约/风险预警),通过 BPMN 工作流
引擎编排分级自动化,形成数据→分析→行动→评估的完整闭环。
This commit is contained in:
iven
2026-05-01 01:19:28 +08:00
parent 3b38562533
commit 31e623a947

View File

@@ -0,0 +1,324 @@
# 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 周 |