1、先看 RAG 检索链路里重排序的位置
典型 RAG 检索链路:
文档切分 → 向量化 → 索引 → 召回 → 重排序 → 生成
- 召回(Retrieval):从海量文档里快速找出候选,通常 Top 50~100。
- 重排序(Rerank):对候选精排,选出最相关的 Top 5~10。
- 生成(Generation):把精排后的上下文给 LLM。
重排序是召回和生成之间的精排环节。
2、重排序在 RAG 中解决什么问题
(1)召回阶段精度不够
召回阶段追求快,通常用:
- 向量检索(Bi-Encoder + ANN)
- 关键词检索(BM25)
- 混合检索
这些方法快,但精度有限:
- Bi-Encoder 是 query 和文档分别编码,交互不充分。
- ANN 是近似检索,可能漏掉或排错。
- 混合检索融合后,排名也不一定准。
结果:相关文档可能在 Top 50 里,但排不到前面。
(2)Top-K 太大,噪声多
- 召回 Top 50,如果直接给 LLM,噪声太多。
- 上下文窗口有限,token 预算有限。
- 需要把最相关的挑出来,放到最前面。
(3)提升生成质量
- LLM 对上下文顺序敏感,相关文档排前面效果更好。
- 噪声少,幻觉少,答案更准。
- 引用溯源更可靠。
(4)解决“语义相似但不相关”
- 向量检索可能召回语义相似但事实不相关的内容。
- Cross-Encoder 能更精细判断 query 和文档的相关性。
- 减少“看起来相关但没用”的文档。
一句话:重排序解决的是召回快但不够准的问题,把最相关的文档精排到前面,提升生成质量。
3、Cross-Encoder 和 Bi-Encoder 的区别
这是这道题的核心。
(1)Bi-Encoder
做法:
- query 和 document 分别编码成向量。
- 然后算相似度(余弦、内积)。
q_vec = Encoder(query)
d_vec = Encoder(document)
score = similarity(q_vec, d_vec)
特点:
- query 和 document 不交互。
- 文档向量可以离线预计算。
- 检索时只算 query 向量,然后 ANN 搜索。
- 快,适合大规模召回。
缺点:
- 交互不充分,精度有限。
- 难以捕捉 query 和文档的细粒度关系。
代表:Sentence-BERT、BGE、E5、OpenAI Embedding。
(2)Cross-Encoder
做法:
- query 和 document 拼接后一起过模型。
- 输出一个相关性分数。
score = Encoder(query + [SEP] + document)
特点:
- query 和 document 充分交互。
- 精度高,能捕捉细粒度关系。
- 但每个 (query, document) 对都要过一遍模型。
- 无法预计算文档表示。
- 慢,只适合对少量候选精排。
缺点:
- 计算量大,延迟高。
- 不能用于大规模召回。
- 只能对 Top-K 候选做精排。
代表:BGE-Reranker、Cohere Rerank、MonoT5。
(3)对比总结
一句话:
- Bi-Encoder 快,用于召回。
- Cross-Encoder 准,用于重排序。
- 两者配合,先召回后精排。
4、引入重排序后如何平衡延迟和效果
重排序提升效果,但增加延迟。平衡手段有:
(1)控制候选数量
- 召回 Top 50~100,重排到 Top 5~10。
- 候选太多,重排慢;太少,可能漏。
- 根据延迟预算调候选数。
(2)选择轻量重排序模型
- Cross-Encoder 有大有小。
- 小模型快,大模型准。
- 可以用蒸馏小模型。
- 比如 BGE-Reranker-base vs large。
(3)分级重排
- 先用轻量模型粗排,再用大模型精排。
- 比如先 BM25/向量召回,再用小 Cross-Encoder 排到 Top 20,再用大模型排 Top 5。
- 平衡效果和延迟。
(4)异步 / 并行
- 重排序和生成可以流水线并行。
- 多路召回并行,重排并行。
- 用 GPU 批处理加速。
(5)缓存
- 热门 query 的结果缓存。
- 相同 query 不重复重排。
- 文档表示缓存(Bi-Encoder 可以)。
(6)按场景动态调整
- 延迟敏感场景:减少候选,用小模型,甚至跳过重排。
- 质量优先场景:增加候选,用大模型。
- 线上可以 A/B 测试。
(7)量化 / 蒸馏 / 加速
- 重排序模型量化(INT8)。
- 蒸馏到小模型。
- 用 ONNX、TensorRT 加速。
- 批处理提高 GPU 利用率。
(8)评估延迟和效果
- 用 Recall@K、MRR、NDCG 评估效果。
- 用 P99 延迟、QPS 评估性能。
- 找到延迟和效果的最佳平衡点。
一句话:平衡延迟和效果的核心是控制候选数、选合适模型、分级重排、并行缓存、按场景动态调整。
5、一句话总结
重排序解决召回快但不够准的问题,把最相关文档精排到前面。Bi-Encoder 分别编码 query 和 doc,快,用于召回;Cross-Encoder 拼接编码,准,用于重排序。平衡延迟和效果靠控制候选数、选轻量模型、分级重排、并行缓存、按场景动态调整。
6、这道面试题的质量点评
优点
- 结构完整:解决什么问题 → 两种编码器区别 → 延迟效果平衡,逻辑闭环。
- 区分度好:
- 初级:能说重排序是精排。
- 中级:能说 Bi-Encoder 快、Cross-Encoder 准。
- 高级:能说分级重排、蒸馏、量化、缓存、动态调整。
- 贴近工程:重排序是 RAG 核心优化点,必考。
- 有追问空间:可以追问 RRF、候选数、模型选型、评估指标。
缺点
- 第三问偏工程:没做过部署的人可能答不上。
- 容易背结论:可能只答“Bi-Encoder 快,Cross-Encoder 准”。
- 缺少场景:没问“你实际项目怎么选候选数?延迟多少?”
- 没覆盖 LLM Rerank、多路重排:这些是进阶方法,题目没提。
总体评价
质量:上。 适合中高级岗位,能有效区分“知道重排序概念”和“真正做过 RAG 部署调优”的人。建议追问:
“召回 Top-K 怎么定?为什么?”
“重排序模型怎么选?蒸馏怎么做?”
“延迟和效果怎么权衡?有数据吗?”
“LLM Rerank 和 Cross-Encoder 怎么选?”
“怎么评估重排序效果?”
7、怎么回答才是最好的
回答原则
- 先给位置:重排序在召回和生成之间。
- 说清解决什么问题:召回快但不够准,噪声多。
- 讲两种编码器:Bi-Encoder 分别编码、快;Cross-Encoder 拼接编码、准。
- 讲平衡:候选数、模型选型、分级、并行、缓存、动态调整。
- 主动提进阶:LLM Rerank、蒸馏、量化。
- 结合实践:说“我们用 BGE-Reranker + 缓存”。
推荐回答结构
“重排序在 RAG 链路里位于召回和生成之间。召回阶段用向量或关键词快速找出 Top 50~100,重排序对这些候选精排,选出 Top 5~10 给 LLM。”
“它解决的核心问题是召回快但不够准。Bi-Encoder 分别编码 query 和文档,交互不充分,ANN 也是近似检索,所以相关文档可能排不到前面。重排序把最相关的挑出来,减少噪声,提升生成质量,减少幻觉。”
“Bi-Encoder 和 Cross-Encoder 的区别在编码方式。Bi-Encoder 分别编码 query 和文档,算向量相似度,文档向量可以离线预计算,快,适合召回。Cross-Encoder 把 query 和文档拼接后一起编码,充分交互,精度高,但每个对都要过模型,慢,只适合对少量候选精排。”
“平衡延迟和效果有几个手段。第一,控制候选数,召回 50~100,重排到 5~10。第二,选轻量模型,或用蒸馏小模型。第三,分级重排,先小模型粗排,再大模型精排。第四,并行和缓存。第五,按场景动态调整,延迟敏感就少排,质量优先就多排。第六,量化和加速。”
“我们实际用 BGE-Reranker,召回 50,重排到 5,配合缓存和批处理。评估用 Recall@K、NDCG 和 P99 延迟。”
加分点
- 提到 召回 Top 50~100、重排 Top 5~10。
- 提到 Bi-Encoder 预计算、Cross-Encoder 拼接、交互充分。
- 提到 分级重排、蒸馏、量化、缓存、动态调整。
- 提到 LLM Rerank、RRF、Recall@K、NDCG、P99 延迟。
- 结合真实部署经验。
减分点
- 只说“重排序提升效果”,不展开。
- 不知道 Bi-Encoder 和 Cross-Encoder 的区别。
- 不知道延迟和效果怎么平衡。
- 说“重排序一定用 Cross-Encoder”(LLM Rerank 也是选项)。
- 不知道评估指标。
评论专区
评论加载中...登录后即可发表评论