拒答与校验:无答案比错答案好

评估 RAG 系统时有一个反直觉的排序:「答错」比「不答」糟糕得多,而「自信地答错」又比「犹豫地答错」糟糕得多。用户对「我没有找到相关资料」的反应通常是换个问法再试;对一本正经的错误答案的反应是采信、执行、然后在某天发现被骗——信任一旦这样丢失,几乎不可逆。拒答(abstention)机制的全部意义就在于:让系统在该沉默的时候沉默,把「不知道」诚实地说出来。这篇讲实现拒答的三道防线、各道防线的阈值设计,以及拒答体验的工程化——拒绝也可以是好的用户体验。

防线一:检索层——先看料够不够

第一道防线在生成之前:检索结束后、调用大模型之前,先判断「材料够不够答」。信号有三个,从粗到细。命中数量:过滤后(《元数据过滤》)合格片段为零或极少——直接进入拒答流程,连生成调用都省了。相关性分数:reranker 的最高分低于阈值——语义最近的材料都不沾边,说明库里大概率没有这个知识。覆盖度:材料只覆盖了问题的一部分(多部分问题只命中了一半)——这不是全拒的场景,是「部分回答」的场景,答案里明确哪些部分没有材料支撑。

阈值怎么定?rerank 分数的绝对值没有通用意义(不同模型分布不同),正确的定法是用评测集标定:《评测集构建》的查询集里专门要有一类「无答案题」——库内确实没有相关信息的问题(比如问一个你的知识库管不到的领域)。跑出「无答案题」的分数分布与「有答案题」的分布,阈值取两分布的间隙。这一步做扎实了,第一道防线就能拦掉大部分「该拒不拒」的 case。

防线二:生成层——把「材料不足就明说」变成协议

第二道防线在 prompt 里。多数模型在 RAG 场景下默认「尽力回答」——材料七成相关,它就答个七成的答案,剩下的部分靠参数知识脑补,且行文上完全分不出哪句有据哪句脑补。生成协议要显式地改这个默认行为:

回答规则:
1. 仅基于【材料】作答。材料没有的信息,写「材料中未提及」。
2. 不要用你自己的知识补充任何事实性内容。
3. 若材料整体不足以回答问题,直接回复「未在知识库中找到
   足够依据」,不要输出猜测。
4. 每个事实性论断标注出处编号。

协议的效果依赖于模型能力与 prompt 执行力的平衡:规则要少而硬(四条以内,每条可判),给正反例(一条标准拒签示例、一条「部分回答+标注缺口」示例),给出口(明确「拒答是被允许甚至被鼓励的」——很多模型的训练倾向是「必须回答」,不给出口它会硬编)。

防线三:校验层——答案出来后再过一遍闸

前两道防线拦「料不够」,第三道防线拦「答案不像话」:生成完成后,检查答案与材料的一致性(groundedness)。三个层级的实现,成本递增:规则层(零成本):答案里的引用编号都真实存在于上下文(《引用与溯源》的编造检查);数字、日期是否都能在材料中找到原形(正则抽取比对)——能拦掉相当比例的「数字幻觉」。模型裁判层(一次调用):让另一个模型(可以是小一档的)判「答案的每个关键论断是否被材料支撑」,输出不支撑论断的清单——这是最常用的实现,平衡了成本与覆盖。NLI 层(专业工具):用自然语言推理模型对「论断-证据」对做蕴含判断,批量句子级校验——适合对幻觉零容忍的场景(医疗、法务),需要部署专用模型。

校验不过的处理是分级的:轻度(个别句子无支撑)——截掉无支撑部分或标注后降级呈现;重度(核心论断无支撑或裁判判定整体失实)——触发重新生成(把失败原因喂回去),再失败就落到拒答。原则只有一条:宁可降级,不出街带病答案。

两类错误与不对称成本

拒答阈值本质是在两类错误之间选边:误拒(库里有答案却被拒了——用户体验受损,他们换个问法或流失)与误放(库外问题被硬答——幻觉出街,信任受损)。两类错误的成本不对称,且不对称的方向由业务性质决定:内部工具(员工查制度)误放的成本高(员工按错误政策执行,返工与合规风险),阈值向「宁可误拒」偏;外部客服(客户查订单政策)误拒的成本高(客户流转人工,服务成本上升),阈值向「宁可先答、后校验拦截」偏。这意味着不存在全局正确的阈值,每个业务面各标各的(《评测集构建》的「无答案题」分布按业务面分别标定),别把 A 场景的阈值抄给 B 场景。阈值也不该是死数:上线后按负反馈率持续微调——它是这类系统里少数「每周都值得看一眼」的参数。

