深色模式
重排序 Re-ranking 模型
摘要:本文面向要在召回之后做精排的 RAG 工程师。Bi-encoder 嵌入为"快但不准",cross-encoder 重排为"准但慢"。生产做法是一阶段多路召回取较多候选(如 50–100),二阶段用重排模型压缩到 top-k(如 5–10)再喂生成。我们对比 Cohere Rerank 4.0(API)与 BGE-Reranker-v2-m3(开源)并给出配置。
重排不是可选项,是质量分水岭
召回 top-50 里相关文档排第 40,生成模型依旧会基于前几个噪声块瞎编。重排把真正相关的提到前面,直接拉升 context_precision 与最终 faithfulness(见 evaluation.md)。BGE-M3 README 也明确建议"hybrid retrieval + re-ranking"。
核心概念
| 类型 | 架构 | 输入 | 速度 | 精度 |
|---|---|---|---|---|
| Bi-encoder(嵌入) | 双塔,query/doc 独立编码 | query、doc 分别 | 快(可预存向量) | 中 |
| Cross-encoder(重排) | 拼接 query+doc 联合编码 | (query, doc) 对 | 慢(需实时算) | 高 |
Cross-encoder 让 query 与 doc 交互后再打相关性分,能捕捉细粒度对齐,但无法预计算,故只能用于少量候选的二阶段精排。
架构与原理
典型漏斗:召回多、重排精、生成少。召回候选数越大,重排收益越高,但重排成本也线性上升。
主流重排模型
| 模型 | 形态 | 上下文 | 语言 | 计费(参考) |
|---|---|---|---|---|
Cohere rerank-v4.0-pro | API | 32K token | 100+ | ~$0.0025/query |
Cohere rerank-v4.0-fast | API | 32K token | 100+ | ~$0.002/query |
BAAI/bge-reranker-v2-m3 | 开源本地 | 8192 token | 100+ | 自托管 GPU |
BAAI/bge-reranker-large | 开源本地 | 512 token | 中英 | 自托管 GPU |
关键事实(官方来源,访问日期 2026-10-09)
- Cohere Rerank 4.0 于 2025-12-11 发布,含 pro/fast 两档,上下文 32K token(较前代 8K 提升约 4×),支持 100+ 语言,分数归一化到 [0,1]。来源:Cohere 官方 changelog。
BAAI/bge-reranker-v2-m3:多语言、支持稠密/sparse/multi-vector 场景的 rerank,MIT 友好、可本地部署。来源:HuggingFaceBAAI/bge-reranker-v2-m3。- 价格随官方调整,以上为 2025-12 公开定价,落地前请查最新页。
生产实践
Cohere Rerank(API)
python
# pip install cohere
import cohere
co = cohere.ClientV2(api_key="COHERE_API_KEY")
docs = [c["text"] for c in candidates] # 一阶段召回的候选文本
resp = co.rerank(
model="rerank-v4.0-pro",
query="哪些商品不支持七天无理由退货?",
documents=docs,
top_n=5, # 精排后取前 5
)
for r in resp.results:
print(r.index, round(r.relevance_score, 3), docs[r.index][:40])1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
BGE-Reranker-v2-m3(本地)
python
# pip install sentence-transformers
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
pairs = [(query, c["text"]) for c in candidates]
scores = reranker.predict(pairs) # 相关性分数
ranked = sorted(zip(candidates, scores), key=lambda x: -x[1])[:5]1
2
3
4
5
6
2
3
4
5
6
候选数怎么定
召回候选取 20–100,视语料规模与重排成本定。候选太少重排无米之炊;太多重排延迟/费用上升。中文通用起点:召回 50、重排取 5–10。具体用评测定(evaluation.md)。
验证
bash
# 人工构造"难负例":语义相近但答非所问的文档应被重排压到低分
# 例:query 问"退货运费谁出",候选含"换货运费规则"(易误召)
# 期望重排后真正讲退货运费的文档排名靠前1
2
3
2
3
回滚与清理
重排模型切换影响排序分布
换重排模型(如 Cohere↔BGE,或 v3↔v4)会改变 top-k 排序,可能改变线上答案。灰度时对比新旧模型的 top-k 一致性(rank 重叠率),再放量。API 模型版本由供应商控制,需关注其弃用公告。
故障排查
- 重排后反而变差:候选池质量差(召回就错了)→ 先修召回/混合检索(hybrid-search.md)。
- 上下文被截断:Cohere v4 支持 32K,但旧版仅 4K/8K;超长 doc 会被截断 → 升级模型或缩短候选。
- API 限流:高 QPS 触发 429 → 批处理、退避重试、或换本地重排。
- 分数不可比:不同重排模型分数不可跨模型比较,仅用于同次排序内相对排序。
安全与合规
重排层的注入与成本风险
- 提示注入:候选文档中的恶意指令经重排后仍可能进入 top-k 被生成模型读取,重排不防注入,需在生成侧做隔离(见 llm-rag.md 安全章节)。
- 成本失控:重排按 query 计费(Cohere)或按 GPU 时长(本地)。开放入口必须限流 + 预算告警,避免被刷。
成本与性能
量级参考,非实测报价,按官方最新页核算。
- Cohere API:pro ~$0.0025/query、fast ~$0.002/query(2025-12);fast 适合高吞吐,pro 适合质量优先。
- 本地 BGE-Reranker:单卡(T4/A10)可承载中等 QPS,无按 query 费用但占 GPU;候选 50 × 每 query 一次前向,延迟通常数十毫秒量级[版本相关/需压测]。
- 权衡:召回候选越多越准但重排越贵;经验上"召回 50 + 重排到 5"在成本与质量间较平衡。