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 注入修复条目
18 KiB
主题 03 — AI 智能化纵深
日期: 2026-06-25 | 分支: feat/media-library-banner | 主题负责人: 综合主持 范围: V1 上线后 6-12 个月,从「被动分析工具」跨越到「AI 驱动的主动关怀引擎」 证据基准: 所有论断附文件路径:行号或 grep 结果;关键代码断言已逐一核验
一、主题愿景(专家共识融合)
HMS 当前已具备相当完整的 AI 工程拼图——4 个 Provider(Claude/OpenAI/Ollama/通义)+ ReAct Agent 运行时(AgentOrchestrator + 9 Tool + 角色沙箱)+ RAG 知识库 V2 + 引用溯源 JSONB + 分析队列 + 成本/配额服务。缺的不是新零件,而是电路闭合:Agent 只在用户敲回车时转一次,永不主动跑;队列只入队不消费;成本看板是硬编码常量估算的假数据;RAG 检索质量全仓零指标(grep recall_at_k/faithfulness/golden_dataset 0 命中)。
统一愿景:以「闭合已存在但空转的能力」为第一性原理,分三步把 HMS 从「医生敲回车才出报告的分析工具」进化为「感知→推理→行动→复盘」的主动关怀引擎——
- 通电:打通事件→入队→自主 ReAct→结构化建议→回写档案→推送的全链路(修复 PP-05 死存储)。
- 可信:用双层记忆解决金鱼记忆、用引用溯源闭环 + RAG 评估集让 AI 输出从「主观判断」变「可量化、可溯源、可反馈」。
- 可度量:把真实 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 关闭阶段 spawnstart_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_failed(retry_count<max_retries=3 指数退避,达限移入死信)+ 同患者同 insight_type 24h 去重防洪泛。
effortEstimate:4 周(后端 1 人) expectedImpact:高 — 兑现「主动关怀」承诺;激活 5 条入队链路(critical_alert/lab_upload/dialysis/patrol/high_risk)从死存储变活管线。 kpis:队列 pending 积压 ≤50;worker 吞吐 ≥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:
- P1(FC 接入分析,3 周):AnalysisService::stream_analyze 注入受控工具 schema(fetch_lab_trends/fetch_medication_history/lookup_drug_interaction/lookup_clinical_guideline/propose_followup_action),LLM 发起 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.metadata(JSONB 已存在,零迁移),chat_handler:140 优先注入摘要+最近4条,token 从 ~8k 降到 ~1.5k;②患者级事实卡片——新增ai_patient_memory表(patient_id/tenant_id/key/value/source/confidence/expire_at),key 明文、value 加密,post_process 用 LLM 抽取结构化事实 upsert(confidence 阈值 0.7)。 - P3(PII 防护,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:举措 1(worker 复用 FC 链路);举措 4(能力矩阵 + token budget);knowledge_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_citationaction;④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。 - P3(CI 门禁,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.8;citation_precision ≥0.95;broken_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(真实 usage,2 周):①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 只存 action(accept/reject)无下游动作,AI 建议悬空;患者侧(中老年为主)对 AI 聊天接受度低,需「清晰的下一步动作」而非 AI 解读。
phases:
- P1(建议→任务转化,2 周):新增
POST /ai/suggestions/{id}/convert,按 suggested_action_type 调 erp-health service(follow_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 周可落地)
- claim_next 参数化 + SKIP LOCKED 加固(≤3 天):analysis_queue.rs:96-110
format!改Statement::from_sql_and_keys+ 补FOR UPDATE SKIP LOCKED,消除 SQL 注入铁律违反 + 为多 worker 并发铺路。零业务风险,纯加固。 - token_budget 死代码激活(≤2 天):orchestrator.rs:130-148 预算逻辑已实现,仅需 chat_handler.rs:225 从 config 读取角色配额(患者 8k/医生 16k)传入,让既有护栏生效。
- 真实 usage 灌入非 chat 路径(≤5 天):provider TokenUsage 上抛 + analysis.rs 收尾调 log_usage + CostService 标 is_estimated,让成本看板从假数据变真相。
- 引用完整性校验 MVP(≤5 天):worker 完成分析时遍历
[ref:id]校验存在性,broken 标记 + 降级 confidence(前端灰显),无需新表新迁移。
五、主题级风险
- 自主 AI 成本失控:worker 持续消耗 Provider 配额。→ 必须先接举措 4 配额/熔断再放举措 1 全量。
- 医疗 AI 幻觉危及患者:结构化建议被医生采纳进入临床决策。→ 引用溯源闭环(举措 3)+ evidence_strength 灰显 + 前 2 周「只读不推」模式 + 法务审文案。
- PII 通过 tool_call 外泄:患者数据二次喂外部 Provider。→ SanitizationService 强脱敏 + Provider zero-retention + 记忆 value 加密。
- LLM-judge 自身幻觉:评估闭环把质量门禁交给可能幻觉的模型。→ 三层防线(规则硬门禁 + LLM-judge 仅 ambiguous + 人工 5% 抽审)。
- AI 产出洪泛:risk_service 每天对所有高危患者刷一遍会爆 insight 表。→ 同患者同 insight_type 24h 去重 + 只读不推过渡期。
- 患者信任度低:中老年对机器提醒信任低于医生口头医嘱。→ 定位「辅助提醒」非「诊断建议」+ 文案法务审核 + 严格限频。
- 评估集冷启动 + 过期:前 1-2 月反馈量不足;季度不刷新则失真。→ 初期只做引用完整性校验不做质量评分;建季度刷新机制。
六、专家分歧调和(最终取舍)
- AI worker vs 死信重试是否合并 → 分开 + 共享 spawn 骨架。采纳医疗产品经理/MLOps 观点:基础设施层(死信 100% 投递、无业务语义)与业务层(AI 可降级、可限流、可灰度)的 SLA/迭代节奏/监控指标完全不同,强行合并会让 AI 业务被基础设施稳定性拖死。但抽取通用「spawn + interval + graceful shutdown」框架避免重复造轮子(反模式合规)。
- 患者侧 LLM 对话 → 不上。三位中两位明确反对,符合「用户驱动非技术驱动」原则;患者侧坚持规则引擎 + 模板。
- 患者记忆存储 → 结构化 key 明文 + 敏感 value 加密。调和安全(可审计/可查询)与隐私(PII 保护),自由文本不入库。
- LLM-judge 可靠性 → 三层防线。规则引擎兜底关键医学禁用词,LLM-judge 仅处理 ambiguous,人工抽审 5% 校准。
- RAG 评估 vs 补 E2E 优先级 → 并行。AI 输出正确性(举措 3)与 UI 可点性(属测试主题)风险类型不同,医疗幻觉比少几个 E2E spec 更致命,但两者不互斥,分头推进。
- 商业化时机 → 延后。等建议转化率 KPI(举措 5)跑通 2-3 个月、医护采纳率稳定后再议按次计费。
七、路线图(与项目 9 维度 Phase 对齐)
- Phase 1(1-3 月):举措 1(P0+P1 接线闭合)+ 举措 4(P1 成本真相化)+ 速赢 1-3。兑现「至少 1 条健康告警→AI 评估→推送」完整链路。
- Phase 2(3-6 月):举措 1(P2 韧性)+ 举措 2(FC + 双层记忆)+ 举措 3(P1 引用闭环 + P2 评估集)+ 举措 5(P1 建议转化)。从「被动工具」跨到「主动关怀引擎」。
- Phase 3(6-12 月):举措 3(P3 CI 门禁)+ 举措 4(P2 能力矩阵)+ 举措 5(P2 患者触达 + 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 命中。论断可追溯。