# 主题 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 从「医生敲回车才出报告的分析工具」进化为「感知→推理→行动→复盘」的主动关怀引擎—— 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_failed(retry_count20 条触发 `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_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。 - **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 周可落地) 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 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 命中。论断可追溯。