bge-reranker
开源权重自建部署多语言
来自智源研究院(BAAI)的 bge-reranker 系列,是专门为段落重排序训练的开源权重 cross-encoder。它们是自建部署的标准选择:免费下载、可直接接入 sentence-transformers,也是其他大多数重排序模型拿来对比的开源基线。
模型变体
| 模型 | 参数量 | 语言 | 最适合 |
|---|---|---|---|
BAAI/bge-reranker-base | 278M | 中文、英文 | CPU 推理快,良好基线 |
BAAI/bge-reranker-large | 560M | 中文、英文 | 质量更强,同样支持中英两种语言 |
BAAI/bge-reranker-v2-m3 | 568M | 100+ 种语言 | 综合最佳;多语言主力 |
BAAI/bge-reranker-v2-gemma | 2.5B | 100+ 种语言 | 质量最高;需要 GPU |
建议:从 bge-reranker-v2-m3 开始。它支持多语言、体量小到可以跑在 CPU 上,中等流量下完全够用。只有当你有 GPU 且需要极致质量时,才升级到 Gemma 变体。
基准测试
BAAI 给两代模型用的是不同的基准,所以两列都不完整:v2 测的是 BEIR(英文检索),v1 测的是 C-MTEB 重排序(以中文为主)。
| 模型 | BEIR NDCG@10(均值) | C-MTEB 重排序(MAP 均值) |
|---|---|---|
| bge-reranker-base | 未公布 | 65.42* |
| bge-reranker-large | 未公布 | 66.10* |
| bge-reranker-v2-m3 | 55.36* | 未公布 |
| bge-reranker-v2-gemma | 60.71* | 未公布 |
* 所有数字均为 BAAI 自己公布的。BEIR:15 个数据集,对 bge-large-en-v1.5 召回的前 100 条结果重排(FlagEmbedding llm_reranker 评测)。C-MTEB:六个重排序数据集上的 MAP 均值 —— T2Reranking 及其两个跨语言变体、MMarcoReranking、CMedQAv1 和 CMedQAv2(FlagEmbedding reranker README)。其他评测方用各自的设置会得到不同的 BEIR 分数 —— Jina 的论文里 v2-m3 是 56.51* —— 所以请只在同一来源内比较模型。2026 年 10 月之前,本表给四个模型都列了 BEIR 和 MS MARCO 分数,但我们查不到任何出处,现已删除。
快速上手
安装
pip install sentence-transformers
对一组段落重排序
from sentence_transformers import CrossEncoder
model = CrossEncoder("BAAI/bge-reranker-v2-m3", max_length=512)
query = "How do I add reranking to my RAG pipeline?"
passages = [
"Rerankers score each query-passage pair with a cross-encoder.",
"BM25 is a classical keyword-based retrieval method.",
"London is the capital of the United Kingdom.",
"Two-stage retrieval: retrieve 50 candidates, rerank to top 5.",
]
scores = model.predict([(query, p) for p in passages])
ranked = sorted(zip(scores, passages), reverse=True)
for score, text in ranked:
print(f"{score:.4f} {text[:80]}")
在 RAG 流水线中
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
def rag_answer(query: str, vector_db, llm) -> str:
# Stage 1: retrieve wide
candidates = vector_db.search(query, top_k=50)
# Stage 2: rerank tight
scores = reranker.predict([(query, c) for c in candidates])
top5 = [c for _, c in sorted(zip(scores, candidates), reverse=True)[:5]]
# Stage 3: generate
return llm.complete(f"Context:\n" + "\n\n".join(top5) + f"\n\nQ: {query}")
优缺点
优点
- 完全免费 —— 无 API 密钥、无按次成本
- BAAI 公布了 BEIR 成绩,也是其他厂商评测里最常用的对比基线
- 通过 sentence-transformers / HuggingFace 轻松集成
- 多语言(v2-m3 覆盖 100+ 种语言)
- 完全可控:量化、微调、蒸馏
- 智源 BAAI 持续活跃开发
缺点
- 自己托管、自己运维 —— 有基础设施开销
- 候选超过约 50 个时,CPU 推理偏慢
- 没有 SLA,没有托管式弹性伸缩
- 最大的变体需要 GPU 才实用