Skip to content

10.2.1 如何优化召回率,如何优化准确率,它们为什么经常冲突? ​

先给结论:召回率和准确率经常冲突,因为它们在解决的不是同一件事。召回率更关注“该找回来的证据有没有回来”,准确率更关注“最终给模型和用户的内容是不是足够相关、足够干净、足够可靠”。当你想让候选集更宽时,噪声通常会增加;当你想让结果更干净时,覆盖面又可能收窄。

很多团队在调优时会自然地想:

  • 把召回率拉高,效果应该就更好

这句话只说对了一半。因为在 RAG 里,更多召回既可能带来:

  • 更完整的证据覆盖

也可能带来:

  • 更多表面相关但无用的噪声

而这些噪声会继续影响:

  • Rerank
  • 上下文构造
  • 生成忠实性

所以这两个指标在真实系统里经常不是同向变化。

先把两者分别理解清楚 ​

召回率更关心“漏没漏” ​

从直觉上看,召回率要回答的是:

  • 该回来的关键证据,有没有被候选集覆盖到

它更像在防止:

  • 漏召回
  • 找不到真正关键的材料

准确率更关心“净不净” ​

准确率更像在回答:

  • 你最终保留下来的结果里,有多少是真正相关而且有用的

它更像在防止:

  • 噪声太多
  • 偏题内容混入
  • 表面相关但无助于回答的内容占位

为什么它们经常互相拉扯 ​

最常见的冲突来自一句话:

  • 为了不漏,你会倾向多拿一些;为了更准,你会倾向少拿一些

例如:

  • 增大 top k,更可能把关键证据捞进来,但也会引入更多边缘相关结果
  • 放宽 query expansion,可能覆盖更多问法,但也更容易把语义范围放大
  • 混合召回增加覆盖面,但如果后续选择不稳,噪声会快速进入最终上下文

所以很多优化动作会出现这种现象:

  • 召回率上升了
  • 但最终回答并没有变好,甚至更差

什么情况下应该优先保召回率 ​

当你的系统问题更像下面这些情况时,优先保召回率通常更合理:

  • 明明知识库里有答案,但系统像完全不知道
  • 同类问题只要换个说法就召不回来
  • 多文档问题经常漏掉关键来源
  • 困难题表现远差于简单题

这些信号说明,你当前更大的风险是:

  • 漏掉关键证据

这时更适合先做的通常是:

  • 改善 query rewrite / expansion
  • 调整 chunk 策略
  • 优化混合召回
  • 放宽候选池,再靠后续步骤做筛选

什么情况下应该优先保准确率 ​

当你的系统问题更像下面这些情况时,优先保准确率更重要:

  • 候选集里总有很多噪声
  • 高分结果经常偏题
  • 回答里经常混入无关信息
  • 长上下文下模型越来越不稳

这说明你当前更大的风险是:

  • 候选集太脏,后续链路被噪声污染

这时更适合先做的通常是:

  • 增加或优化 Rerank
  • 改善 metadata filter
  • 收紧 top k
  • 优化去重、聚合和最终上下文选择

一个更现实的平衡思路 ​

很多时候,更稳的目标不是单独把召回率或准确率拉满,而是把系统做成两层:

第一层,候选集可以适度宽一些 ​

目的是:

  • 尽量不漏关键证据

第二层,最终上下文必须更干净 ​

目的是:

  • 不把大量噪声送进模型

这也是为什么很多生产系统会采用:

  • 初次召回相对宽
  • 后续 Rerank 和选择相对严

不要把冲突理解成“二选一” ​

召回率和准确率虽然常常拉扯,但不代表它们永远只能此消彼长。更好的理解是:

  • 不同阶段在优化不同目标

例如:

  • 候选集阶段,适度偏召回率
  • 最终上下文阶段,更偏准确率和可用性

这样你看到的就不是单一指标,而是一条分层链路。

一个很实用的判断信号 ​

如果调大 top k 后,你发现:

  • 检索层指标上去了
  • 但生成层忠实性和端到端质量反而下降

这往往说明:

  • 召回收益已经开始被噪声抵消

这时候继续一味追求更高召回,通常不是最优方向。

一句话总结 ​

召回率和准确率经常冲突,因为前者更关心别漏,后者更关心别脏。更稳的做法不是单独把某一个指标拉满,而是在候选集和最终上下文两个阶段分别做平衡。