别再迷信 RAG 了:在医疗产品里,我把通用 RAG 那套几乎全推翻了
当一个AI健康助手面对半夜的紧急求助时,常规的RAG技术可能成为致命漏洞。本文深度剖析医疗分诊场景下,为何标准技术方案会被完全重构——从融合策略的'取严'原则到评测指标的零容忍标准,揭示高风险产品设计中那些'错一步就赔命'的关键决策点。

一个夜间 AI 健康助手项目,做完之后写下来的笔记。给那些做“做错会死人、会赔钱”类高风险产品的人。
半夜两点多,后台进来一条消息:
“我妈胸口闷了一晚上,有点喘不上气,要不明天帮我约个心内科吧?”
这句话看着一点都不吓人。一个子女,半夜,想给妈妈约明天的号。换成你是值班的 AI,十有八九会顺着回:“好的,我帮您看看明天某某医院心内科的号。”
然后呢?这位 76 岁、有冠心病和支架史的老太太,撑不到天亮。“胸口闷 + 喘不上气 + 持续一整晚”,在急诊医生眼里跟“明天约号”是两件事,是高度疑似的急性冠脉综合征。要现在、立刻打 120。
我看着这条消息,是真害怕。这个产品,回错一句话会死人。
而我一开始给它的方案,是一套标准得不能再标准的 RAG。这篇就讲我怎么一刀一刀,把那套标准 RAG 几乎全推翻。先说清楚:RAG 没错,错的是把它原样搬进一个“输错代价完全不同”的场景。
背景:一个会半夜救命的产品
我们做的是高端会员制健康服务,卖点“7×24 健康管家”。可夜里和节假日值班真人就几个,会员一条消息发过去,首响 30 到 60 分钟。健康需求是急的,等一小时体验就崩,续签率是这门生意的命。
要做个东西,夜间替真人完成首响、身份核验、信息收集、初步分诊和紧急分流。主流程很常规,核验 → 症状采集 → 推荐医生 → 确认 → 生成工单 → 流转人工。背后挂着 FAQ、会员档案、症状疾病映射、医院医生、历史工单、急症关键词几个库。
到这步,就是个典型“对话 AI + RAG + 知识库”的活儿。我也是这么开干的。
那套人人都信的 RAG 打法
做过 RAG 的都能背。先文档切片,向量化灌进向量库。召回时一路向量检索管“语义像不像”,一路 BM25 管“字面对不对”,两路用 RRF 融合,再上交叉编码器重排。中间调 top-k、调 efSearch,在“召回得全”和“召回得准”之间找平衡。
放在“医生查病历”那类场景里,这是教科书级正确。融合讲共识,检索调准召平衡,不确定就说不知道。老实说,我之前信得很。然后我把它原样搬进了医疗分诊。
搬进去那天,我后背发凉
我忽略了一个前提:之前 RAG 默认的使用者是医生,有判断力、会兜底。可我这产品半夜对面打字的,是会员,或一个吓懵的家属。没医学训练、会全信,而且没有任何医生在中间把关。
使用者从“会兜底的专家”变成“会全信的素人”,整套地基就塌了。最致命的风险是漏判危急。感冒和心梗,开头那句几乎一样。
我加了第七个库,叫红旗症状库,分三级配不同处置。L1 危急,立即弹 120 + 告警;L2 紧急,5 分钟内真人接入;L3 普通,才走推荐流程、会员确认后流转。
骨架不难。难的是那个朴素问题:你凭什么判断半夜那句话是 L1 还是 L3?
你会说关键词匹配。行,会员说“胸口闷”,你库里存的是“胸痛”“胸部压榨感”,匹配得上吗?匹配不上。这正是 BM25 的老毛病,换个口语说法就漏。平时漏一条,用户多翻一页。这儿漏一条,是一条命。光靠语义检索?它会飘,会超时。
最后走的是双路,规则路 + 大模型语义路。到这看着还跟通用 RAG 一样。但接下来每一步,逻辑全反了。
一刀:融合不投票,按“取严”来
两路打架了。规则路字面没命中、判 L3;语义路读懂了、判 L1。怎么合?
你想“用 RRF 融合”或“投票取共识”,掉坑了。RRF 和投票的灵魂是共识,潜台词是“单路会误报,多方印证压误报”。可分诊反过来。说实话,我担心的不是误报,是漏报。误判 L3 顶多虚惊一场,漏判 L1 是人命。
合流规则就四个字:取严取高。任一路喊 L1 就是 L1,绝不取折中的 L2。
召回怕漏也怕烦,要共识来平衡;分诊只怕漏、不怕烦,要兜底。
这件事我是后来才回过味来的。同一个“融合”动作,因为输错的代价变了,做法可以反过来。这种反转,后面还会一次次出现。
二刀:别纠结准召平衡,我只死磕一个指标
评测的常规打法,Recall、Precision、NDCG 一起看,求均衡。分诊不是均衡问题。两类错误是一根跷跷板:真 L1 被判低算漏判,真 L3 被判 L1 算误报。你越压漏判,误报必然越高。两边没法同时按到 0。
那就别都按。我尺子上只有一根红线:L1 漏判率逼近 0,医学叫敏感度。误报率降成“成本指标”,只设软上限,别把值班淹了,别把会员烦到不信任。它不卡上线,是为零漏判主动牺牲的那个。说白了,我用可容忍的误报,去死保零漏判。
定尺子还得有标准答案,这里两个反直觉的坑。
一,两年历史工单里“当时人工怎么判的”,不能直接当标准答案。当时那个人自己说不定就判错了,你拿错判结论当答案,新 AI 判对了反被算错。工单只贡献“原话语料”,标签得让医生重标。
二,光靠真实工单,覆盖不了主动脉夹层这种“两年没出过一次、但绝不能漏”的罕见 L1。得让急诊医生专门造对抗案例,还得用会员的口语去写。
最后一条铁律:教模型的数据(few-shot)和考模型的数据(评测集)必须严格隔离。否则等于把答案先给学生背,再用同一张卷子考他。
三刀:AI 拿不准时,默认最坏
通用 RAG 召回不到,就老实“转人工”。放分诊又错了。
双路全军覆没、或大模型超时,一个 L1 被漏过去,AI 回“不确定,转人工”。听着负责,可“转人工”走的是 5 到 30 分钟的通道,真要是心梗,没 5 分钟可等。这句“转人工等着”,等于“先别打 120 等人来”,是会死人的延迟。
放到分诊里,“不确定”就不是中间态,本身就是高危信号。兜底默认值必须落在最安全那端:双路没结论、超时、信息不足,一律默认 L1,先弹 120 先告警。转人工可以做,但必须和 120 并行,绝不替代。
宁可把感冒当 L1 惊动一次,绝不把心梗降速成等人工。
四刀:到了推荐这步,逻辑又反了一次
别以为这产品所有东西都“宁严勿松”。到“推荐医生”这步逻辑又反了,它不是安全决策,是体验决策。分诊错了死人,推荐错了只是不够好,这步反而要回到“找最优、可平衡”。
但有两个层最容易混。会员说“明天约某某医生”,图省事会向量召回最像的、加权排序。会栽在哪?医生明天不出诊、或库里俩同名“张伟”召回错了科室。
这俩根本是两类问题。前者是硬约束,明天没号、不在当前城市、科室不对、权益不够,得直接过滤出局,不是扣分。新手最爱把它做成“扣 20 分”,结果约不到的医生分还够高、照样排第三,会员选了才发现约不上,体验当场崩。后者是召回精度问题,靠唯一 ID 锁定,是关键词检索该上场的地方。
最能体现“高端会员制”的是最后一坑。硬过滤后,A 是三甲主任、满意度高但会员没看过、离家 25 公里;B 是副主任、满意度略低但会员妈妈看了三年、离家 3 公里。纯加权 A 排 B 前面,可这产品卖的是“懂你、连续”,把会员看了三年的医生挤到第二,招牌就砸了。
我一开始也想“那给看过的医生多加 30 分”。错。加分项永远会被别的维度压过去。后来改成置顶规则:会员有“近期、同科室、仍出诊、在当前城市、上次没表达不满”的既往主诊医生,直接置顶,不参与打分。
不能输的东西,交给规则,不交给分数。
顺带提一句“上次没不满”。连续性这玩意儿,满意时叫专属,不满时就叫阴魂不散。最新的负向信号,权重得高于一切历史惯性。
五刀:最好的安全,让用户感觉不到它
产品要求会员一进来,后台静默核验身份权益,300 毫秒内完成,只在异常时打断。
很多人做成串行,先核验、转圈,再服务。普通 App 转 3 秒你嫌烦,可半夜抱着发烧老人的家属,最不能忍的是你弹“正在核验您的身份…”。这是在说“先证明你是谁,再谈救你妈”,人设当场碎。这 300 毫秒抢的,是首响的情绪连续性,让核验在感知里“不存在”。
工程上得双轨并行,前台 0 延迟先把人接住、听症状,后台同时静默查权益,只异常才打断。
空窗期 AI 能聊到哪?线划在一个硬标准上:验证前只用“对方主动告诉我的”,绝不主动暴露“从档案里读出来的”。倾听症状、问所在地,都行。调既往病历、说“您上次看的张医生”,不行。万一对面是冒用账号的人,你就把隐私泄露给陌生人了。
还有最关键一条:空窗期那人第一句就是 L1 呢?120 不等核验。核身份的安全,要给救命的安全让路。
六刀:AI 和人交接班,最怕医生“默默把它当小事”
工单是 AI 和真人的交接班接口,而交接班是医疗出错的重灾区。
图省事,会把工单做成一段清爽 AI 摘要:“76 岁,胸闷伴呼吸困难,疑似 ACS,L1,已建议 120。”干净,但医生丢了复核的能力。AI 研判是有损压缩。万一原话里还有句“她说像针扎一下、一会儿就好”,典型非心源性胸痛,会让判断全变,可这句被摘要吃掉了。
第一条:原话原封不动保留,和研判分区并存,连 AI 命中的红旗库条文也塞进去,让医生判断“这条触发得对不对”。
更过瘾的是第二件事。L1 来自“双路都判 L1”,是强信号。来自“不确定兜底硬升”,是弱信号。俩对医生意义完全不同,得标开。可标了“兜底”,医生半夜瞄一眼“哦没真命中”,心里就默默当 L2 处理了,慢悠悠走人工没催 120。
怎么堵这个“轻视”?我一开始想“那别让医生知道是兜底”。我觉得这是掩耳盗铃。
想清楚的堵法是:把“降级”做成显式动作,不是能“心里想想”的隐式选择。医生要降级,必须在系统里点降级、填理由、留痕、担责。只要没走这个流程,工单对系统就永远是 L1。120 催拨、SLA 计时、未结案告警,全按 L1 跑,不管医生当时怎么看。
AI 不能降级,医生也不能“默默降级”,只能“正式降级”。
我后来把这些约束落成一份 JSON Schema,用机器强制住,还跑了校验。原话“逐字未摘要”标记必须真,融合方式必须恒为取严,降级理由和医生签名必须非空,L1 缺“120 是否已拨”直接进不来。
写进注释的纪律会被忽略,写进 Schema 的,绕不过去。
说到底:不是 RAG 错了,是输错的代价变了
把六刀串起来你会发现,工具从头到尾没变,还是召回、融合、过滤、加权、生成。变的只有一件事,输错的代价从“医生多翻一页”变成了“一条人命”。
就因为这一个变化,每个决策都被单向压向同一端:两路融合不再求共识,谁喊得严听谁的;评测不再求均衡,死磕零漏判;不确定不再说不知道,一律默认最坏;推荐核心不再加权打分,规则锁死置顶;核验不再先验后服务,让它在感知里隐身;交接班不再给摘要,原话加溯源加显式担责。
背后是同一条优先级:救命 > 体验 > 安全核验 > 个性化。越不可逆的伤害越前置,越锦上添花的个性化越能交给分数博弈。
如果只留一句话:代价不对称,决定一切设计。
上技术之前先问一句:“这里错了,代价谁承担、可不可逆?”答案不同,同一个工具用法就完全相反。
这个判断方法,不只属于医疗
别觉得医疗太特殊跟你没关系。金融风控,漏过一笔欺诈 vs 误拦一笔正常,代价对称吗?内容安全、自动驾驶、政务,全一个逻辑。
我的方法就一步:先分清你面对的是“安全决策”还是“体验决策”。
安全决策错了不可逆,单向兜底、用规则锁死、把不可逆的扳机留给人。体验决策错了只是不够好,才去平衡、求最优、上加权。
我见过最深的产品事故,根子往往就是把这两类混在一起。拿做体验的平衡心态,去做安全的事。
通用方案值得学,但搬之前先看清,你脚下这块地的代价结构,和别人一样吗?一样就照搬。不一样,就得像我这样,一刀一刀推翻重建。
你在做高风险产品时,踩过哪些“照搬通用方案差点出事”的坑?评论区聊聊。
本文由 @Niney 原创发布于人人都是产品经理。未经作者许可,禁止转载
题图来自Unsplash,基于CC0协议

起点课堂会员权益




取严策略确实保住了安全底线,但代价是误报率上升。在医疗场景里用可容忍的误报换零漏判没毛病,换成金融风控可能就得重新算账了。
先看清代价结构再选技术,通用RAG在分诊场景里每个环节都要反过来做——融合取严不取共识,评测死磕零漏判,不确定时默认最坏,推荐里规则置顶替代加权。核心就一句话:代价不对称,决定一切设计。
有些产品经理就是喜欢把安全决策当体验优化做,最后搞出既不安全也不体验的东西。