项目

体检报告流水线 AI 助手

一个面向连锁体检机构的报告流水线 AI 项目,覆盖智能推项、科普、建议和矛盾识别四类生成任务。

  • Python
  • vLLM
  • GPT-OSS 120B
  • Coze
  • SSE
  • ThreadPoolExecutor
  • Prompt Engineering
围绕智能推项、科普、建议、矛盾识别 4 个生成场景做工程化拆分推项链路加入本院项目库反查,避免不存在的项目编码和价格透传矛盾识别采用 4 路并发和三段式 LLM 链,并沉淀 13 个假矛盾豁免案例用规则集稳定医疗文书风格,而不是依赖 few-shot 示例

这个项目服务于某年服务数十万体检场次的连锁体检机构客户。它不是一个面向 C 端的聊天助手,而是一组嵌入体检报告流水线里的生成链路:体检前做智能推项,报告阶段生成科普和建议,同时检查报告内部是否存在明显矛盾。

我在这个项目里更接近参与和维护部分链路的工程角色,而不是从 0 到 1 主导整套系统。下面这页也按这个边界来写,只展开我能确认的模块、规则和取舍。

问题定义

这个项目真正难的地方,不是“让模型写点医学文本”,而是让输出能进入正式报告流程。

  • 推项结果必须落到机构真实可挂、可计费、可展示的项目库,不能只给一个看起来合理的名字。
  • 科普内容不能越界,尤其不能出现承诺式、安抚式表述,削弱用户继续检查或随访的必要性。
  • 建议内容要像机构医生写出来的报告用语,而不是聊天机器人式回复。
  • 矛盾识别不能只做字符串对比,很多看起来不一致的描述,在医学上其实可以共存。

上一代系统里,单份“科普 + 建议”仍然由医生人工撰写,平均要花约 3 分钟。客户量级一上来,问题就变成了如何把这些环节拆成可控、可复核、可持续迭代的工程链路。

架构与模块

整套流水线里,可公开的核心模块有四类。

智能推项

推项没有直接让模型吐最终项目,而是拆成了几段:

  1. 先生成健康情况和推荐思路。
  2. 从自然语言里抽取项目名。
  3. 并发调用检索类子工作流,找机构已有项目。
  4. 把推荐结果映射到本院项目字段。
  5. 最后由 quality_control 回查项目库,对不上就清空关键字段。

这里的重点不是让模型“会推荐”,而是宁可少展示,也不能让虚构的 projectId、项目编码或价格继续往下游透传。

科普与建议

科普和建议都不是一份固定 prompt,而是配置驱动的生成链路。工程上保留了不少硬规则:

  • 科普侧有 5 条强禁词,用来拦住承诺式和过度安抚式表达。
  • 建议侧只允许三类输出:专科就诊、进一步检查、复查。
  • 一条建议只能归属一个科室。
  • 复查时间区间取最短,数字统一用阿拉伯数字。
  • 急诊科被显式排除。

这些规则的价值在于把文书风格收紧,让输出更像机构报告,而不是像开放式问答。

矛盾识别

矛盾识别走的是 4 路并发设计:科间、科间性别、科内、历史。历史分支后来因为长上下文注意力稀释问题被注释禁用。

每一路内部又分三段:

  1. 先做自然语言分析,找可能冲突的点。
  2. 再提取结构化 JSON,方便系统消费。
  3. 最后走二次审核和豁免,把医学上可共存的差异排除掉。

这条链路里沉淀了 13 个具名假矛盾豁免案例,还专门处理了血压复测这类容易误报的规则场景。

工作流平台取舍

项目早期试过把更多逻辑塞进 Coze 工作流,后来又回到“vLLM 主推理 + Coze 只做检索类子任务”的组合。原因很现实:这个业务最复杂的部分不在节点编排,而在推荐贴合度、业务边界和误报控制。再加上客户内网部署时,Coze 代码节点沙盒冷启动约 3 秒/次,工作流层本身也开始变成延迟来源。

我负责的部分

能确认写进项目页的部分主要有这些:

  • 参与并维护过智能推项、科普、建议、矛盾识别四类生成链路的工程复盘和规则梳理。
  • 梳理并保留了推项链路里的“思考、抽取、检索、映射、质检”分段设计。
  • 梳理 quality_control 对模型输出项目字段的反查逻辑,对不上机构项目库就清空关键字段。
  • 梳理矛盾识别的 4 路并发、三段式 LLM 链、5 次 JSON 重试和 13 个豁免案例。
  • 梳理科普和建议里的 prompt 约束,包括禁词、三选一、急诊科排除、时间表达和科室归属规则。
  • 参与总结从 Coze 重工作流思路退回到“主推理 + 检索子任务”的工程取舍。

这里没有把医生规则、客户判断或全部团队实现写成个人成果,这是我刻意保留的边界。

难点与处理

第一类难点是幻觉不能直接进报告。
推项链路最后一定要回到机构项目库做反查。对不上的字段直接清空,会牺牲一部分召回,但能把风险挡在展示层之前。

第二类难点是长 prompt 会稀释模型注意力。
矛盾识别的结构化阶段用了最多 5 次 JSON 重试,并把上轮输出累积回上下文。这做法不优雅,但在当时模型和算力条件下,比单次失败后直接放弃更实用。

第三类难点是医学文书的“像不像”不能只靠 few-shot。
这类场景里,示例很容易把具体疾病、部位和数值一起带偏,所以项目更依赖规则集来锁风格,比如阿拉伯数字、单条建议单科室、时间区间取最短等。

第四类难点是误报处理很难一次性抽象干净。
矛盾识别最后还是沉淀成了白名单式豁免案例。它不够优雅,但能把真实线上误报收敛成工程规则,先解决业务问题。

后续计划

从这次可公开复盘暴露出的边界看,这个项目后面还有几件事值得继续做:

  • 继续把规则层和模型层拆开,减少 prompt 版本迭代带来的回归面。
  • 给矛盾识别补更稳定的结构化输出约束,降低多次 JSON 重试的依赖。
  • 重新评估历史矛盾分支是否能在更合适的上下文管理下恢复。
  • 把工作流平台只保留在真正适合的检索型子任务里,避免把编排本身做成新的复杂度。

这个项目给我的一个长期判断是:医疗类生成系统里,真正决定能不能上线的,往往不是模型会不会写,而是规则、校验、边界和回退机制够不够扎实。

如果你正在做企业 RAG、知识库、AI 客服或 Agent 工作流,可以通过页面下方微信二维码、邮箱 contact@aildnc.com,或访问 aildnc.com 沟通。

联系

预约一次 30 分钟技术诊断

正在评估企业知识库、AI 客服或 Agent 工作流时,可以先发问题背景。我会先帮你判断是否值得做、怎么做,以及主要风险在哪里。

微信二维码 优先加微信沟通