为什么大模型会被"多诊断卡住",而证据树能做到步步为营
先抛个问题:临床上一个复杂病例,通常牵涉到呼吸系统、肾脏、血液、免疫、神经好几个方向,每个专科都在给建议,主治医师要权衡十几个检查结果、排除掉七八个鉴别诊断。这套推理过程,人类医生需要好几轮会诊,那让大模型一口气直接做呢?实测下来很稳的大模型,在处理这种长链条任务时,大概率会在中间“漂移”掉——前两步还合理,第三四步就开始一本正经地编理由了。
我过去做AI辅助诊断Demo时也踩过类似的坑。单智能体直接读病历输出结论,表面看格式完整、条目清楚,但追问一句“这个结论的支撑证据链是什么、为什么排除另一个可能”,模型就开始含糊其辞。这个问题不是靠堆参数能解决的,而是要把“推理过程本身”拆开、结构化和可追溯。
所以后来我把方案改成了“证据树+多智能体协同”的架构。简单说,就是把一个复杂诊断任务拆成多轮、多角色、节点化的推理链条,每个智能体只负责自己熟悉的环节,所有结论挂在证据树上,环环可溯、层层可查。这篇文章就是基于我实际折腾这个方向的过程写下的,讲清楚它解决了什么问题、怎么设计分工、证据怎么流转,以及落地过程中那些避不开的坑。
不管你是做AI医疗产品、临床科研,还是想在公司内部搭一套复杂决策推理框架,这篇文章能帮你把“多智能体”和“可解释推理”从概念落到工程实现。
1. 内容整体设计与思路拆解
1.1 单一智能体为什么扛不住复杂诊断
医疗诊断跟普通问答最大的差异,在于它是一棵决策树,不是一个解。病人进门说“乏力、发烧两周”,你脑海里要先冒出八九个候选方向(感染?自身免疫?肿瘤?内分泌?),然后每一个方向都对应一整套检查路径、风险分级和禁忌判断。
这个大前提决定了:如果你把全部病历丢给一个大模型,让它直接生成最终诊断,等于要求一个聪明但没有分工的“全能助理”一次性做完全院的会诊工作。它既要提取症状,又要看懂实验室指标,还得做影像学判断、考虑用药冲突、评估危急值。信息种类太多、噪声太大,单一模型很容易出现两个问题。
第一个问题是注意力被稀释。重要信息隐藏在几百行病历文本里,模型很难一上来就锁定关键矛盾。比如说一位病人既有中度贫血、又有反复发热、还有肺部间质改变,这三个信息分开看都不像会指向同一类病,但放在一起往往就高度提示系统性红斑狼疮。单模型容易抓住发热和贫血,却把肺部改变当成不影响诊断的伴随现象,方向直接就歪了。
第二个问题是推理链条过长后发生“记忆坍塌”。多步骤推理需要在前面的结论上继续往前走,而Transformer架构对长上下文里局部信息的保持并不是无限稳定的。只要中间某一步的一个判断偏了,后面所有结论都会像多米诺骨牌一样跟着倒。最要命的是,你很难定位是哪一步开始错的——这就是黑盒。
1.2 多智能体分工是流程再造,不只是“多喊几个模型”
我一开始也天真地想过:既然单模型不行,那我同时调用三个大模型,让它们对同一份病历分别诊断,然后投票取多数。结果发现这完全没用——三个模型接受同样的输入,很可能产生同样的错误,投票只是把幻觉美化了。
真正有用的做法是流程再造,把医学诊断的线性路径重新组织为分工协作:一套多智能体系统模拟的是医院里松散耦合的科室协作机制,而不是大模型比赛。具体来说,我用六个智能体来拆解这个任务:
- 信息采集智能体:从病历原文中抽取就诊信息、主诉、现病史、既往史、检查结果等结构化要素。
- 影像判读智能体:负责影像特征识别与病灶定性,处理CT、MRI、X光等报告文本。
- 检验分析智能体:分析血常规、生化、免疫标志物、病原学结果,比对临床参考区间和变化趋势。
- 鉴别诊断智能体:基于已知信息生成鉴别诊断候选列表,覆盖在同一综合征下的主要可能性。
- 风险监控智能体:跟踪疑似高危线索——如发热伴随意识改变、急腹症伴随低血压,同时评估每个结论的临床紧急度。
- 方案整合推理智能体:汇总以上产出,综合证据权重,推理最终诊断结论与建议下一步检查。
关键点在于:每个智能体的输入不仅是原始病历,还包括前置智能体已经完成的结构化产出。信息采集智能体把患者数据整理成统一结构,检验分析智能体读取这些结构化数据,再将结论传给鉴别诊断智能体。这就是“流水线架构”,每名参与者只处理自己擅长的那一段。
1.3 证据树,一棵能让诊断“反悔又自洽”的树
多智能体解决的是分工问题,证据树解决的是“依据和追溯”问题。
证据树不是聊天记录,也不是简单的JSON输出,而是一个有向无环图结构,节点的含义有多层:最底层是原始证据(症状、检查值、病史),中层是从证据推出的初步判断,顶层是综合这些判断形成的诊断结论。每条边都表示一条推理关系,负向、正向、未知关系都能表示。
举一个我在模拟项目中用过的例子。患者的血红蛋白72g/L,证据树底层有一个节点是“Hb 72”,旁边挂上“疑似中度贫血”;如果此时又有一个节点“网织红细胞比例显著降低”,两个底层节点共同指向“骨髓造血功能低下”这个中层结论;同时,“抗核抗体阳性”“发热”“面部红斑”几个节点又指向“自身免疫病可能性”。直到最后,顶层节点才汇聚成“系统性红斑狼疮伴溶血性贫血”的综合诊断。
这样的树结构最大的好处是什么?是能允许推理过程“反悔”。医生面对复杂病例时,大脑会不断生成候选假设、不断推翻旧判断。普通大模型一旦说出一个结论就很难自己纠正,因为它没有一条清晰的路径来“反向操作”。而证据树天然支持增删节点、更新边、改变置信度,某个新检查结果一进来,整棵树的权重分布可以重新洗牌,所有后续智能体都能同步看到变化。
2. 智能体角色定义与核心分工拆解
2.1 六个角色的输入、输出和难言之隐
一张表能说明白这六个智能体各自到底在做什么:
| 智能体 | 核心职责 | 输入内容 | 输出内容 | 主要难点 |
|---|---|---|---|---|
| 信息采集 | 结构化病历、去噪声 | 自由文本病历 | 结构化患者画像、症状清单、检查结果表 | 病历文本冗长、缩写多、口语化表达 |
| 影像判读 | 影像特征识别 | 影像报告文本 | 病灶性质、位置、特征描述标签 | 影像术语与临床术语的映射 |
| 检验分析 | 实验室指标解析 | 检验数值与参考区间 | 指标异常列表、趋势判断、潜在相关方向 | 联合异常模式的识别 |
| 鉴别诊断 | 候选疾病生成与排序 | 各智能体结构化产出 | 候选诊断列表与置信度排序 | 候选项过多且相互关系复杂 |
| 风险监控 | 病情危重信号预警 | 实时更新的证据树节点 | 紧急度评分、预警信号、需优先处理项 | 冲突信号难以量化 |
| 方案整合 | 综合结论与建议 | 完整证据树 | 最终推理结论、建议检查、解释报告 | 证据权重校准 |
2.2 信息采集智能体:从“病历原文”到“结构画像”
信息采集智能体是整个证据树的入口,但也是最容易被低估的一个角色。真实病历和教科书病历差别太大了:有的医生写字习惯用简写,有的数据记录在表格里,甚至夹杂大量无关的既往病史,比如“30年前行阑尾切除术”这类信息,很多时候对当前诊断毫无帮助。
我踩过的一个坑,是最开始让信息采集智能体直接输出“纯抽取式摘要”而忽略了数据归属。比如病历里有两处血红蛋白数据,一次是入院时,一次是治疗后复查,两次数值变化趋势不同,单纯抽取不保留时间线信息,后续检验分析智能体就误判成了矛盾数据。后来我在采集层的输出结构里强制加入“事件时间线”字段,每一次检查结果带上时间戳,后续智能体就能看见数据的前后变化,而不是把两份结果当成同一个时刻的平行信息。
2.3 检验分析智能体的“联合异常模式”识别
检验分析智能体最容易做浅——只单挑异常指标异常的地方解释一下,忽略指标之间的联动关系。其实复杂诊断的精华,恰恰在“看似无关的几个异常同时出现指向同一个病”。
在模拟项目X中,我遇到一个病例:血常规显示白细胞不高,CRP升高,ANCA阳性,尿常规有蛋白尿。如果单独看每一项,都很普适——CRP高可能是感染,ANCA阳性也可能出现在多种血管炎里。但把这几个联合在一起时,指向的系统性血管炎伴肾损伤的可能就大幅上升了。
检验分析智能体的核心能力,应该是在知识库中搜索“指标联合模式”。我在实际操作中给这个智能体加了一层检索增强生成(RAG),每分析一个指标组合,它就去查一次医学知识库中的关联疾病簇,把查到的置信度映射到证据树节点上。这也顺带缓解了大模型知识“停留在训练截止日期”的问题——至少知识库里的最新指南它能补充进来。
2.4 鉴别诊断智能体的排序矛盾与平衡
鉴别诊断智能体几乎是最难调教的一个。它的问题是:如果不限制候选列表长度,它能一口气给你列出十几个可能;如果限制了,就可能漏掉虽然概率小但危险性极高的病种。
我采用过一个比较笨但实际有效的方法:不做单一排序,而是让鉴别诊断智能体按“概率组”输出。第一组是“高概率常见病”,第二组是“低概率但高危病”,第三组是“罕见但特征符合病”。这三组在证据树上分别挂上不同颜色的节点类型。这样,最终方案整合智能体和医生看到候选列表时,不会因为“罕见病排在最底下”而被忽略。
这个方法来自我一次很沉痛的教训。有回我调模型诊断一个疑似结节病合并多发关节炎的模拟病例,模型在候选列表里确实提到了“结节病”,但排在第十位,注释也不痛不痒。人类医生一看前十位全是常见病,默认罕见方向被低估,直接失去了对病例研究中最有价值的诊断线索。所以排序策略本质上不是技术问题,而是临床优先级问题。
3. 证据树的构造、流转与剪枝逻辑
3.1 证据树的三类节点与四层深度
证据树我建议明确区分三类节点,而不是让所有信息都挤在一起:
- 原始证据节点(Leaf):直接从病历或检查结果中提取的事实,如“发热大于38度持续两周”“抗dsDNA抗体阳性”。这类节点没有加工过,是树的基础。
- 推断结论节点(Inference):由智能体基于一个或多个原始证据节点推理出来的中间结论,如“可能存在活动性免疫反应”。
- 得到最终诊断节点(Decision):综合多个推断结论后形成的顶层判定,如“符合系统性红斑狼疮诊断标准”。
深度方面,我的经验是控制在第四层左右。四层深度的结构对应“原始信息-->单系统结论-->跨系统综合-->最终诊断”,这也是临床医生最自然的思路。如果树太深,中间节点过多,不仅计算冗余,而且容易产生虚假的推理链,看起来每一步都对,合起来却是一本正经的胡说八道。太浅则失去拆分意义,变成把一堆证据直接怼到一个结论上。
3.2 多智能体之间的“黑板”式协作机制
要让六个智能体在证据树上协同工作而不是各自为政,我用的是一种比较经典的机制——黑板架构。所有智能体不直接相互调用接口,而是把各自的产出发布到一张共享的“黑板上”。黑板就是证据树,它既存原始数据,也存每个智能体的中间判断。
实操中我在每个证据树节点上额外挂两个元数据字段:来源智能体和更新时间。当一个智能体在节点上做了更新,依赖该节点的下游智能体会立刻收到事件通知,重新评估自己的判断。这样做的一个巨大好处是:不用做复杂的消息队列和智能体编排DAG,数据流本身就是控制流。
这里要特别说明一点:不是所有智能体都需要等待所有上游完成才能启动。比如风险监控智能体,只要原始病历一进来,即使影像判读还没完成,它也会最先扫描“高热+意识模糊”这类组合急症信号。这也是我强烈建议把风险监控作为独立智能体独立轮询的原因——危重信号的响应不能受到其他智能体处理速度的拖累。
3.3 剪枝与置信度校准:一张“会自己纠错”的树
证据树如果不管理,树冠会疯狂生长。每个异常指标都生成两三个推论的中间节点,每个中间节点再生成几个分支假设,最后树大得连自己是谁都看不清。这就必须引入两种机制:剪枝与置信度校准。
剪枝逻辑我用的总原则是**“下层矛盾优先于上层推测”**。当一个原始证据节点直接推翻了某个中间结论时,不管这个中间结论还挂了多少漂亮的子分支,直接连同分支一起剪掉。模拟场景里,如果病人的ANCA检测结果为阴性,那么之前“抗中性粒细胞胞浆抗体相关性血管炎”这条分支上的所有推理节点,都应该立刻标记为失效,而不是继续堆在前面。
置信度校准则是确保每个节点在更新时重新评估。我用一个简单的公式计算管理:
[ P_{\text{node}} = 0.6 \times P_{\text{prev}} + 0.3 \times P_{\text{new_evidence}} + 0.1 \times P_{\text{neighbor_consistency}} ]
权重分配是经验值,核心逻辑是:新证据影响力较大但不应完全取代已有判断,同时还在参考相邻节点的一致性,让孤立异常不会立刻扳倒大局。这套方法虽然朴素,但在实测里让诊断准确性提升了不少,关键是每个节点都有解释依据,不会出现“不知道这个置信度怎么来的”。
4. 实操过程中的经验教训排查地图
4.1 证据丢失与溯源断裂问题
多智能体架构最典型的问题,就是证据在流转过程中丢失。智能体A输出了“考虑系统性血管炎可能”,智能体B拿到这个结论后直接把它当作原始证据继续推导,完全没有追溯“为什么考虑”——树的底层节点在中间环节被“缩写”了,整个推理链条就成了无根之萍。
我排查后发现根源是智能体的输入提示词里没要求保留证据ID引用。后来我在所有下游智能体的输入模板里加了强制规范:每个结论必须附带证据树节点ID数组。这不算精巧的技术方案,但极其管用,它强迫每个智能体在断言前先看清楚自己“站在谁的肩膀上”。
4.2 置信度虚高与“模型自信病”
做这套系统最常遇到的另一个问题,是大模型的自报告置信度极其不可靠。模型说出“我认为有85%的可能性是狼疮”的时候,你根本不知道这个85%到底意味着什么,更致命的是——它反复验证后也不变。
我试过几种校准策略,其中最好用的是“多人一致性仲裁”。做法是把同一个关键中间结论给三个不同的智能体,让它们分别独立验证,若三方都认定,置信度才计为高。后来还用到了“对抗式验证”,专门给一个智能体发指令“试图推翻这个结论并给出理由”,如果推不翻,那么结论的稳定性会明显提高。这招尤其适合用于风险监控和最终诊断环节。
4.3 信息孤岛:智能体们各自为战
如果架构设计不好,六个智能体很容易变成六个孤岛——采集智能体不懂检验数据的含义,分析智能体看不到病历文本的上下文,整合智能体手里一堆结论却没办法回溯到原始事件。
这个问题的解法只有一个字:链。所有智能体都要能“向上回看”底层节点。我在项目里采用的方案,是给证据树加一个统一的接口服务,每个智能体都能随时按照节点ID查询“这个判断的依据到底是什么”。这样做不仅消除了孤岛,也大幅降低了排障难度。每次诊断结果出问题时,我能沿着节点ID精确地定位到是哪个智能体、哪条数据导致了偏航。
4.4 面向医生用户的设计:别用机器学习黑话
技术落地真正的临界点不在模型精度够不够,而在于使用者相不相信。再好的证据树,如果最终给医生的报告仍然是满屏的节点结构、置信度分数和推理规则,那天性怀疑的医生们大概率会把这个工具扔在墙角。
我的实践心得是:证据树的呈现必须翻译成临床决策的语言。最终报告要有“一句话结论”,然后是“支撑证据一览”和“待排除诊断”,以及“建议补充检查”。整棵证据树可以作为附件存在后台,而不是展示在前端界面上。人不像机器需要看树的细节,人只看树的影子——要点、依据和下一步。
5. 落地建议:什么样的场景才真需要这套方案
5.1 不该用多智能体的场景:简单症状和单系统疾病
别误会,不是所有医学AI场景都需要证据树。对于“急性扁桃体炎伴发热”这种单一系统、证据链很短的疾病,多智能体不但没有优势,还增加了系统复杂度和推理延迟。本来一个模型10秒就能出正确建议,你偏要四个智能体轮流跑一遍再开会讨论,耗时不说,中间还有产生矛盾的额外风险。
我给自己定过一个选型原则,符合以下情况才上多智能体+证据树系统:
- 症状跨多个系统(同时涉及呼吸、免疫、肾脏、神经等);
- 诊断候选超过5个且包括罕见的潜在病种;
- 证据之间存在明显矛盾或时间演变;
- 诊断结果直接影响高风险治疗决策(如免疫抑制方案、手术预案)。
5.2 模型选型:推理能力与工具调用缺一不可
多智能体系统的效果高度依赖基础模型的三个硬指标:
第一是长上下文稳定性和信息保留能力。因为智能体要反复阅读其他智能体的输出,上下文窗口里塞满了多个环节的中间结论,模型容易“忘前文”。这一点上,实测当中上下文越长、信息越繁复,模型表现差异就越明显,越需要选择上下文保持能力强的模型。
第二是函数调用能力。智能体要访问证据树中的特定节点、更新置信度、调用检索工具,如果模型不能稳定输出结构化的函数调用,架构就会频繁“翻车”。我在早期用某个模型时,它经常在应当调用查询工具的时候直接自己编一个答案,这类幻觉靠提示词压制基本无效,只能在源头替换或更换模型才能解决。
第三是结构化输出稳定性。医疗场景必须使用结构化输出,证据树节点字段定义很严格,不能允许模型自由发挥。我会为所有智能体强制设定response_format为JSON模式,并且用JSON Schema校验器在出口处做硬校验,不符合格式的结果直接丢弃并重试,绝不让脏数据进入证据树。
5.3 部署形态与隐私合规:该私有化的千万别省
医疗数据对隐私和合规要求极严格,这决定了部署形态不能像普通互联网应用那么随意。如果目标是辅助临床决策,模型的推理过程难免涉及可识别患者信息,那么本地化或私有化部署几乎是唯一合理选择。云端SaaS在开发调试阶段可以用来测试速度,但进入真实患者数据环节之前,必须完成本地化部署和数据脱敏流程。
我在项目里的做法是建立了一个“数据分级”策略:
| 数据级别 | 内容范围 | 处理方式 |
|---|---|---|
| 一级 | 完全脱敏的模拟病例 | 可调用云端模型快速迭代算法 |
| 二级 | 去除姓名住院号后的匿名临床数据 | 私有化部署,仅内部网络访问 |
| 三级 | 含完整病历信息的真实患者数据 | 独立离线环境,物理隔离,不允许日志外传 |
这套分级看起来不复杂,但在实际项目里解决了大量不必要的合规扯皮。开发者开发调试用一级数据,医生团队做临床检验用二级数据,只有真正进入试点时才会触碰三级数据。这样分段推进,项目既不卡壳又能守住安全底线。
尾声:关于如何继续拓展这个方向
做完这套方案后,我个人最大的感受是:多智能体系统的难点不在于智能体的数量,而在于组织它们协作的那套“规则”。证据树是我目前能找到的最接近于“把临床推理外显化”的载体——它既给每个智能体提供了工作空间,也给医生和工程师提供了共同语言。
后面我想折腾的方向有两个:一个是把证据树与真实随访数据连通,让推理系统能借助时间线回看患者“病情演化轨迹”,这在慢性病管理中会非常有用;另一个是引入强化学习来学习证据节点的最优剪枝策略,而不是靠人工设定的阈值——这块要做好,推理效率能再上一个台阶。
如果你也在做类似的事情,建议先别急着上大规模多智能体框架,找一个三天能做完的模拟病例,用六个Prompt写好角色定义,把证据树建在JSON文件上,跑通一遍流程再谈规模化。真实业务里,永远是先把链条理顺,再举重若轻。