Reranker 重排模型:两阶段检索的精排利器

1. 什么是 Reranker

Reranker(重排模型)是信息检索系统中的第二阶段精排组件。它的任务很简单:给定一个查询和一组候选文档,对每个文档打一个相关性分数,然后重新排序。

听起来平平无奇,但它解决了向量搜索的核心痛点——召回容易,排准很难

2. 为什么需要两阶段检索

2.1 单阶段的困境

假设你有一个 100 万文档的知识库,用户问"OpenClaw 怎么配置 TTS":

纯向量搜索(Bi-Encoder):


Query → Encoder → 向量 q
Doc   → Encoder → 向量 d(离线预计算)
相似度 = cosine(q, d)

纯 Cross-Encoder(精排模型):


[Query, Doc] → 拼接输入 → Encoder → 相关性分数

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)
输出两个向量 → 算余弦单个相关性分数
速度极快(向量预计算)慢(每对都要推理)
精度中等
适用规模百万-亿级十-百级

形象比喻:

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 AI137M⭐⭐⭐⭐轻量多语言,8K 上下文
**mxbai-rerank-large**Mixedbread335M⭐⭐⭐英文为主,速度快
**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 集成