AI 学习闭环 — 当前全景

从规则输入到反馈回流的完整流程,以及还缺什么。

一句话总结:系统有两条并行学习线 — 显式规则(您主动添加的临床知识)和 隐式人格(从您的编辑中提炼的行文风格)。人格线按设计就只学风格,所以当 LLM 把您的编辑识别为"事实修正"时会被有意丢弃。这就是真正的缺口所在。

完整闭环图

下图展示从"规则进入"到"建议回流"的 5 个阶段。绿色=已上线,橙色=部分/半成品,红框虚线=未建。

① 输入 — 8+ 种入口
手动文字
直接输入规则
AddKnowledge
文件上传
PDF/Word/图片
LLM 抽取要点
URL 导入
粘贴网页
自动抓取正文
拍照 OCR
相机/相册
结构化
语音(新)
腾讯医疗 ASR
小程序录音
引导问卷
3 情景 → persona
新医生首次
persona 教学
按例子教风格
/settings/persona/teach
WeChat 命令
add_to_knowledge_base
微信公众号
"保存为规则"(编辑→KB 桥)
医生改完草稿/诊断,UI 弹出"保存为规则",调 teaching_handlers.py:25teaching.py:81 → 写入 doctor_knowledge_items。已上线:草稿回复路径。半成品:诊断审核路径(后端发 teach_prompt,前端不展示)。
② 结构化 — LLM 解析为候选
规则抽取 LLM
voice_to_rule / 文件抽取 prompt
输出:{content, category}
医生确认
候选卡片:保存 / 修改文字 / 重说
人工把关,不自动落库
③ 存储 — 两张表(双轨,按设计分工)
doctor_knowledge_items(显式规则)
您主动教的临床规则。
字段:content、category、reference_count、seed_source、confidence
分类:custom / diagnosis / followup / medication
doctor_personas(隐式人格·按设计仅限风格)
AI 模仿您的行文方式,不存临床内容。
字段:reply_style / closing / structure / avoid / edits
Prompt 规定:只接受 style 类,factual/context_specific 明确排除
④ 检索 — 喂给 AI(无 RAG,全量打分)
候选池
按 updated_at 降序
上限 30 条
token 打分
jieba × source_weight × confidence
doctor=0.5 > imported=0.2
取 top 5
字符软上限 6000
5 分钟内存缓存
注入 prompt
第 4 层 = KB,第 5 层 = persona
诊断 / 回复 / 随访 / 摘要
⑤ 回流 — 使用 → 计数 → 反学习
LLM 输出 [KB-N]
建议里内联标注
前端点击查看原文
citation_parser
正则抽取 [KB-N]
去重 + 幻觉检测(只打日志)
usage_log 写入
reference_count += 1
在 LLM 输出时计数,非"被医生采纳"
医生编辑(已捕获)
草稿/诊断 both 写入 DoctorEdit
diagnosis_handlers.py:244
persona-classify LLM
仅草稿编辑触发
诊断编辑只发 teach_prompt
persona_pending_items
pattern_hash 去重 + 90 天抑制
accept 只能写 persona,不能写 KB
⑥ 缺失 — 尚未接通的信号
事实类编辑被丢弃
persona-classify 识别为 factual / context_specific 时,persona_learning.py:32 直接 return
最密集的临床判断信号被有意丢弃
诊断审核 teach_prompt 半成品
后端已发 teach_prompt,ReviewPage.jsx:267 不读取
UI 没"保存为规则"按钮
幻觉引用不暴露
citation_parser.py:55 只打警告日志
医生看不到"AI 引用了不存在的 KB-X"
拒绝反馈
AI 引用被拒绝时不追溯到 KB-N
AISuggestion.decision 存了信号但没读模型
规则健康仪表盘
没有 per-rule 使用/编辑/拒绝比例
没有"淘汰机制"

两条学习线的分工

显式线

doctor_knowledge_items — 您教给 AI 的临床规则

  • 来源:您主动添加(文字/文件/URL/拍照/语音/WeChat 命令),或通过"保存为规则"从编辑里沉淀
  • 内容:临床规则 — 诊断逻辑、用药禁忌、随访频率
  • 触发编辑→KB 的路径:草稿回复已上线,诊断审核半成品(后端发 teach_prompt,前端不响应)
  • 引用方式:[KB-N] 标注 → 点击看原文
  • 分类:通用 / 诊断 / 随访 / 用药
隐式线

doctor_personas — AI 偷学您的风格(按设计仅限风格)

  • 来源:仅草稿编辑触发 persona-classify LLM 分析
  • 内容:行文风格 — 称谓、结语、结构、避讳
  • 按设计排除:事实修正、情景特异性判断 — prompt 明确标注"不要归入 persona"
  • 引用方式:作为第 5 层 system prompt,不显式引用
  • 字段:reply_style / closing / structure / avoid / edits
关键澄清:persona 只学风格是有意的架构选择,不是 bug。硬规则放 KB,风格放 persona — 两者互补。真正的缺口是:当 LLM 把您的编辑识别为"事实修正"时,这条信号没有第二个收集器,直接丢掉。

当前已建 vs 缺失(清单)

