Reranker 重排模型:两阶段检索的精排利器
1. 什么是 Reranker
Reranker(重排模型)是信息检索系统中的第二阶段精排组件。它的任务很简单:给定一个查询和一组候选文档,对每个文档打一个相关性分数,然后重新排序。
听起来平平无奇,但它解决了向量搜索的核心痛点——召回容易,排准很难。
2. 为什么需要两阶段检索
2.1 单阶段的困境
假设你有一个 100 万文档的知识库,用户问"OpenClaw 怎么配置 TTS":
纯向量搜索(Bi-Encoder):
Query → Encoder → 向量 q
Doc → Encoder → 向量 d(离线预计算)
相似度 = cosine(q, d)
- ✅ 快:毫秒级检索百万文档(ANN 近似最近邻)
- ❌ 粗:query 和文档各自编码,互相看不到
- ❌ 语义漂移:"苹果手机维修" 可能匹配到 "苹果营养价值"
纯 Cross-Encoder(精排模型):
[Query, Doc] → 拼接输入 → Encoder → 相关性分数
- ✅ 准:query 和文档拼在一起,模型能看到完整交互
- ❌ 慢:每对 query-doc 都要过一遍模型,100 万文档 = 100 万次推理
2.2 两阶段的解法
用户查询
│
▼
┌───────────────────────────────┐
│ 第一阶段:召回(Retrieval) │
│ 方法:向量搜索 / BM25 / 混合检索 │
│ 从 100 万文档粗筛 → Top 100 │
│ 速度:毫秒级 │
│ 精度:中等 │
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ 第二阶段:重排(Rerank) │
│ 方法:Cross-Encoder 重排模型 │
│ 对 100 条精排 → Top 10 │
│ 速度:百毫秒级 │
│ 精度:高 │
└───────────────┬───────────────┘
▼
最终结果
核心思路:用快的方法缩小范围,用准的方法精选结果。
3. 技术原理
3.1 Bi-Encoder vs Cross-Encoder
这是理解 Reranker 的关键区分:
| 维度 | Bi-Encoder(召回) | Cross-Encoder(重排) |
|---|---|---|
| 输入 | query 和 doc 分开编码 | query 和 doc 拼接后一起编码 |
| 交互 | 无(各编各的) | 有(全层 cross-attention) |
| 输出 | 两个向量 → 算余弦 | 单个相关性分数 |
| 速度 | 极快(向量预计算) | 慢(每对都要推理) |
| 精度 | 中等 | 高 |
| 适用规模 | 百万-亿级 | 十-百级 |
形象比喻:
- Bi-Encoder 像是看简历筛选——快速扫一眼关键词,粗筛 100 人
- Cross-Encoder 像是面试——深入交谈,从 100 人里选出最合适的 10 人
3.2 Reranker 的内部工作
输入:[CLS] OpenClaw 怎么配置 TTS [SEP] 在 openclaw.yaml 中设置 tts.provider 为 elevenlabs... [SEP]
↓
Transformer 模型
(BERT/DeBERTa 变体)
↓
[CLS] token 的隐藏状态
↓
线性层 → sigmoid
↓
相关性分数:0.94
关键在于:query 和 document 的 token 在 Transformer 的每一层都能通过 attention 互相"看到"对方,这让模型能捕捉到细粒度的语义匹配关系。
3.3 训练方式
Reranker 通常通过对比学习训练:
正样本对:(query, 相关文档) → 目标分数高
负样本对:(query, 不相关文档) → 目标分数低
高质量的负样本(hard negatives)是训练的关键——那些"看起来相关但实际不相关"的文档最有训练价值。
4. 主流 Reranker 模型
4.1 开源模型
| 模型 | 来源 | 参数量 | 中文 | 特点 |
|---|---|---|---|---|
| **bge-reranker-v2-m3** | BAAI 智源 | 568M | ⭐⭐⭐⭐⭐ | 多语言最强开源,MTEB 排名顶尖 |
| **bge-reranker-v2-gemma** | BAAI 智源 | 2B | ⭐⭐⭐⭐⭐ | 基于 Gemma,更大更准 |
| **GTE-Qwen2-reranker** | 阿里 | 1.5B | ⭐⭐⭐⭐⭐ | 基于 Qwen2,中英文效果好 |
| **Jina Reranker v2** | Jina AI | 137M | ⭐⭐⭐⭐ | 轻量多语言,8K 上下文 |
| **mxbai-rerank-large** | Mixedbread | 335M | ⭐⭐⭐ | 英文为主,速度快 |
| **ms-marco-MiniLM-L-12** | 微软 | 33M | ⭐⭐ | 经典入门款,极轻量 |
| **bce-reranker-base_v1** | NetEase 有道 | 279M | ⭐⭐⭐⭐ | 中英双语,有道出品 |
4.2 商业 API
| 服务 | 特点 | 价格 |
|---|---|---|
| **Cohere Rerank 3.5** | 效果最好之一,多语言,100+ 语言 | $2/1K 次搜索 |
| **Voyage Reranker** | YC 公司,与 Anthropic 合作 | $0.05/1M tokens |
| **Jina Reranker API** | 简单易用 | 免费层 1M tokens/月 |
| **Mixedbread Rerank** | 高性价比 | $0.50/1M tokens |
4.3 选型建议
中文场景 → bge-reranker-v2-m3 或 GTE-Qwen2
英文场景 → Cohere Rerank 3.5(API)或 mxbai-rerank(自部署)
轻量部署 → ms-marco-MiniLM(33M,CPU 也能跑)
追求极致 → bge-reranker-v2-gemma(2B,需 GPU)
5. 实际应用场景
5.1 RAG(检索增强生成)
这是 Reranker 最主流的应用场景:
用户问题
│
▼
向量检索 → Top 50 候选 chunks
│
▼
Reranker 精排 → Top 5 最相关 chunks
│
▼
拼接到 LLM prompt → 生成回答
没有 Reranker 的 RAG: LLM 可能拿到不太相关的上下文,回答质量差
有 Reranker 的 RAG: LLM 拿到精准的上下文,回答质量显著提升
实测数据:加入 Reranker 后,RAG 系统的回答准确率通常提升 5-15%。
5.2 搜索引擎
BM25 关键词匹配 → Top 1000
↓
向量语义搜索 → 混合排序 → Top 100
↓
Reranker → Top 10 → 展示给用户
5.3 推荐系统
电商/内容推荐的 "召回→粗排→精排→重排" 四阶段漏斗中,Reranker 负责最后一步。
5.4 问答系统
从知识库中找到最佳答案段落,Reranker 确保排在第一的确实是最相关的。
6. 代码实战
6.1 使用 sentence-transformers(最简单)
from sentence_transformers import CrossEncoder
# 加载模型
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3", max_length=512)
query = "OpenClaw 怎么配置 TTS"
candidates = [
"在 openclaw.yaml 中设置 tts.provider 为 elevenlabs,配置 voice 和 model 参数",
"OpenClaw 是一个 AI 助手框架,支持多种渠道接入",
"TTS 全称 Text-to-Speech,将文字转换为语音",
"使用 tts 工具可以直接在对话中生成语音消息",
]
# 打分
scores = reranker.predict([(query, doc) for doc in candidates])
# 排序
ranked = sorted(zip(candidates, scores), key=lambda x: -x[1])
for doc, score in ranked:
print(f"{score:.4f} | {doc[:50]}...")
输出:
0.9847 | 在 openclaw.yaml 中设置 tts.provider 为 eleve...
0.8234 | 使用 tts 工具可以直接在对话中生成语音消息...
0.1567 | TTS 全称 Text-to-Speech,将文字转换为语音...
0.0023 | OpenClaw 是一个 AI 助手框架,支持多种渠道接入...
6.2 使用 Cohere API
import cohere
co = cohere.Client("your-api-key")
results = co.rerank(
model="rerank-v3.5",
query="OpenClaw TTS 配置",
documents=candidates,
top_n=3,
)
for r in results.results:
print(f"{r.relevance_score:.4f} | {candidates[r.index][:50]}...")
6.3 集成到 LangChain RAG
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
# 基础检索器(向量搜索)
base_retriever = vectorstore.as_retriever(search_kwargs={"k": 50})
# 加上 Reranker
reranker = CohereRerank(model="rerank-v3.5", top_n=5)
retriever = ContextualCompressionRetriever(
base_compressor=reranker,
base_retriever=base_retriever,
)
# 使用
docs = retriever.invoke("OpenClaw 怎么配置 TTS")
# 返回的 5 条是经过 Reranker 精排的最相关文档
7. 性能与成本
7.1 延迟
| 模型 | 硬件 | 100 条文档延迟 |
|---|---|---|
| MiniLM-L-12 (33M) | CPU | ~50ms |
| bge-reranker-v2-m3 (568M) | CPU | ~500ms |
| bge-reranker-v2-m3 (568M) | GPU (T4) | ~30ms |
| bge-reranker-v2-gemma (2B) | GPU (A100) | ~100ms |
| Cohere API | 云端 | ~200ms(含网络) |
7.2 成本估算
假设 RAG 系统每天处理 10,000 次查询,每次重排 50 条文档:
| 方案 | 月成本 |
|---|---|
| 自部署 MiniLM(CPU) | ~$0(已有服务器) |
| 自部署 bge-m3(GPU T4) | ~$150/月(云 GPU) |
| Cohere API | ~$600/月 |
| Voyage API | ~$75/月 |
8. 常见误区
❌ "向量搜索已经够好了,不需要 Reranker"
向量搜索的 Top 1 准确率通常在 60-80%,加上 Reranker 可以提升到 80-95%。对于 RAG 场景,这个差距直接决定了 LLM 回答的质量。
❌ "Reranker 太慢了"
Reranker 只处理第一阶段返回的几十到几百条结果,不是全库搜索。在 GPU 上处理 100 条文档通常只需 30-100ms,完全可以接受。
❌ "用更大的 Embedding 模型不就行了"
Embedding 模型再大,本质上还是 Bi-Encoder——query 和 doc 分开编码,无法捕捉交互信息。Cross-Encoder 的架构优势不是参数量能弥补的。
❌ "LLM 本身就能做重排"
可以,但大材小用。用 GPT-4 对 100 条文档重排,成本和延迟都远高于专用 Reranker。不过在对精度要求极高的场景(如法律检索),LLM-as-Reranker 确实是一个可行方案。
9. 总结
| 要点 | 内容 |
|---|---|
| **是什么** | 两阶段检索中的第二阶段精排模型 |
| **为什么** | 向量搜索快但粗,Reranker 慢但准,两者配合 = 又快又准 |
| **怎么选** | 中文:bge-m3 / GTE-Qwen2;英文:Cohere / mxbai;轻量:MiniLM |
| **用在哪** | RAG(最主流)、搜索引擎、推荐系统、问答系统 |
| **效果** | RAG 准确率提升 5-15%,Top 1 准确率从 ~70% → ~90% |
一句话:向量搜索是海选,Reranker 是面试。好的搜索系统两者都需要。
参考资料:MTEB Leaderboard · BAAI bge-reranker · Cohere Rerank 文档 · sentence-transformers · Jina Reranker · LangChain Reranker 集成