跳到主要内容

K4.1 召回-精排:先粗后精的两阶段

招聘不会让 CEO 面每一份简历​

一家公司收到 5000 份简历,怎么招人?绝不会让 CEO 从头到尾面完每一份——那要面到天荒地老。真实流程是两阶段:先让 HR 拿关键词快速筛出 20 份(快,但粗),再让业务专家细面这 20 个人(慢,但准)。

检索面对的是一模一样的困境。知识库里有几百万段资料,你既想要快(用户等不起),又想要准(排在第一的必须真的最相关)。可惜世上没有又快又准的单一模型:快的粗、准的慢。于是检索也学会了招聘那一招——分两阶段。

召回负责「别漏」,精排负责「排对」​

这个结构叫召回-精排两阶段:

  • ① 召回(retrieve):快而粗。用 K1~K3 的向量 / 关键词 / 混合检索,从几百万段里飞快地捞回几十条候选。它的目标是**「别漏」——把相关的都大概率装进候选池,哪怕混进一些不相关的也没关系。这叫召回率优先**。
  • ② 精排(rerank):慢而精。只对召回的这几十条,用一个更细的模型重新仔细打分,选出最相关的 top-3~5 交给生成。它的目标是**「排对」——把真正最相关的顶到最前。这叫精度优先**。

为什么非得分两阶段?因为精排用的模型准是准,但太慢——慢到没法在整个知识库上跑(几百万段每段都细算一遍,用户能等到花儿谢了)。而召回的模型快是快,但只能保证「相关的大概率在候选里」,没法保证「最相关的恰好排第一」。两者接力:召回先用「广撒网」保证不漏,精排再用「细挑选」保证排对。

上手玩:看重排怎么救命​

下面这个实验,就演示了「只信召回第一名」会有多离谱:

🎮 动手实验
重排:把最该看的顶上来
第一阶段「粗召回」用向量快速捞回一批候选,但它排在最前的,偏偏是个「看起来像」的李鬼。点「精排」,看第二阶段的交叉编码器怎么读懂问题、把真答案顶上来。(分数为教学示意)
🧑‍💻 男员工的陪产假有几天?
① 粗召回(向量相似,快而粗)
1产假:女员工生育享 98 天产假,难产、多胎另有增加。🎭0.86
2陪产假:男员工可享 15 天陪产假,需在配偶生育后 3 个月内休完。✅0.72
3产假期间,工资与绩效照常发放,不影响晋升。🎭0.68
4陪产假期间,工资按全额发放。🔗0.55
5婚假:员工结婚可享 10 天婚假。·0.50
6年假:工作满 1 年享 5 天带薪年假。·0.44
7哺乳假:一岁以下婴儿的母亲每天有 1 小时哺乳时间。·0.40
8员工请假需提前在系统提交申请并经主管审批。·0.36
🎭 注意第 1 名——「产假 98 天」被排到了最前面!因为在粗糙的向量眼里,「产假」和「陪产假」长得太像。可用户问的是陪产假,这是个李鬼。真答案「陪产假 15 天」被压在了第 2 位。点上面的「精排」看看会发生什么。
💡 要点:检索的黄金结构是两阶段——先「召回」快而粗地捞回几十条(向量检索,双编码器:查询和文档分开编码,快但只看个大概),再「精排」慢而准地重新打分(交叉编码器:把查询和文档拼在一起细读,能分清「产假」和「陪产假」这种致命差别)。精排太慢,扛不住在整个知识库上跑;但只对召回的几十条跑,就又快又准。RAG 的检索质量,一大半靠这一步兜底。

请照着做一遍。查询是「男员工的陪产假有几天」——

第一步,看粗召回的结果。 排第 1 名的居然是「产假 98 天」!为什么?因为在召回用的粗糙向量眼里,「产假」和「陪产假」长得太像了(就差一个字)。可用户问的明明是陪产假——这是个李鬼。真正的答案「陪产假 15 天」被压在了第 2 位。如果模型只看第 1 名,就会理直气壮地告诉用户「陪产假 98 天」——错得离谱还很自信。

第二步,点「交叉编码器精排」。 真答案「陪产假 15 天」被顶到了第 1 名,「产假 98 天」这个李鬼被打回原形(你能看到它的名次 ↓ 掉下去)。精排模型读懂了「产假」和「陪产假」一字之差背后的天壤之别——这是粗召回的向量做不到的。(它怎么做到的,下一节讲。)

这一顶一压之间,就是重排的全部价值:它专治「看起来像、其实不对」的召回结果。

重排:性价比之王​

在一个已经能跑的 RAG 里,如果只允许你加一个东西来提升质量,答案几乎总是:加一个重排。原因是它改动小、见效大——不用动检索、不用重切块、不用换嵌入模型,只在召回之后串一个重排模型,就能把「相关但排乱了」的结果大幅理顺。这是 2024–2026 年生产 RAG 的普遍经验,也是最先被推荐的优化。

重排不是免费的

两个代价要记住。其一,多一次模型调用 = 多一点延迟和成本——精排那几十条也要花时间,实时场景要算好这笔账。其二,也是更隐蔽的:重排只能在召回给的候选里挑,救不回「压根没召回的」。如果召回阶段就把真答案漏在了几十条之外,精排再神也无能为力——它不产生新候选,只重排现有的。所以召回阶段务必「宁滥勿缺」,尽量别漏(回扣 K3:召回率优先)。候选取多少条(top-k)是个权衡:取太少可能把真答案挡在门外,取太多则精排变慢。

小结​

本节要点
  • 检索的黄金结构是两阶段:召回快而粗(保证别漏,召回率优先),精排慢而准(保证排对,精度优先)。
  • 分两阶段是因为「又快又准」的单一模型不存在:精排太慢跑不了全库,召回太粗排不对第一名,两者接力。
  • 实验里粗召回把「产假 98 天」这个李鬼排第 1,精排把真答案「陪产假 15 天」顶上来——只信召回第一名会被带沟里。
  • 重排是性价比之王(改动小见效大),但救不回「没召回的」——召回务必宁滥勿缺。
📝 动手自测0/3
1. 召回-精排两阶段里,「召回」阶段最该优先保证什么?
2. 既然精排模型更准,为什么不直接用它来检索整个知识库?
3. 实验里,粗召回把「产假 98 天」排在了「陪产假 15 天」前面。这说明了什么?

延伸阅读​