能力状态说明
8+ 种规则输入入口已上线文字 / 文件 / URL / 拍照 / 语音 / 引导 / persona 教学 / WeChat 命令 / 编辑→KB
LLM 结构化抽取已上线voice_to_rule / 文件 / URL 各有 prompt
KB 全量检索(非 RAG)已上线30 候选 × jieba × 来源权重,top 5,字符上限 6000
[KB-N] 引用标注已上线前端点击可弹窗看原文
引用次数统计已上线reference_count + usage_log 流水(LLM 输出时计数)
编辑→KB 桥(草稿)已上线teaching_handlers.py:25 + "保存为规则"按钮。注意:teaching.py:107 写入时 source="teaching",在检索打分里走 0.2 权重(非 doctor 的 0.5),排序上会低于手动添加的规则
编辑→KB 桥(诊断)已上线 2026-04-16ReviewPage.handleDecide 读取 teach_prompt,Snackbar 提示保存;后端 diagnosis_handlers.py:244 原本的 teach_prompt 现在有 UI 接收
草稿编辑→人格学习(仅风格)已上线draft_handlers.py:424 触发 process_edit_for_persona
人格候选卡片审核已上线pattern_hash 去重 + 90 天拒绝悬挂
事实类编辑的学习路径已上线 2026-04-16process_edit_for_learning 路由 type=factual → kb_pending_items;审核通过写入 doctor_knowledge_items
幻觉引用暴露给医生已上线 2026-04-16hallucinated_citations 表 + /api/manage/kb/hallucinations 端点 + Knowledge 页 banner
拒绝→KB 归因已上线 2026-04-16AISuggestion.cited_knowledge_ids 列 + rule_health 聚合 decision 分布
规则健康仪表盘已上线 2026-04-16GET /api/manage/knowledge/{id}/health + KnowledgeDetailSubpage 四列统计
冷启动加权未建候选<5 条时 source_weight 总是拿 top 5,无相关性阈值
规则过期 / 冲突检测未建无 expires_at,两条矛盾规则都会被引用
危险信号检测未建规划中:患者消息异常 → 自动置顶

真正的 4 个缺口(按优先级)

缺口 ①:事实类编辑被悄悄丢弃。 已修复 2026-04-16
LLM 在 persona-classify.md 中已被明确告知将临床事实修正归为 factual/context_specificpersona_learning.py:27-34 随即 early-return,信号进垃圾桶。这是整条闭环里最严重、成本最低、收益最大的缺口 — LLM 已经做了分类,只是下游没人接。
已实施:persona_learning.py 重构为 process_edit_for_learning,新增 kb_pending_items 表 + KbPendingItem ORM,_route_to_kb_pendingtype=factual 时路由并执行 PII 脱敏。审核 UI 在 /settings/knowledge/pendingFACT_LEARNING_ENABLED 环境变量可关闭。
缺口 ②:诊断审核编辑 teach_prompt 是半成品。 已修复 2026-04-16
后端 diagnosis_handlers.py:244-270 已经为诊断编辑发 teach_prompt,但 ReviewPage.jsx:267-282 忽略这个字段,UI 没"保存为规则"按钮。
已实施:ReviewPage.handleDecide 现在读取 decideSuggestion 响应里的 teach_prompt + edit_id,触发 Snackbar 提示"保存为知识条目?",确认后调 api.createRuleFromEdit。行为与草稿回复路径(TaskPage)一致。
缺口 ③:规则健康没有可见性。 已修复 2026-04-16
reference_count 记录的是被引用次数(LLM 输出时就 +1),不是被采纳次数。
已实施:AISuggestion 新增 cited_knowledge_ids 列并在 diagnosis_pipeline 创建建议时填充。新增 GET /api/manage/knowledge/{id}/health,聚合 ai_suggestions + message_drafts 两侧的 cited / accepted / edited / rejected 四元组(含最近 30 天窗口)。KnowledgeDetailSubpage 渲染四列统计条(采纳绿 / 编辑黄 / 拒绝红),仅在 cited_count > 0 时显示。
缺口 ④:幻觉引用只进日志。 已修复 2026-04-16
citation_parser.py:55 检测到 AI 引用了不存在的 [KB-N] 时只 warn。医生看不到这个信号,无法纠正 prompt。
已实施:新增 hallucinated_citations 表 + log_hallucinations helper;draft_reply 和 diagnosis_pipeline 两条路径都会持久化。新增 GET /api/manage/kb/hallucinations?days=7,Knowledge 页顶部出现橙色 banner "AI 最近 7 天引用了 N 条不存在的规则"。

推荐实施顺序(经 2 名评审员一致)

步骤行动改造量为什么这个顺序
1persona_learning.py:32 的 fact 分支丢弃(缺口 ①)已完成 2026-04-16LLM 分类已经能用,只差路由;复用现有 pattern_hash + 90 天抑制基础设施
2把诊断审核编辑接入 teach_prompt UI(缺口 ②)已完成 2026-04-16后端已发信号,前端几行的工作;先完成半成品再扩面
3幻觉引用暴露(缺口 ④)已完成 2026-04-16独立于其它步骤,安全相关收益快;citation_parser.py:55 信号已存在
4规则健康仪表盘(缺口 ③)已完成 2026-04-16前置:在 AISuggestioncited_knowledge_ids,把 reparse-free-text 改成结构化;否则诊断侧归因做不出来
前置条件:在触碰这条闭环之前,补一条集成测试覆盖 decide → edit → classify → pending → accept → render。LLM 步骤当前失败时只打日志,回归会无声无息。此外建议把 cited KB ids 结构化存在 AISuggestion 上,避免在多个地方反复从文本里正则抽取。
相关页面: 知识库基础   AI 如何工作   更新计划