AI 基础入门 · 第14课
重排 Rerank:粗排之后再精排,把最相关的顶到最前面
上一课讲了 Embedding 粗排——从百万文档里快速捞出 50~100 个"大致相关"的候选。但粗排是双塔结构,问题和文档是各算各的,精度不够。Rerank(重排)就是用更贵但更准的交叉编码器(cross-encoder)把这几十个候选重新打分排序,把真正能回答问题的那 3~5 个顶上来。这一课讲透两阶段检索、cross-encoder 为什么比 bi-encoder 准但慢、以及 bge-reranker 在 RAG 里的价值。
① 小白第一课怎么学(4 步走,约 45 分钟)
这一课紧接 Embedding,是 RAG 检索质量的最后一道质量闸门。
1建立直觉(10 分钟)
读②③:粗排快但糙,精排慢但准,两阶段配合。
2搞清双塔 vs 交叉编码器(15 分钟)
读④:谁分开算、谁放一起算。
3看 Rerank 在 RAG 的位置(10 分钟)
读⑤:粗排 Top-50 → Rerank Top-5。
4刷题自测(10 分钟)
做⑦⑩,错题回⑥看易错点。
本课小目标学完你要能:① 说清"粗排→精排"两阶段;② 区分 bi-encoder(双塔)和 cross-encoder(交叉编码器);③ 解释为什么 Rerank 更准但更慢;④ 列举 bge-reranker 是干嘛的。
② 一图看懂:两阶段检索流水线
读法:粗排(Embedding 双塔)在百万文档里毫秒级捞出 Top-50;精排(Rerank 交叉编码器)把这 50 个和问题一起仔细看一遍,重新打分,留下最准的 3~5 个喂给大模型。
③ 本质直觉:为什么需要"再排一次"
一句话定义:Rerank(重排)是在粗排召回的候选基础上,用一个更精细的模型对"问题—候选"成对地重新打分,把真正相关的文档排到最前面。
为什么粗排不够准?Embedding 用的是双塔(bi-encoder)结构:问题和文档分别独立编码成向量,再算余弦相似度。好处是文档向量可以离线算好、存在库里,查询时只算一次问题向量——快。坏处是问题和文档在编码时互不可见,交互不充分,召回的候选可能"意思沾边但答非所问"。
Rerank 用的是交叉编码器:把"问题 + 候选文档"拼在一起,一起送进模型,让它们在注意力层里充分交互后输出一个相关性分数。因为能看到双方,所以判得更准;但每对都要跑一次模型,慢得多。
类比:粗排像招聘会初筛——HR 只看简历关键词,一天筛几千份(快但糙);Rerank 像部门经理面试——每份简历和候选人面对面聊,判得准但一天只能面几十人。所以先初筛出 50 人,再面试挑 5 个。
一句话总结粗排求"快、广",精排求"慢、准";两阶段配合,才能在百万文档里既不漏掉正确答案、又不把垃圾塞给大模型。
④ 完整体系:双塔 vs 交叉编码器对比 + 主流 Rerank 模型
两种编码器对比
| 维度 | 双塔 bi-encoder(Embedding) | 交叉编码器 cross-encoder(Rerank) |
| 编码方式 | 问题和文档各自独立编码成向量 | 问题+文档拼接后一起过模型 |
| 交互深度 | 只在最后算余弦相似度,交互少 | 注意力层充分交互,看得细 |
| 速度 | 快(文档向量可离线预计算) | 慢(每对都要实时跑一次) |
| 精度 | 中等,召回"大致相关" | 高,精排"真正相关" |
| 用在哪 | 粗排:百万级 → Top-50 | 精排:Top-50 → Top-5 |
| 代表模型 | bge-m3、text-embedding-3 | bge-reranker、Cohere Rerank |
主流 Rerank 模型速查
| 模型 | 出品方 | 一句话 |
| bge-reranker-v2-m3 | 智源 BAAI | 开源中文首选,多语言,和 bge-m3 配套 |
| bge-reranker-large | 智源 BAAI | 英文/通用场景,560M 参数 |
| Cohere Rerank 3 | Cohere | 闭源商用 API,开箱即用 |
| Jina Reranker | Jina AI | 开源,长文本友好 |
典型 RAG 配置粗排 Top-50(Embedding) → Rerank Top-5(cross-encoder) → 拼进提示词 → 大模型生成
Rerank 不是越大越好它要对每个候选都跑一次,Top-100 就跑 100 次。一般粗排捞 50~100 个给 Rerank 就够,太多会把延迟拖垮。
⑤ 用法场景与典型例题:RAG 中重排的价值
场景 1:为什么加了 Rerank,回答明显变准了
客服 RAG 系统,用户问"我的订单怎么退款"。
粗排靠 Embedding 捞回 50 条,里面混着"退货政策""优惠券使用""订单查询"等字面沾边的片段。过一遍 bge-reranker 后,真正讲"退款流程"的那几条被顶到前面,大模型拿到的就是对的资料,回答自然准。
场景 2:Rerank 能把"答非所问"的挤下去
用户问"高血压能不能吃西柚"。
Embedding 粗排可能捞回一堆"高血压饮食"的泛泛之谈;cross-encoder 因为同时看到问题和候选,会把真正讨论"西柚与降压药相互作用"的片段排到最前,把泛泛的挤下去。
场景 3:什么时候可以不用 Rerank
库很小(几百篇文档)、或对延迟极度敏感。
文档少到粗排直接能捞准,Rerank 那 50 次推理纯属浪费;或者在边缘设备上跑,加不动这一层。大多数生产级 RAG(几千篇以上)都建议加 Rerank。
RAG 全链路一句话文档切块 → Embedding 存向量库 → 问题 Embedding → 粗排 Top-50 → Rerank 精排 Top-5 → 拼进提示词 → 大模型生成。Rerank 是检索质量的最后一道闸门。
⑥ 高频错误诊断(4 条)
错误 1:以为 Rerank 就是再做一次 Embedding 检索不是。Rerank 用的是 cross-encoder,把问题和候选拼在一起实时打分,不是算余弦相似度。
错误 2:粗排捞了 1000 个给 Rerankcross-encoder 每个候选都要跑一次模型,1000 个就是 1000 次前向,延迟直接爆。一般粗排 50~100 个给 Rerank。
错误 3:用 Embedding 模型当 Rerank 用Embedding 是双塔,快但糙;Rerank 要的是 cross-encoder 的精度。两者结构不同,不能互相替代。
错误 4:以为加了 Rerank 就万事大吉它只是把粗排候选里的相关项顶上来;如果粗排压根没召回正确文档(漏了),Rerank 也变不出来。粗排召回率和 Rerank 精度要一起调。
⑦ 考点真题演练(4 题)
考点分布
| 考法 | 出题形式 | 应对 |
| 两阶段顺序 | 问先粗排还是先精排 | 先粗排后精排 |
| cross vs bi | 问谁更准但慢 | cross-encoder |
| Rerank 模型 | 问 bge-reranker 是什么 | 重排模型 |
| Top-K 设置 | 问粗排捞多少给 Rerank | 50~100 |
真题基础1. RAG 检索的两阶段顺序是?
真题中档2. 为什么说 cross-encoder 比 bi-encoder 准但慢?
真题中档3. bge-reranker 属于哪类模型?
真题拔高4. 关于 Rerank 的候选数量,下面哪个做法合理?
⑧ 必背知识点卡
两阶段:粗排(快广)→ 精排(慢准) 先捞后挑
粗排:bi-encoder 双塔,问题文档分开算向量 bge-m3
精排:cross-encoder,问题文档拼一起过模型 bge-reranker
为什么准:问题和候选能在注意力层充分交互 不是只算余弦
为什么慢:每对候选都要实时跑一次 不能预计算
典型配置:粗排 Top-50 → Rerank Top-5 再喂大模型
召回是前提:粗排没捞到正确文档,Rerank 也救不回来 两者都要调
⑨ 应用输出:一行代码加 Rerank
实战场景:在已有 Embedding 检索后面接一层 bge-reranker。
①
用 sentence-transformers 的 CrossEncoder:
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
# hits 是粗排返回的 50 个候选文本
pairs = [[query, doc] for doc in hits]
scores = reranker.predict(pairs) # 每对打一个相关性分
ranked = sorted(zip(hits, scores), key=lambda x: -x[1])
top5 = [h for h, s in ranked[:5]] # 取最相关的 5 条
② 把 top5 拼进提示词:把这 5 条片段和用户问题一起喂给大模型,让它"看着资料回答"。
③ 注意:bge-reranker 和 bge-m3 是配套的,但即使粗排用别的 Embedding,Rerank 这层也能独立提升精度。
口述全链路"先粗排用 Embedding 双塔从百万文档里捞 50 个大致相关的;再用 Rerank 的 cross-encoder 把问题和每个候选拼一起重新打分,挑出最准的 5 个;最后把这 5 段塞进提示词让大模型回答。"
⑩ 分层练习 16 题(基础 6 + 中档 5 + 拔高 5)
▍基础 6 题
基础1Rerank 中文叫什么?
重排,在粗排召回的候选基础上重新打分排序。
基础2两阶段检索的顺序?
先粗排(Embedding 快速召回 Top-50),再精排(Rerank 重新打分到 Top-5)。
基础3粗排用哪种编码器结构?
双塔 bi-encoder,问题和文档分别编码成向量再算余弦相似度。
基础4精排(Rerank)用哪种结构?
交叉编码器 cross-encoder,问题和候选拼一起实时过模型打分。
基础5bge-reranker 是哪类模型?
开源的重排模型(cross-encoder),智源 BAAI 出品。
基础6典型 RAG 配置里 Rerank 后留几条给大模型?
一般 Top-3~5 条最相关的片段,拼进提示词。
▍中档 5 题
中档7为什么双塔快、交叉编码器慢?
双塔的文档向量可离线预计算,查询时只算一次问题向量;cross-encoder 每对"问题+候选"都要实时跑一次模型,50 个候选就是 50 次前向。
中档8为什么交叉编码器更准?
双塔在编码时问题和文档互不可见;cross-encoder 把两者拼一起送进注意力层,能充分交互细节,判断"到底答不答得上"更准。
中档9粗排一般捞多少个候选给 Rerank?
通常 50~100 个。太少可能漏掉正确答案,太多会拖慢 Rerank 的延迟。
中档10Rerank 能替代粗排吗?为什么?
不能。百万级文档每对都跑 cross-encoder 太慢,不可行。必须先用快的粗排把范围缩到几十上百个,再用 Rerank 精排。
中档11bge-reranker 和 bge-m3 是什么关系?
同属智源 BGE 系列,配套使用:bge-m3 是 Embedding 双塔做粗排,bge-reranker-v2-m3 是 cross-encoder 做精排。
▍拔高 5 题
拔高12如果粗排没召回正确文档,Rerank 能补救吗?
不能。Rerank 只能在粗排给出的候选里排序,候选里没有正确文档它也变不出来。所以粗排的召回率和 Rerank 的精度要一起调。
拔高13为什么说 Rerank 是"宁慢勿错"的最后一道闸门?
它只对几十条候选做精细判断,延迟可控;但它决定了最终喂给大模型的资料质量。这一步排错,后面大模型再强也只能基于错资料回答。
拔高14小文档库(几百篇)要不要加 Rerank?
通常不必。粗排直接就能捞准,加 Rerank 反而增加延迟和成本。文档规模上千、或对回答质量要求高时再加。
拔高15Rerank 的分数为什么不直接用余弦相似度那种阈值?
cross-encoder 输出的是相关性打分(logit 或 sigmoid),不同模型分数分布不同,主要用途是排序而不是卡阈值;一般取 Top-K 而不是设分数线。
拔高16生产环境 RAG 加 Rerank 后延迟增加多少?
粗排通常毫秒级,Rerank 50 个候选在 GPU 上约几十到一百多毫秒。整体从几十毫秒涨到一两百毫秒,在可接受范围;CPU 上会明显变慢,建议 GPU 加速。
⑪ 记忆口诀 + 7 天复习计划
三句口诀
① 粗排快广捞 50,精排慢准挑 5。
② 双塔分开算向量,交叉编码器拼一起。
③ bge-m3 粗排,bge-reranker 精排;粗排没召回,精排也白搭。
| 天 | 任务 | 自检 |
| 第 1 天 | 读②③,画"粗排→精排"流水线 | 说清两阶段 |
| 第 2 天 | 背知识点卡 + 基础 1-6 | 基础全对 |
| 第 3 天 | 读④对比表,做中档 7-11 | 区分两种编码器 |
| 第 4 天 | 做拔高 12-16 | 理解召回是前提 |
| 第 5 天 | 做⑦真题 4 题 | 限时每题 2 分钟 |
| 第 6-7 天 | 合上书口述三句口诀 | 不看资料全说对 |
📌 知识链路
本节位置
本页是 RAG 检索流水线的"精排"环节——粗排用 Embedding 捞出大致相关的候选,本页用 cross-encoder 把最该看的那几条顶上来。它和 Embedding 一前一后,共同决定检索质量。
下一步(学完去)
·
RAG 系统详解:把 Embedding、向量库、Rerank 串成完整的检索增强生成系统。
·
第19课 · 推理引擎:Rerank 模型本身也需要 GPU 推理,下一条技术线讲怎么高效跑模型。