主流重排模型对比:选对模型事半功倍

这篇文章解决什么问题

重排模型那么多,Cohere、BGE、Jina、MiniLM…到底选哪个?别急,这篇文章帮你把主流重排模型掰开了揉碎了讲,让你根据场景选对不选贵。

前言:重排模型的水很深

说起选重排模型,我就想起自己踩过的坑。

一开始听说Cohere Rerank效果好,直接上。结果:

  • 英文场景效果确实好
  • 中文场景效果一般
  • API调用还收费,成本蹭蹭涨

后来换成BGE-Reranker,中文效果好了,成本降了,但速度又慢了点。

所以啊,选重排模型真不是选最贵的,而是选最合适的。

一、重排模型分类

1.1 按架构分类

类型代表模型特点
Cross-EncoderBGE-Reranker, Cohere精度高,速度慢
Bi-Encoderall-MiniLM-L12速度快,精度一般
ColBERTColbertV2精度和速度平衡

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-base110M基础版,够用
BAAI/bge-reranker-large340M精度更高
BAAI/bge-reranker-v2-m3560M最新版,支持多语言

代码示例

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-v222M极快
cross-encoder/ms-marco-MiniLM-L-6-v2110M
cross-encoder/ms-marco-MiniLM-L-12-v2118M

代码示例

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-RerankerGPU成本免费大规模
Cohere按调用收费中小规模
Jina免费额度+收费中小规模
MiniLMGPU成本免费中小规模
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 RerankAPI简单,效果好
英文知识库(省钱)MiniLM-L-6开源免费,速度快
多语言知识库Jina Reranker支持好,有API
代码检索Voyage-code-2专用模型
企业级场景Cohere/VoyageSLA保障

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)

八、总结

选模型的核心逻辑

  1. 中文场景:首选BGE-Reranker,免费效果好
  2. 英文快速集成:Cohere API,省心
  3. 追求速度:MiniLM,极速
  4. 多语言:Jina Reranker
  5. 企业级:Voyage/Cohere

记住

  • 没有最好的模型,只有最适合的
  • 先用简单方案快速验证
  • 效果不够再考虑组合/微调
  • 成本和效果要平衡

相关主题


更新记录

  • 2026-04-24:改写完成,语言风格优化
  • 增加模型对比表和选型建议