跳至主要内容
检索对了 78%,答案引用还是错

检索对了 78%,答案引用还是错

客户传了一万两千份 PDF,产品手册、历史合同、工单记录混在一起,表格多、版本多。上线一个月,抽查 300 条真实提问:检索命中正确文档 78%,答案里引用段落正确率只有 61%,还有 9% 属于库里根本没有答案、系统却编出了具体内容。

「召回率 78%,那就把召回提到 90%」是最常见的第一反应,也是最贵的一个误区。61% 和 9% 这两个数字,指向的根本不是召回层。

本系列第 3/10 篇 · 上一篇:用户改了预算,Agent 要不要重跑全流程 · 下一篇:「那它呢」到底指谁

先把质量问题拆到能定位的层

我把链路拆成六层,每层配一个能查的信号:

层 典型坏法 定位信号
解析与元数据 表格被拍平、版本号没抽出来、作废文档没打标 原文与 chunk 对照、版本字段覆盖率
切分 一个条款被切成两半、页眉页脚混入 chunk 边界抽样
召回 正确文档压根没进候选池 Recall@50
重排与时效 正确版本进了池但排在第 9 位,旧版排第 1 nDCG@5、有效版本在 top-K 的位置分布
上下文构造 新旧版本片段一起塞进去,模型自己拼 送入上下文的片段清单与冲突标记
生成与拒答 引用挂错段落、无答案时硬答 引用校验、无答案组误答率

「引用错版本」这个投诉,最可能落在解析元数据、重排时效、上下文冲突三处,而不是召回。诊断方法也直接:对那 39% 引用错的样本,单独看正确版本有没有进候选池。进了池却没被引用,是排序或构造问题;压根没进池,才轮到改召回。不做这一步就加向量模型,等于在最贵的层上赌运气。

一个 200 条的最小评测集

评测集我一律从线上真实提问日志里抽样,不自己编。规模 200 条左右,跑一次几分钟,产品侧维护得动。构造方式:

  • 按频次分层:高频 100 条、中频 60 条、长尾 40 条;再单独加两组各 20 条——多版本共存问题和语料无答案问题。后两组是这道题的关键,缺了它们,系统会一路优化成「什么都敢答」,总分还挺好看。
  • 标注字段:query、期望 doc_id + version + effective_date、gold chunk_id、answerable(布尔)、期望引用片段、版本敏感标记、所属分组。
  • 标到 chunk 而不是标答案文本:检索层要判的是「前 K 个位置里该出现哪些片段」,答案文本留给生成层评测。
  • 版本化、只增不改:删一条或改一条,历史分数就失去可比性。切开发集 / 验证集 / 留出集,留出集只在季度复盘看。

标注规范里最容易扯皮的是「相关」怎么定义。我会写死:只提供背景不算相关,提到关键词但不支持结论不算相关,版本已作废一律不算相关。两个人各标一批,分歧当场裁决并把理由写进规范。这份规范会长得很丑,全是特例,但它就是团队对「对」的定义。

两个验收指标,口径要写到分子分母

引用版本正确率 = 引用指向有效版本、且该片段能支撑对应结论的答案条数 / 所有带引用的答案条数。分子要求两个条件同时成立,光「链接能打开」不算。当前基线 61%,上线阈值我定 ≥ 95%,且多版本组单独不低于 90%。

无答案误答率 = 语料无答案却给出了具体事实性答案的条数 / 无答案样本数。当前 9%,阈值 ≤ 2%。这一组我给的优先级高于总分,因为编造一条合同条款的代价,远大于十条答得不够完整。

另外记一个护栏:拒答率不能单调上升。把拒答调得极严,误答率一定好看,但产品也就没用了。三个数必须一起看。

防过拟合,以及不改模型的两项改动

评测集最容易被「优化」成作弊:参数照着评测集调,调完宣布系统变好了。三份切分是第一道防线;第二道是定期从新日志补样本,尤其是客户上传了新文档之后,旧标注会整体过期;第三道是留出集不参与任何选型讨论。

在「不能换模型」的约束下,我只做两件事:

  1. 版本元数据进索引并参与排序:解析阶段抽出 version / effective_date / status,作废版本降权或默认排除,重排时把时效作为显式特征。预期引用版本正确率从 61% 提到 80%–88%,这是收益最大的一处,且不动模型。
  2. 引用强制绑定 + 无证据即拒答:答案里每个事实性陈述必须挂一个 chunk_id,生成侧校验不过就不输出该陈述;候选证据为空或全部过期时,走固定拒答模板「当前资料中未查到,已记录,建议联系 XX」。预期无答案误答率从 9% 降到 1%–3%,代价是拒答率上升 5–8pt,这部分要拿出来和客户对齐,不能偷偷上。

两项都可用上面 200 条评测集按组验证,尤其是「多版本组」和「无答案组」要单独出数。分层聚合比总分重要:整体涨 10 个点、多版本组跌 5 个点,也得上不了线。

追问:客户要求「答案必须 100% 正确」

这句话不能硬接,也不能直接反驳。我会把它翻译成一句可交付的话:「答案必须可核验、可拒答、可追溯,事实性错误按条追责」。

具体给三样东西:每条事实性结论都带可点击的原文引用;无依据时明确说不知道并给出人工出口;验收按分层口径(引用版本正确率、无答案误答率)而不是一句「准确率 100%」,配套一份 bad case 复盘 SLA 和回滚条款。

然后主动说清边界:PDF 解析本身会丢表格结构、客户内部有人口头约定但没写进文档、同一事项两份文件冲突——这三类不是模型能保证的,需要客户配合治理文档。愿意把「我们保证不了什么」写进验收文档的供应商,反而比拍胸脯说 100% 的可信。

我会怎么看答案

及格:说要建评测集、要分检索和生成看。良好:能拆层、能写出指标口径、知道留「无答案」组。优秀:会用「正确版本有没有进候选池」这个判别把归因收敛到具体层、给出不改模型的改动及收益量级、能把「100% 正确」重谈成可验收的交付标准。

最常见的失分是只报一个端到端准确率。它既不能定位,也不能验收,还没法在客户面前解释「哪里没做好」。

引用不是装饰,是产品把责任交还给用户核验的唯一接口。

材料层的问题收敛了,换个更贴身的场景:聊到第十四轮,用户问「那它呢」,这个「它」到底是谁?

关于本文

由 Lu's Blog 撰写,采用 CC BY-NC 4.0 许可协议。

#AI 产品 #RAG #评测

评论