部分回答的实现:多部分问题的中间态

「覆盖度」防线展开讲:多部分问题(「报销的流程和时限,以及需要哪些材料」)的检索命中常常只覆盖一半要点,全拒太粗暴、全答会脑补缺口,正确的形态是部分回答。实现三步:要点拆解(查询理解层把多部分问题拆成子要点清单——这步在《查询路由》的分类调用里顺带完成);逐要点对材料(每个子要点单独判覆盖——哪些要点有材料、哪些没有,用嵌入相似度或 rerank 分数判);分区域生成(有据的要点正常回答并引用,无据的要点明确标注「材料中未提及」)。协议模板里给出部分回答的标准句式(「关于 X:……[依据];关于 Y:材料中未提及」)。部分回答是拒答机制的精细档——它承认「知识库覆盖不均匀」这个常态,把「答」与「不答」的组合做成了显式契约,用户的信任感反而比含糊的全答更强。

拒答率:一个健康指标

把拒答率放进运营仪表盘,它能回答两个问题。知识库覆盖面:拒答率按主题聚类(《拒答体验》的回流信号),高频拒答主题就是内容缺口清单——拒答率在某主题上的下降,直接度量内容建设的成效。系统健康度:拒答率突升的两个常见病灶——检索层退化(《HNSW 调参》的召回监控会同时报警)或阈值被误调(查变更记录);拒答率趋近于零反而要警惕——可能是阈值过松(误放泛滥),也可能是真的覆盖极好,用抽样人工核验区分。一个没有拒答率指标的 RAG 系统,它的「回答覆盖率」是不可知的——你不知道用户问的每三个问题里,是三个都被好好回答了,还是两个被硬编圆过去了。

拒答体验:拒绝不是终点,是分流

把拒答做成体验断点(一个冷冰冰的「无法回答」),是拒答机制最常见的失败方式。好的拒答至少做三件事。说明搜索范围:「在《员工手册》与《报销制度》两个知识库中未找到与『交换机配置』相关的内容」——用户立刻明白是范围问题而不是系统坏了。给出替代路径:建议改问法(「您是否想问『网络设备』相关制度?」)、指路人工渠道(「此类问题请联系 IT 服务台」)、或提示该问题超出库覆盖范围可以反馈补充。回流信号:每次拒答都是一次「知识库覆盖缺口」的免费测绘——拒答日志按聚类分析,高频拒答主题就是最该补充的文档清单。这个闭环让拒答从「成本」变成「内容建设的雷达」。

拒答与多轮的联动

多轮会话里的拒答有一个特殊形态:上一轮答得好,这一轮追问超纲——「那 2025 年的补贴政策呢?」(库里只有 2024 的)。正确行为是「承认边界加锚定上一轮」:「2025 年的政策材料中未提及;2024 年的相关规定是……需要的话我可以展开。」这比冷拒答的体验好一个量级,实现上只需 condense 改写层带上「本问依赖的材料在库内缺失」的信号,生成层按「边界承认加回落上一轮」模板组织。反向联动也要处理:上一轮拒答,这一轮换问法再问——常见于用户换措辞试探,此时拒答理由要保持一致(「知识库未覆盖该主题」),忽拒忽答的摇摆比稳定的拒答更伤信任——这要求拒答判断在语义等价的查询间保持一致,等价判断复用语义缓存的相似度机制即可。

小结

三道防线各司其职:检索层看「料够不够」(无答案题标定阈值),生成层立「没据就说」(少而硬的协议 + 明确出口),校验层验「答案像话」(规则+裁判+NLI 按需分级)。它们的共同哲学是本篇标题:无答案比错答案好——错误答案烧掉的是不可再生的信任,诚实拒答换来的却是「这个系统知道自己边界」的口碑。拒答做得好,它同时是信任防线、成本闸门(省掉无谓的重试)和内容雷达(缺口自动浮现);做得不好,它只是又一座没人看的数据孤岛。

参考资料

  • 本系列前篇:《引用与溯源》《评测集构建》《元数据过滤》《Self-RAG》《权限感知检索》
  • LlamaIndex: Citation Query Engine —— 生成时强制句级引用的协议示例,与本文防线三配合使用
  • 提示:groundedness 裁判的实现可复用 reranker 或小参数模型,评测方法同《RAG 评测入门》的生成层打分
← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?