Files
hms/docs/discussions/2026-06-25-analysis/03-ai-depth.md
iven 3351c68d10 docs: redact Redis 凭据明文 + 系统分析报告 + wiki 关键数字校正
PP-03 凭据泄露处置:
- 清除 wiki + 2 份历史文档中的 Redis 明文密码与公网 IP(4 文件 5 处)
- wiki 新增安全告警 + 症状导航条目
- 核实降级:泄露旧密码已失效,HMS 连本地 Redis,云端闲置;公网已关闭

系统深度分析(9 维度 + 6 主题多专家组):
- docs/discussions/2026-06-25-analysis/ 新增 7 文件
- 综合 6.8/10,4 CRITICAL,TOP 12 痛点,4 阶段路线图

wiki 关键数字校正(PP-02/05a fix 触发):
- 迁移数 175→176(m20260626_000170)
- 症状导航新增 device_readings 分区硬截止 + claim_next 注入修复条目
2026-06-26 09:07:35 +08:00

156 lines
18 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.
# 主题 03 — AI 智能化纵深
> 日期: 2026-06-25 | 分支: feat/media-library-banner | 主题负责人: 综合主持
> 范围: V1 上线后 6-12 个月从「被动分析工具」跨越到「AI 驱动的主动关怀引擎」
> 证据基准: 所有论断附文件路径:行号或 grep 结果;关键代码断言已逐一核验
---
## 一、主题愿景(专家共识融合)
HMS 当前已具备相当完整的 AI 工程拼图——4 个 ProviderClaude/OpenAI/Ollama/通义)+ ReAct Agent 运行时AgentOrchestrator + 9 Tool + 角色沙箱)+ RAG 知识库 V2 + 引用溯源 JSONB + 分析队列 + 成本/配额服务。**缺的不是新零件,而是电路闭合**Agent 只在用户敲回车时转一次永不主动跑队列只入队不消费成本看板是硬编码常量估算的假数据RAG 检索质量全仓零指标grep `recall_at_k/faithfulness/golden_dataset` 0 命中)。
**统一愿景**:以「闭合已存在但空转的能力」为第一性原理,分三步把 HMS 从「医生敲回车才出报告的分析工具」进化为「感知→推理→行动→复盘」的主动关怀引擎——
1. **通电**:打通事件→入队→自主 ReAct→结构化建议→回写档案→推送的全链路修复 PP-05 死存储)。
2. **可信**:用双层记忆解决金鱼记忆、用引用溯源闭环 + RAG 评估集让 AI 输出从「主观判断」变「可量化、可溯源、可反馈」。
3. **可度量**:把真实 token 成本、建议转化率、检索 recall@5 变成运营仪表盘让「AI 到底准不准/贵不贵/有没有用」可回答。
**北极星指标从「分析产出量」改为「AI 建议转化率」**——一个 insight 若无法对应任何临床动作,就不该生成。
---
## 二、专家提案摘要(异见与共识)
### 共识(三位专家高度一致)
- **PP-05 是第一优先**三位专家都把「claim_next 接线 + worker loop」列为头号提案认定它是兑现「主动关怀」承诺的断点。
- **claim_next:98 的 `format!` 拼 tenant_id 必须先参数化**(虽然 Uuid 不可利用,但违反 CLAUDE.md SQL 注入铁律 + 反模式)。
- **自主 AI 必须接配额/熔断护栏**,否则 Provider 成本失控。
- **评估闭环RAG 黄金集 / LLM-judge是补 PP-04 可观测性 + PP-10 测试覆盖在 AI 子系统的专门补丁**。
### 关键异见(最终取舍见 §六)
| 分歧 | AI 架构师 | 医疗产品经理 | MLOps 工程师 | 最终取舍 |
|------|-----------|--------------|--------------|----------|
| AI worker 与死信重试是否合并 | 合并打包修(同类问题) | 分开SLA/迭代节奏不同) | 分开但共享 spawn 骨架 | **分开 + 共享骨架**:采纳产品/MLOps 观点,业务可降级与基础设施 100% 投递不可混;但抽取通用 spawn+interval+shutdown 框架避免造轮子。 |
| 患者侧是否上 LLM 对话 | 不主张 | 坚决反对(中老年接受度低) | 不涉及 | **不上**:患者侧坚持 local_rules + 模板LLM 算力留给医护端决策支持。 |
| 患者记忆卡片存储方式 | 结构化 KV 不全加密 | 不涉及 | 不涉及 | **结构化 key + 敏感 value 加密**key`medication_adherence:poor`明文可查可审计value 走 AES-256-GCM自由文本不入库降低泄露面。 |
| LLM-judge 可靠性 | 需人工抽审 | 引用校验优先 | 三层防线(规则兜底+LLM-judge+人工5% | **三层防线**关键医学禁用词走规则引擎硬门禁ambiguous 走 LLM-judge每周抽 5% 人工复核校准 judge。 |
| 商业化时机 | 不涉及 | 等 KPI 跑通 2-3 个月再议 | 先堵漏再扩面 | **延后商业化**:建议转化率稳定前不按次计费。 |
---
## 三、战略举措5 项)
### 举措 1 — AI 分析队列消费者落地(堵 PP-05闭合死存储
**rationale**`claim_next`analysis_queue.rs:92已实现 `FOR UPDATE` 语义但全仓仅定义处命中module.rs:268 只实例化队列、无 worker 调用。三位专家一致认定的第一优先。
**phases**
- **P0接线1 周)**①analysis_queue.rs:96-110 `format!` 拼 tenant_id 改为 `Statement::from_sql_and_keys` 参数化(修 SQL 注入铁律违反);②补 `FOR UPDATE SKIP LOCKED` 实现多 worker 并发安全 claim③在 module.rs register 关闭阶段 spawn `start_analysis_queue_worker`interval 15s`SELECT DISTINCT tenant_id` 驱动多租户遍历,并发度从 config.toml 读取(默认 2+ `tokio::sync::Semaphore` 限流。
- **P1链路闭合2 周)**:复用 chat_handler.rs:182-192 的 9 Tool 注册逻辑(抽 `build_default_tool_registry()` 公共函数),按 analysis_type 分派,调用 `AgentOrchestrator::run()`,结果走 `post_process_analysis()` 写 ai_analysis + 发布 `ai.analysis.completed` 事件(消费者 erp-message 已就绪)→ 转 `copilot_insights` 行进医护侧边栏行动收件箱。
- **P2韧性1 周)**`started_at < NOW()-30min AND status='running'` 的卡死回收扫描 + 失败走 mark_failedretry_count<max_retries=3 指数退避,达限移入死信)+ 同患者同 insight_type 24h 去重防洪泛。
**effortEstimate**4 周(后端 1 人)
**expectedImpact**:高 — 兑现「主动关怀」承诺;激活 5 条入队链路critical_alert/lab_upload/dialysis/patrol/high_risk从死存储变活管线。
**kpis**:队列 pending 积压 ≤50worker 吞吐 ≥100 分析/天/租户p95 分析延迟 ≤30s卡死回收覆盖率 100%;死信率 ≤2%。
**dependencies**PP-01 死信重试接线(共享 spawn 骨架config.toml 并发度字段Provider 配额服务(举措 4
### 举措 2 — Function Calling + 双层长期记忆(从文本到可执行建议)
**rationale**FC 已在 claude.rs/openai.rs 实现(`generate_with_tools`),但仅 chat_handler 使用Agent 永不主动跑、记忆仅最近几条原文chat_handler.rs:140 加载历史,长会话 token 爆炸)。
**phases**
- **P1FC 接入分析3 周)**AnalysisService::stream_analyze 注入受控工具 schemafetch_lab_trends/fetch_medication_history/lookup_drug_interaction/lookup_clinical_guideline/propose_followup_actionLLM 发起 tool_call → worker 本地执行 → 结果回灌 → 输出结构化 JSON `{summary, findings[], suggested_actions[], confidence}`max_tool_rounds=5 + token budget 熔断;扩 analysis.rs references JSONB 存 findings/suggested_actions。
- **P2双层记忆3 周)**①会话级滚动摘要——session>20 条触发 `summarize_session`cheap Ollama provider摘要存 ai_chat_session.metadataJSONB 已存在零迁移chat_handler:140 优先注入摘要+最近4条token 从 ~8k 降到 ~1.5k;②患者级事实卡片——新增 `ai_patient_memory`patient_id/tenant_id/key/value/source/confidence/expire_atkey 明文、value 加密post_process 用 LLM 抽取结构化事实 upsertconfidence 阈值 0.7)。
- **P3PII 防护1 周)**tool_call 结果注入 LLM 前经 SanitizationService 脱敏(姓名/身份证/手机号 token 化为 `patient_ref_xxx`Provider 配置层启用 zero-retention扩 AuditLog 记录所有记忆写入。
**effortEstimate**7 周(后端 1 人 + 医疗审校 0.3 人)
**expectedImpact**:高 — AI 输出从自然语言段落变可机读临床建议;长会话成本降 ~80%Agent 跨会话记忆患者基线。
**kpis**:结构化输出占比 ≥90%;会话平均 token 降幅 ≥60%记忆卡片过期率30 天≤15%PII 泄露事件 0。
**dependencies**:举措 1worker 复用 FC 链路);举措 4能力矩阵 + token budgetknowledge_v2 检索质量(举措 3
### 举措 3 — RAG 评估闭环 + 引用可信度(让 AI 可量化)
**rationale**:全仓 grep `recall_at_k/faithfulness/golden_dataset` 0 命中——今天无人能回答「我们的 AI 检索到底准不准」references JSONB 已加但前端仅文本展示、无溯源跳转、无反馈。
**phases**
- **P1引用溯源闭环2 周)**①worker 完成分析时做引用完整性校验——`[ref:id]` 必须全部能在 ai_knowledge_references 查到,查不到标 broken_citation 并降级 confidence前端灰显②前端 `[ref:xxx]` 渲染为可点击 chip 弹 guideline 摘要③suggestion_feedback 扩 `useful_citation`/`wrong_citation` action④nightly 统计 knowledge_reference 采纳率,低采纳标需复核。
- **P2评估集3 周)**:新增 `ai_eval_case`input_payload/expected_topics/critical_must_mention/must_not_mention/golden_summary/source_analysis_id初始从医生反馈正向记录导入 20-50 条覆盖高血压/糖尿病/透析高频场景;新增 `eval_runner.rs` 跑 active prompt 计算 recall@5/citation_precision/answer_faithfulness
- **P3CI 门禁2 周)**CI 加 `cargo test --features eval-smoke` 跑 10% 子集(无 LLM 的纯 recall@5,快)作为 PR 门槛,分数下降超阈值阻断;全量 LLM-judge 评测手动触发,写 docs/audits/rag/rag-eval-YYYY-MM-DD.md 对比趋势。
**effortEstimate**7 周(后端 1 人 + 医护标注 0.5 人)
**expectedImpact**:中 — AI 质量从主观判断变数字仪表盘;驱动知识库持续迭代;改 prompt 后能回答「新版有没有变好」。
**kpis**recall@5 ≥0.8citation_precision ≥0.95broken_citation 率 ≤3%;评估集季度刷新 1 次CI 门禁拦截率可观测。
**dependencies**knowledge_v2 文档质量医护标注时间投入vector_search.rs:52 参数化改造(顺带完成)。
### 举措 4 — 成本真相化 + Provider 能力矩阵(可观测 + 不爆费)
**rationale**`default_token_estimate`cost.rs:40-49硬编码 2000/1500 等常量,非 chat 分析路径完全跳过 `log_usage`(仅 chat_handler.rs:319 + mod.rs:1116 调用)——成本看板是估算假数据;`token_budget: None` 永远不启orchestrator.rs:130 是死代码);`supports_fc = provider_name != "ollama"`chat_handler.rs:241硬编码字符串。
**phases**
- **P1真实 usage2 周)**①provider 返回 TokenUsage 上抛(扩 AnalysisResult 结构,逐个适配 chat/copilot/agent 调用方②analysis.rs 收尾调 `UsageService::log_usage`③CostService::estimate_cost 优先读 ai_usage 真实聚合、缺数据降级估算并标 `is_estimated`;④新增 `GET /ai/cost/realtime` + Prometheus 指标接 Grafana。
- **P2能力矩阵2 周)**AiProvider trait 加 `supports_function_calling()`/`supports_streaming()` 自报能力chat_handler 按矩阵走 FC ReAct 或降级token_budget 从 config 按角色配额(患者 8k/医生 16k/worker 4k激活死代码cost.rs 接实时熔断——单租户单日累计超阈值 chat_handler 返回 429 + worker 暂停入队。
**effortEstimate**4 周(后端 1 人)
**expectedImpact**:中 — 成本从谎报变真相Provider 混用不空转不爆费;自主 AI 有预算护栏。
**kpis**:成本看板 is_estimated 占比 ≤10%新数据租户日配额熔断触发可观测Ollama 降级路径 tracing 可见;死代码 token_budget 激活。
**dependencies**Provider usage 字段稳定性Ollama 可能不返回 usage降级估算+记 `model_not_reporting_usage`);举措 1 worker共享熔断
### 举措 5 — AI 行动闭环 + 患者侧轻量触达(建议不悬空 + 提升依从性)
**rationale**suggestion_feedback 只存 actionaccept/reject无下游动作AI 建议悬空;患者侧(中老年为主)对 AI 聊天接受度低,需「清晰的下一步动作」而非 AI 解读。
**phases**
- **P1建议→任务转化2 周)**:新增 `POST /ai/suggestions/{id}/convert`,按 suggested_action_type 调 erp-health servicefollow_up_service::create_task_from_template 已存在)创建业务对象 → 发 `suggestion.converted` → 关联 task_id前端漏斗视图「已采纳 N/已转化 M/已改善 K」。权限边界convert 需 `require_permission` 对应 .manage不绕过任务创建权限。
- **P2患者侧轻量触达3 周)**:复用 local_rules.rs 扩「依从性规则集」(漏测/服药窗/复诊到期),每日扫描 device_readings 最近 3 天,命中生成 patient_facing insight模板渲染非 LLM成本低`ai.insight.generated` → 小程序助手 Tab注意修 PP-06 角标指向 index 3限频每患者每天 ≤1 条 + 勿扰时段 + 一键关闭。
- **P3北极星度量1 周)**:周报统计「建议→任务转化率」按 insight_type/suggestion_source 维度,作为 AI 价值核心 KPI。
**effortEstimate**6 周(后端 1 人 + 前端 0.5 人 + 法务审文案 0.2 人)
**expectedImpact**:中 — AI 价值从「产出量」转「转化率」;患者依从性可度量提升。
**kpis**:建议转化率 ≥30%(高频随访模板补全后);患者推送退订率 ≤5%;依从性规则医学正确性(每条带 guideline_id 引用)。
**dependencies**PP-02 device_readings 分区续建患者触达数据源PP-06 告警角标修复follow_up 模板补全;跨模块调 erp-health 走 trait 不直依赖(架构铁律)。
---
## 四、速赢1-2 周可落地)
1. **claim_next 参数化 + SKIP LOCKED 加固**≤3 天analysis_queue.rs:96-110 `format!``Statement::from_sql_and_keys` + 补 `FOR UPDATE SKIP LOCKED`,消除 SQL 注入铁律违反 + 为多 worker 并发铺路。零业务风险,纯加固。
2. **token_budget 死代码激活**≤2 天orchestrator.rs:130-148 预算逻辑已实现,仅需 chat_handler.rs:225 从 config 读取角色配额(患者 8k/医生 16k传入让既有护栏生效。
3. **真实 usage 灌入非 chat 路径**≤5 天provider TokenUsage 上抛 + analysis.rs 收尾调 log_usage + CostService 标 is_estimated让成本看板从假数据变真相。
4. **引用完整性校验 MVP**≤5 天worker 完成分析时遍历 `[ref:id]` 校验存在性broken 标记 + 降级 confidence前端灰显无需新表新迁移。
---
## 五、主题级风险
1. **自主 AI 成本失控**worker 持续消耗 Provider 配额。→ 必须先接举措 4 配额/熔断再放举措 1 全量。
2. **医疗 AI 幻觉危及患者**:结构化建议被医生采纳进入临床决策。→ 引用溯源闭环(举措 3+ evidence_strength 灰显 + 前 2 周「只读不推」模式 + 法务审文案。
3. **PII 通过 tool_call 外泄**:患者数据二次喂外部 Provider。→ SanitizationService 强脱敏 + Provider zero-retention + 记忆 value 加密。
4. **LLM-judge 自身幻觉**:评估闭环把质量门禁交给可能幻觉的模型。→ 三层防线(规则硬门禁 + LLM-judge 仅 ambiguous + 人工 5% 抽审)。
5. **AI 产出洪泛**risk_service 每天对所有高危患者刷一遍会爆 insight 表。→ 同患者同 insight_type 24h 去重 + 只读不推过渡期。
6. **患者信任度低**:中老年对机器提醒信任低于医生口头医嘱。→ 定位「辅助提醒」非「诊断建议」+ 文案法务审核 + 严格限频。
7. **评估集冷启动 + 过期**:前 1-2 月反馈量不足;季度不刷新则失真。→ 初期只做引用完整性校验不做质量评分;建季度刷新机制。
---
## 六、专家分歧调和(最终取舍)
1. **AI worker vs 死信重试是否合并****分开 + 共享 spawn 骨架**。采纳医疗产品经理/MLOps 观点:基础设施层(死信 100% 投递、无业务语义与业务层AI 可降级、可限流、可灰度)的 SLA/迭代节奏/监控指标完全不同,强行合并会让 AI 业务被基础设施稳定性拖死。但抽取通用「spawn + interval + graceful shutdown」框架避免重复造轮子反模式合规
2. **患者侧 LLM 对话****不上**。三位中两位明确反对,符合「用户驱动非技术驱动」原则;患者侧坚持规则引擎 + 模板。
3. **患者记忆存储****结构化 key 明文 + 敏感 value 加密**。调和安全(可审计/可查询与隐私PII 保护),自由文本不入库。
4. **LLM-judge 可靠性****三层防线**。规则引擎兜底关键医学禁用词LLM-judge 仅处理 ambiguous人工抽审 5% 校准。
5. **RAG 评估 vs 补 E2E 优先级****并行**。AI 输出正确性(举措 3与 UI 可点性(属测试主题)风险类型不同,医疗幻觉比少几个 E2E spec 更致命,但两者不互斥,分头推进。
6. **商业化时机****延后**。等建议转化率 KPI举措 5跑通 2-3 个月、医护采纳率稳定后再议按次计费。
---
## 七、路线图(与项目 9 维度 Phase 对齐)
- **Phase 11-3 月)**:举措 1P0+P1 接线闭合)+ 举措 4P1 成本真相化)+ 速赢 1-3。兑现「至少 1 条健康告警→AI 评估→推送」完整链路。
- **Phase 23-6 月)**:举措 1P2 韧性)+ 举措 2FC + 双层记忆)+ 举措 3P1 引用闭环 + P2 评估集)+ 举措 5P1 建议转化)。从「被动工具」跨到「主动关怀引擎」。
- **Phase 36-12 月)**:举措 3P3 CI 门禁)+ 举措 4P2 能力矩阵)+ 举措 5P2 患者触达 + P3 北极星度量)+ Prompt 影子发布/A-B利用 CacheKey 含 prompt_version 红利,红利已核验 cache.rs。多模态化验单图像识别作为远期探索。
---
> 本主题所有代码断言已逐一核验claim_next 未接线grep 全仓仅定义处命中、default_token_estimate 硬编码cost.rs:40-49、log_usage 仅 2 处调用chat_handler.rs:319 + mod.rs:1116、token_budget: None 死代码orchestrator.rs:130、supports_fc 硬编码chat_handler.rs:241、recall/faithfulness/golden 0 命中。论断可追溯。