主流重排模型对比:选对模型事半功倍
这篇文章解决什么问题
重排模型那么多,Cohere、BGE、Jina、MiniLM…到底选哪个?别急,这篇文章帮你把主流重排模型掰开了揉碎了讲,让你根据场景选对不选贵。
前言:重排模型的水很深
说起选重排模型,我就想起自己踩过的坑。
一开始听说Cohere Rerank效果好,直接上。结果:
- 英文场景效果确实好
- 中文场景效果一般
- API调用还收费,成本蹭蹭涨
后来换成BGE-Reranker,中文效果好了,成本降了,但速度又慢了点。
所以啊,选重排模型真不是选最贵的,而是选最合适的。
一、重排模型分类
1.1 按架构分类
| 类型 | 代表模型 | 特点 |
|---|---|---|
| Cross-Encoder | BGE-Reranker, Cohere | 精度高,速度慢 |
| Bi-Encoder | all-MiniLM-L12 | 速度快,精度一般 |
| ColBERT | ColbertV2 | 精度和速度平衡 |
1.2 按训练方式分类
| 类型 | 说明 | 代表 |
|---|---|---|
| Pointwise | 每个文档单独打分 | 回归模型 |
| Pairwise | 比较文档对顺序 | BERT pairwise |
| Listwise | 优化整个列表 | LambdaMART |
1.3 按语言分类
| 语言 | 推荐模型 |
|---|---|
| 英文 | Cohere, MiniLM |
| 中文 | BGE-Reranker, Jina |
| 多语言 | Jina, BGE-M3 |
二、主流模型详解
2.1 BGE-Reranker(中文首选)
一句话评价:中文场景的王者,开源免费,香得很。
基本信息:
| 属性 | 值 |
|---|---|
| 开发方 | 智源(BAAI) |
| 模型类型 | Cross-Encoder |
| 开源 | 是 |
| 中文优化 | 是(原生支持) |
| 基础模型 | BERT |
支持版本:
| 模型 | 参数量 | 特点 |
|---|---|---|
| BAAI/bge-reranker-base | 110M | 基础版,够用 |
| BAAI/bge-reranker-large | 340M | 精度更高 |
| BAAI/bge-reranker-v2-m3 | 560M | 最新版,支持多语言 |
代码示例:
from flag_model import FlagReranker
# 初始化(支持中文)
reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True)
# 准备数据
query = "什么是深度学习"
documents = [
"深度学习是机器学习的一个分支...",
"深度学习在图像识别中有广泛应用...",
"今天天气不错,适合出门...",
"深度学习模型包括CNN、RNN等..."
]
# 计算分数
pairs = [[query, doc] for doc in documents]
scores = reranker.compute_score(pairs)
# 排序
scored_docs = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
print("排序结果:")
for doc, score in scored_docs:
print(f" [{score:.4f}] {doc[:50]}...")输出:
排序结果:
[7.2341] 深度学习是机器学习的一个分支...
[6.8912] 深度学习模型包括CNN、RNN等...
[5.4321] 深度学习在图像识别中有广泛应用...
[-2.1234] 今天天气不错,适合出门...优缺点:
| 优点 | 缺点 |
|---|---|
| 中文效果好 | 速度比MiniLM慢 |
| 开源免费 | 模型较大 |
| 支持多语言 | 需要GPU显存 |
| 持续更新 | - |
适用场景:
- 中文知识库
- 多语言知识库
- 需要高精度的场景
- 预算有限(免费!)
2.2 Cohere Rerank(英文首选)
一句话评价:英文场景的不二之选,API调用简单,效果拔群。
基本信息:
| 属性 | 值 |
|---|---|
| 开发方 | Cohere |
| 模型类型 | Cross-Encoder |
| 开源 | 否(API服务) |
| API费用 | 按调用量收费 |
| 英文优化 | 是(原生支持) |
支持的模型:
| 模型 | 适用场景 | 特点 |
|---|---|---|
| rerank-english-v2.0 | 英文通用 | 效果好 |
| rerank-multilingual-v2.0 | 多语言 | 支持100+语言 |
| rerank-english-v3.0 | 英文高精度 | 最新版 |
代码示例:
import cohere
# 初始化
co = cohere.Client("your-api-key")
# 准备数据
query = "machine learning basics"
documents = [
"Machine learning is a subset of AI...",
"The weather today is sunny...",
"Deep learning uses neural networks...",
"Python is a popular programming language..."
]
# 重排
response = co.rerank(
query=query,
documents=documents,
model="rerank-english-v2.0",
top_n=len(documents)
)
# 打印结果
print("排序结果:")
for result in response.results:
print(f" [{result.relevance_score:.4f}] {documents[result.index][:50]}...")输出:
排序结果:
[0.9876] Machine learning is a subset of AI...
[0.7654] Deep learning uses neural networks...
[0.2341] Python is a popular programming language...
[0.0012] The weather today is sunny...优缺点:
| 优点 | 缺点 |
|---|---|
| 英文效果极好 | 收费 |
| API简单易用 | 中文效果一般 |
| 支持多语言版本 | 依赖外部服务 |
| 云端托管 | 延迟略高 |
适用场景:
- 英文为主的业务
- 快速集成(不想部署模型)
- 多语言场景(rerank-multilingual)
成本估算:
# Cohere定价(参考,具体请查看官网)
# $1 = 1000次重排调用(大约)
# 如果每月100万次查询,每次重排50个文档
monthly_cost = (1_000_000 * 50) / 1000 * 1 # 美元
print(f"每月成本约: ${monthly_cost}")2.3 Jina Reranker(多语言友好)
一句话评价:多语言支持好,API和开源都有,灵活方便。
基本信息:
| 属性 | 值 |
|---|---|
| 开发方 | Jina AI |
| 模型类型 | Cross-Encoder |
| 开源 | 是 |
| API费用 | 有免费额度 |
| 多语言 | 是(支持100+) |
支持的模型:
| 模型 | 说明 |
|---|---|
| jina-reranker-v1 | 基础版 |
| jina-reranker-v2-base-en | 英文优化 |
| jina-reranker-v2-base-zh | 中文优化 |
代码示例:
# 使用API
import requests
# API调用
response = requests.post(
"https://api.jina.ai/rerank",
headers={"Authorization": f"Bearer {JINA_API_KEY}"},
json={
"model": "jina-reranker-v1",
"query": "深度学习的应用",
"documents": [
"深度学习广泛应用于计算机视觉...",
"今天吃了火锅...",
"深度学习是机器学习的子领域...",
],
"top_n": 3
}
)
result = response.json()
for item in result["results"]:
print(f"[{item['relevance_score']:.4f}] {item['document']['text'][:30]}...")或者使用开源模型:
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# 加载开源模型
model_name = "jinaai/jina-reranker-v2-base-multilingual"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
# 重排
pairs = [["查询", "文档1"], ["查询", "文档2"], ...]
inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors="pt", max_length=512)
with torch.no_grad():
outputs = model(**inputs)
scores = outputs.logits.squeeze(-1)优缺点:
| 优点 | 缺点 |
|---|---|
| 多语言支持好 | 精度略逊Cohere |
| API和开源都有 | 开源版部署复杂 |
| 免费额度够用 | - |
2.4 MiniLM(速度为王)
一句话评价:速度最快,适合对延迟敏感的场景。
基本信息:
| 属性 | 值 |
|---|---|
| 开发方 | Microsoft |
| 模型类型 | Cross-Encoder |
| 参数量 | 22M-110M(很小) |
| 速度 | 极快 |
支持的模型:
| 模型 | 参数量 | 速度 |
|---|---|---|
| cross-encoder/ms-marco-MiniLM-L-2-v2 | 22M | 极快 |
| cross-encoder/ms-marco-MiniLM-L-6-v2 | 110M | 快 |
| cross-encoder/ms-marco-MiniLM-L-12-v2 | 118M | 中 |
代码示例:
from sentence_transformers import CrossEncoder
# 初始化(轻量级模型)
model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-2-v2')
# 重排
query = "machine learning tutorial"
documents = [
"This tutorial covers machine learning basics...",
"The weather is nice today...",
"Learn deep learning with PyTorch...",
]
pairs = [[query, doc] for doc in documents]
scores = model.predict(pairs)
# 排序
scored_docs = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
print("排序结果:")
for doc, score in scored_docs:
print(f" [{score:.4f}] {doc[:50]}...")速度对比:
import time
# 测试不同模型的速度
models = [
'cross-encoder/ms-marco-MiniLM-L-2-v2',
'cross-encoder/ms-marco-MiniLM-L-6-v2',
'BAAI/bge-reranker-base',
]
for model_name in models:
model = CrossEncoder(model_name)
start = time.time()
for _ in range(100):
model.predict(pairs)
elapsed = time.time() - start
print(f"{model_name}: {elapsed:.2f}秒 / 100次 = {elapsed/100*1000:.1f}ms/次")输出示例:
cross-encoder/ms-marco-MiniLM-L-2-v2: 2.34秒 / 100次 = 23.4ms/次
cross-encoder/ms-marco-MiniLM-L-6-v2: 4.56秒 / 100次 = 45.6ms/次
BAAI/bge-reranker-base: 12.34秒 / 100次 = 123.4ms/次优缺点:
| 优点 | 缺点 |
|---|---|
| 速度极快 | 精度一般 |
| 模型小 | 英文为主 |
| 适合实时场景 | - |
2.5 Voyage Rerank(企业级)
一句话评价:企业级服务,稳定可靠,就是贵。
基本信息:
| 属性 | 值 |
|---|---|
| 开发方 | Voyage AI |
| 模型类型 | Cross-Encoder |
| API服务 | 是 |
| SLA保障 | 有 |
支持的模型:
| 模型 | 适用场景 |
|---|---|
| voyage-rerank-2 | 通用场景 |
| voyage-code-2 | 代码检索 |
代码示例:
import voyageai
# 初始化
vo = voyageai.Client(api_key="your-api-key")
# 重排
results = vo.rerank(
query="How to fine-tune a model?",
documents=[
"Fine-tuning BERT on custom data...",
"The weather is sunny...",
"Transfer learning techniques...",
],
model="voyage-rerank-2",
top_k=3
)
for r in results.results:
print(f"[{r.relevance_score:.4f}] {r.document[:50]}...")优缺点:
| 优点 | 缺点 |
|---|---|
| 企业级SLA | 贵 |
| 稳定性好 | 依赖外部服务 |
| 代码检索专用 | - |
三、横向对比表
3.1 功能对比
| 模型 | 中文支持 | 英文支持 | 多语言 | 开源 | API服务 |
|---|---|---|---|---|---|
| BGE-Reranker | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ | ❌ |
| Cohere | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ❌ | ✅ |
| Jina | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ | ✅ |
| MiniLM | ⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ✅ | ❌ |
| Voyage | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ❌ | ✅ |
3.2 性能对比
| 模型 | 精度(英文) | 精度(中文) | 速度 | 内存占用 |
|---|---|---|---|---|
| BGE-Reranker-large | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 中 | 高 |
| Cohere Rerank | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 快 | 云端 |
| Jina Reranker | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 快 | 中 |
| MiniLM-L-6 | ⭐⭐⭐ | ⭐⭐ | 极快 | 低 |
| Voyage Rerank | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 快 | 云端 |
3.3 成本对比
| 模型 | 部署成本 | 使用成本 | 适用规模 |
|---|---|---|---|
| BGE-Reranker | GPU成本 | 免费 | 大规模 |
| Cohere | 无 | 按调用收费 | 中小规模 |
| Jina | 无 | 免费额度+收费 | 中小规模 |
| MiniLM | GPU成本 | 免费 | 中小规模 |
| Voyage | 无 | 订阅制 | 企业级 |
四、选型决策树
4.1 先问自己几个问题
问题1:你的主要语言是什么?
├── 英文为主 → 问题2
└── 中文为主 → 推荐BGE-Reranker
└── 是否需要快速集成?
├── 是 → Cohere/Jina API
└── 否 → BGE-Reranker本地部署
问题2:对延迟要求高吗?
├── 是(毫秒级) → MiniLM
└── 否 → 问题3
问题3:预算充足吗?
├── 是 → Cohere/Voyage
└── 否 → 开源模型
4.2 懒人选择
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 中文知识库 | BGE-Reranker-v2-m3 | 效果好,免费 |
| 英文知识库(快速) | Cohere Rerank | API简单,效果好 |
| 英文知识库(省钱) | MiniLM-L-6 | 开源免费,速度快 |
| 多语言知识库 | Jina Reranker | 支持好,有API |
| 代码检索 | Voyage-code-2 | 专用模型 |
| 企业级场景 | Cohere/Voyage | SLA保障 |
4.3 我的推荐
个人开发/小团队:
首选:BGE-Reranker(中文)或 MiniLM(英文)
原因:免费,效果够用
中小企业:
首选:Cohere Rerank API
原因:省心,效果稳定
备选:Jina Reranker(有免费额度)
大型企业:
首选:Voyage Rerank + 自建BGE
原因:多副本保障,不同场景用不同模型
五、模型组合使用
5.1 为什么要组合
不同模型擅长不同场景,组合使用可以取长补短:
中文场景:先用BGE-Reranker检索
英文场景:先用Cohere Rerank重排
代码场景:再用Voyage-code-2精选
5.2 实现组合重排
class EnsembleReranker:
"""
组合重排器
融合多个模型的结果
"""
def __init__(self, rerankers, weights=None):
"""
rerankers: [{"model": model, "name": name}, ...]
weights: 各模型的权重
"""
self.rerankers = rerankers
self.weights = weights or [1.0] * len(rerankers)
def rerank(self, query, documents, top_k=10):
"""组合重排"""
all_scores = []
for reranker, weight in zip(self.rerankers, self.weights):
# 获取该模型的分数
scores = reranker.compute_score([[query, doc] for doc in documents])
# 归一化
scores = self._normalize(scores)
# 加权
weighted_scores = [s * weight for s in scores]
all_scores.append(weighted_scores)
# 合并分数
final_scores = [sum(scores[i] for scores in all_scores) for i in range(len(documents))]
# 排序
scored_docs = list(zip(documents, final_scores))
scored_docs.sort(key=lambda x: x[1], reverse=True)
return scored_docs[:top_k]
def _normalize(self, scores):
"""Min-Max归一化"""
min_s, max_s = min(scores), max(scores)
if max_s == min_s:
return [0.5] * len(scores)
return [(s - min_s) / (max_s - min_s) for s in scores]
# 使用
ensemble = EnsembleReranker([
{"model": bge_reranker, "name": "BGE"},
{"model": cohere_reranker, "name": "Cohere"},
], weights=[0.6, 0.4])
results = ensemble.rerank("深度学习教程", documents)六、模型微调
6.1 什么时候需要微调
需要微调:
- 领域非常专业(医疗、法律)
- 通用模型效果不好
- 有大量标注数据
不需要微调:
- 通用场景
- 数据量少
- 快速上线
6.2 微调数据准备
# 微调数据格式
train_data = [
{
"query": "深度学习是什么",
"positive": "深度学习是机器学习的分支,使用神经网络...",
"negative": "机器学习算法包括决策树、随机森林..."
},
# ... 更多数据
]
# 转换为训练格式
formatted_data = []
for item in train_data:
formatted_data.append({
"texts": [item["query"], item["positive"]],
"label": 1
})
formatted_data.append({
"texts": [item["query"], item["negative"]],
"label": 0
})6.3 微调代码
from sentence_transformers import CrossEncoder, InputExample
from torch.utils.data import DataLoader
# 准备数据
train_examples = [
InputExample(texts=["查询", "正例文档"], label=1),
InputExample(texts=["查询", "负例文档"], label=0),
]
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
# 初始化模型
model = CrossEncoder('bert-base-chinese', num_labels=2)
# 训练
model.fit(
train_dataloader=train_dataloader,
epochs=3,
warmup_steps=100,
learning_rate=2e-5
)
# 保存
model.save("my-reranker")七、常见问题
7.1 模型效果不稳定
可能原因:
- 模型版本不同
- 预处理不一致
- GPU/CPU差异
解决方案:
- 固定模型版本
- 统一预处理流程
- 使用FP16加速
7.2 内存占用太高
解决方案:
# 使用量化
model = CrossEncoder('model', max_length=256) # 限制长度
# 使用更小的模型
model = CrossEncoder('ms-marco-MiniLM-L-2-v2')
# 批量处理
for batch in batches:
scores = model.predict(batch)7.3 怎么评估模型效果
def evaluate_reranker(reranker, test_data):
"""
评估重排模型
test_data格式:
{
"query": "...",
"documents": [...],
"relevant_indices": [0, 2, 5] # 相关文档的索引
}
"""
from sklearn.metrics import ndcg_score
import numpy as np
ndcg_scores = []
for item in test_data:
query = item["query"]
docs = item["documents"]
relevant = set(item["relevant_indices"])
# 重排
pairs = [[query, doc] for doc in docs]
scores = reranker.predict(pairs)
# 按分数排序
ranked_indices = np.argsort(scores)[::-1]
# 构建理想排序
ideal_ranking = sorted(range(len(docs)),
key=lambda i: i in relevant,
reverse=True)
# 计算NDCG
ndcg = ndcg_score([1 if i in relevant else 0 for i in range(len(docs))],
[scores[i] for i in ranked_indices])
ndcg_scores.append(ndcg)
return np.mean(ndcg_scores)八、总结
选模型的核心逻辑:
- 中文场景:首选BGE-Reranker,免费效果好
- 英文快速集成:Cohere API,省心
- 追求速度:MiniLM,极速
- 多语言:Jina Reranker
- 企业级:Voyage/Cohere
记住:
- 没有最好的模型,只有最适合的
- 先用简单方案快速验证
- 效果不够再考虑组合/微调
- 成本和效果要平衡
相关主题
更新记录
- 2026-04-24:改写完成,语言风格优化
- 增加模型对比表和选型建议