Reranking

重排

向量检索召回 30 条,再用更精准的模型重排,留下 top 3。

详解

Reranking(重排)是 RAG 的可选但高价值的第二阶段检索:向量检索用 bi-encoder(双编码器)快速从百万文档里召回约 20-50 条候选,再交给 cross-encoder(交叉编码器)对每条候选精算相关性分数,重新排序后只保留 top 3-5 条送入模型。为什么需要两阶段?bi-encoder 把问题和文档分别独立编码,速度快但精度有损失;cross-encoder 把"问题+文档"拼成一个输入,同时看两者的交互,相关性判断更精准,但无法对百万文档逐一做——太慢。两阶段结合:快速召回 + 精准精排,兼顾速度与质量。常见 reranker 有 Cohere Rerank、BGE-Reranker、cross-encoder/ms-marco-MiniLM。

一个类比
找人才的两步流程:先让 HR 从几百份简历里快速筛出 30 份看起来还不错的(向量召回);再让技术主管逐一深度面试这 30 人,最终选出最合适的 3 人(reranker 精排)。第一步求快,第二步求准。
举个例子
两阶段检索流程示意(使用 sentence-transformers 本地 reranker):

```python
from sentence_transformers import CrossEncoder

query = "how to handle long documents in RAG"
# 第一阶段:向量检索召回候选(此处用占位列表)
candidates = [
    "chunking strategy determines RAG quality",
    "Python list comprehension syntax",
    "long documents can be split recursively by paragraph",
    "chunk_overlap prevents semantic truncation",
]

# 第二阶段:cross-encoder 重排(ms-marco 模型为英文;中文可换 BAAI/bge-reranker-base)
reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")
scores = reranker.predict([(query, c) for c in candidates])
ranked = sorted(zip(scores, candidates), reverse=True)
for score, doc in ranked[:2]:
    print(f"{score:.3f}  {doc}")
```
PYTHON 示例
相关概念