重排序:Cross-Encoder 作为 RAG 的精准过滤器
Embedding(向量)检索虽然快(ANN),但有一个致命弱点:它把复杂的语义压缩成了一个定长的向量(比如 768 维)。 在这个过程中,大量的细节丢失了。 所以,基于 Cosine Similarity 的检索结果(Top-K),往往不够精准。 Top-10 可能只有 Top-1 是相关的,其他 9 个都是噪音。 这些噪音如果直接喂给 LLM,会导致幻觉、忽略重点(Lost in the Middle),甚至增加成本。
重排序 (Reranking) 就是在粗排(Vector Search)之后,用一个更强的模型(Cross-Encoder),对 Top-K 结果进行二次精排。
1. Bi-Encoder vs Cross-Encoder
1.1 Bi-Encoder (Embedding Model)
我们平时用的 Sentence-Transformers 都是 Bi-Encoder。
- Query: [Embedding]
- Doc: [Embedding]
- Score: Cosine(Query, Doc) 计算速度极快(点积),适合大规模检索(Top-100)。
1.2 Cross-Encoder (Reranker)
Cross-Encoder 把 Query 和 Doc 拼在一起,作为一个整体输入给 BERT 模型。
- Input:
[CLS] Query [SEP] Doc [SEP] - Output: 一个分数(Score),表示两者的相关性。 由于模型能同时看到 Query 和 Doc 的所有 Token 交互(Full Attention),精度远高于 Bi-Encoder。 但计算量大,只适合对少量文档(Top-50)进行重排。
2. 架构模式:Retrieve-then-Rerank
RAG 标准流程:
- Retrieve: 使用 Vector Search(Bi-Encoder)从 100M 文档中召回 Top-50。
- Rerank: 使用 Cross-Encoder 对这 50 个文档进行打分。
- Filter: 取 Top-5 分数最高的文档。
- Generate: 把 Top-5 文档喂给 LLM。
这种架构兼顾了速度(Retrieve)和精度(Rerank)。
3. 开源 Reranker 选型
3.1 BGE-Reranker (BAAI)
目前开源界最强的 Reranker 之一。
BAAI/bge-reranker-largeBAAI/bge-reranker-base多语言支持好,中文效果出色。
3.2 Cohere Rerank API
商业 API,效果极佳,且无需自己部署模型。 只需调用 cohere.rerank(query, documents) 即可。
3.3 Jina Reranker
支持超长上下文(8K Token)的 Reranker。 适合对长文档进行重排。
4. 实战代码:使用 Sentence-Transformers
python
from sentence_transformers import CrossEncoder
# 1. 加载模型
model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
# 2. 准备数据
query = "How many people live in Berlin?"
documents = [
"Berlin had a population of 3.5 million people.",
"Berlin is well known for its museums.",
"Germany has a population of 83 million."
]
# 3. 构造 Input Pairs
pairs = [[query, doc] for doc in documents]
# 4. 打分
scores = model.predict(pairs)
# 5. 排序
ranked_docs = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
for doc, score in ranked_docs:
print(f"{score:.4f}: {doc}")5. 性能优化
虽然 Rerank 比 Retrieve 慢,但通常只需要几十毫秒(Top-50)。 如果对延迟极其敏感:
- 模型蒸馏:用大模型(GPT-4)蒸馏一个小型的 Cross-Encoder。
- 量化:使用 INT8 量化的 Reranker(ONNX Runtime)。
- ColBERT:一种介于 Bi-Encoder 和 Cross-Encoder 之间的 Late Interaction 架构,速度接近 Bi,精度接近 Cross。
Reranker 是 RAG 系统的性价比之王。 加上它,只需增加极少的延迟(< 50ms),就能让检索准确率(MRR@10)提升 10-20 个点。 它是连接粗糙检索与精准生成的黄金桥梁。