RAG 重排序怎么选?
检索后 Re-ranking 方法对比,提升召回精度与相关性
原题:在RAG系统中,是否应对检索到的候选文本块进行重排序(Re-ranking)?有哪些方法可以有效提升最终召回结果的相关性和精度?
重排与优化 · 字节真题
回答与解析
为什么需要重排序?
向量检索(双编码器)存在固有缺陷:
- 打分不可比:余弦相似度是绝对值,跨查询波动大
- 粗粒度匹配:query和doc分别编码,丢失细粒度交互信息
- Top-K截断风险:好的文档可能因向量相似度略低被漏掉
重排序作为两阶段检索的第二阶段,用更高精度的模型对候选集(通常100-1000条)精细打分,显著提升最终Top-N的相关性。
主流重排序方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 交叉编码器(Cross-Encoder) | Query+Doc拼接输入,Transformer输出相关性分数 | 精度要求高、延迟可接受 |
| ColBERT | 延迟交互,token级相似度计算,兼顾效率和精度 | 中等延迟、长文档场景 |
| 多路融合 | 向量检索 + BM25 + 稀疏向量(如Splade)结果融合 | 数据分布复杂、单一通道不足 |
| LLM-based重排 | 用GPT-4/Claude等直接打分或生成排序理由 | 极高精度需求、成本不敏感 |
工程实践要点
- 候选集大小:通常取向量检索Top-100~200重排,平衡召回与成本
- 级联过滤:先用轻量模型(如bge-reranker-base)粗排,再用大模型精排Top-20
- 延迟优化:交叉编码器可蒸馏为tiny版本,或用ONNX/TensorRT加速;ColBERT支持PLAID索引进一步提速
一句话总结:重排序是RAG从"可用"到"好用"的关键投入,建议至少部署轻量交叉编码器,高价值场景叠加LLM重排。
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 重排的必要性:向量检索的缺陷
- 方法选择:Cross-Encoder vs ColBERT vs 多路融合
- 业务落地:客服退款场景的实践
- 风险与前提:延迟、成本、级联策略
- 收尾与可延伸点:LLM重排的幻觉问题
这道题其实是在问,RAG 系统里向量检索拿到候选块之后,我们还能不能进一步做点什么,让最终送给大模型的内容更准、更相关。我的回答是,重排这一步非常有必要,但具体怎么做,取决于你对精度和成本的容忍度。
先说为什么需要重排。向量检索用的是 Bi-Encoder,query 和 doc 分别编码,算一个余弦相似度。这个分数有个问题,就是跨查询不可比,同一个分数在不同 query 下意义可能完全不一样。而且它本质是粗粒度匹配,丢失了 query 和 doc 之间细粒度的交互信息。这就导致 Top-K 里可能漏掉真正好的文档,或者混进去一些语义相似但实际不相关的内容。所以重排相当于加了一道精筛,用更高精度的模型重新打分。
具体方法上,我重点讲三个方向。先看 Cross-Encoder,把 query 和 doc 拼起来过一遍 Transformer,直接输出相关性分数。精度最高,但延迟也最高,适合对精度要求极严、延迟可以接受的高价值场景。再看 ColBERT,它做 token 级的延迟交互,算一个相似度矩阵再求和,精度接近 Cross-Encoder,但速度快很多,尤其适合长文档。还要看多路融合,比如把向量检索、BM25、稀疏向量结果混合起来,用加权或 RRF 融合,适合数据分布复杂、单一通道不够稳的情况。
举个例子,在客服退款场景里,用户问“我买的东西没收到,怎么退款”,向量检索可能召回一堆关于退款流程的文档,但真正需要的是“物流异常+未签收”这种组合。这时候如果只用向量,很容易把“退款流程”和“物流状态”两条线混在一起。我的做法是先用向量检索取 Top-200,然后用轻量 Cross-Encoder(比如 bge-reranker-base)粗排到 Top-50,最后再用大模型精排 Top-10。这样既保证了精度,又把延迟控制在了可接受范围。
这里有个坑,就是重排的候选集大小。如果 Top-K 取太大,比如 1000,重排的延迟会暴涨,而且很多噪声文档根本没必要排。如果取太小,比如 10,又可能漏掉好文档。我一般取 100 到 200 作为起点,然后根据实际召回的 Recall@K 曲线调整。另外,级联过滤是个很实用的策略:先轻量模型过滤掉明显不相关的,再重量级模型精排,这样能在成本和精度之间找到平衡。
所以回到问题,我会把重排看成 RAG 从“可用”到“好用”的关键一步。具体落地时,我倾向于至少部署一个轻量 Cross-Encoder,高价值场景再叠加 LLM 重排。但前提是你要评估好延迟和成本,否则重排本身可能成为瓶颈。
不过还有一个点值得注意,就是 LLM 做重排时,它自己也可能产生幻觉,尤其当文档本身有歧义时,它给的分数不一定可靠。所以我会额外加一层置信度校验,比如让模型输出理由,再验证理由是否和文档一致。
关键一句:LLM 重排时自身可能产生幻觉,需要置信度校验
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一个电商客服RAG,用户问“这个手机能防水吗”,向量检索出来一堆文本,但排在第一的其实是另一个型号的规格。你打算怎么处理这种检索不准的情况?需要加一个重排序环节吗?
- 问法 2 · 层层追问
RAG系统里检索阶段你一般怎么实现?……向量检索直接拿top-k给大模型感觉够用吗?……如果要求最终结果必须非常精准,你怎么改进召回后的排序?
- 问法 3 · 直球架构
RAG中为什么需要重排序?你会选择哪种重排序方法?从精度、延迟、成本角度,给出你的设计方案。