构建一个生产级的检索增强生成 (RAG) 管道涉及许多决策——使用哪个嵌入模型、哪个向量数据库、如何分块文档,以及至关重要的,如何对检索结果进行排序。最终的排序步骤通常决定了平庸答案与优秀答案之间的差异。Rerankers 是来自 AnswerDotAI(FastAI 背后的团队)的开源 Python 库,以一个优雅、极简的接口处理了这个问题。
Rerankers 为数十种重排序模型和方法提供了一个统一的包装器,从经典的交叉编码器到基于 LLM 的列表式排序器和商业 API 服务。其核心哲学很简单:您应该能够通过更改一行代码来切换重排序策略。这使其对于原型设计和生产级 RAG 系统都非常有价值。
该库已在 NLP 和搜索社区中获得显著的关注。通过抽象化每个重排序方法的实现细节并公开一致的 rank(query, docs) 接口,Rerankers 让开发者专注于评估哪种策略最适合他们的领域,而不是与不兼容的 API 纠缠。
为什么重排序在现代 RAG 管道中至关重要?
在典型的 RAG 管道中,第一个检索步骤(初始检索)使用快速但较浅的方法,如 BM25 或密集嵌入相似度,从语料库中提取一组广泛的候选文档。这个初始集合可能包含数百份文档,其中许多只是间接相关。
重排序应用一个更强大——但较慢——的模型来重新排序这些候选,将真正相关的文档提升到顶部位置。由于重排序器只看到一个相对较小的候选集合(通常是 20 到 100 份文档),它可以负担使用计算密集型模型,如交叉编码器甚至基于 LLM 的排序器。
| RAG 阶段 | 方法 | 速度 | 准确度 | 文档量 |
|---|---|---|---|---|
| 初始检索 | BM25、密集嵌入 | 快 | 中等 | 100k - 1M |
| 重排序 | 交叉编码器、LLM 排序器 | 慢 | 高 | 20 - 100 |
| 生成 | LLM | 最慢 | 最高 | 3 - 10 (top-k) |
对下游生成质量的影响是巨大的。研究表明,与仅使用初始检索器的排序相比,添加交叉编码器重排序器可以在标准 RAG 基准测试中将答案准确度提高 10-25%。
Rerankers 支持哪些重排序方法?
Rerankers 将其支持的方法组织成几个类别,每个类别具有不同的准确度、速度和资源配置。
graph LR
A[查询 + 候选文档] --> B{重排序器类型}
B --> C[交叉编码器]
B --> D[LLM 列表式]
B --> E[基于 API]
B --> F[消融 / 无模型]
C --> G[BGE / mixedbread / ms-marco]
D --> H[RankGPT / RankZephyr / RankLlama]
E --> I[Cohere / Jina / Voyage / Together]
F --> J[随机 / 直通 / 身份]
G --> K[分数与排序结果]
H --> K
I --> K
J --> K交叉编码器
交叉编码器是最受欢迎的重排序架构。与双编码器(为查询和文档分别生成嵌入)不同,交叉编码器将查询和文档一起通过 transformer 处理,产生捕捉两个文本之间深层交互的相关性分数。Rerankers 支持 BAAI BGE、mixedbread-ai、ms-marco、jina 和其他流行的交叉编码器模型。
基于 LLM 的排序器
基于 LLM 的排序器使用语言模型直接比较文档。Rerankers 实现了两种方法:
| 方法 | 方式 | 优势 | 权衡 |
|---|---|---|---|
| 列表式 (RankGPT) | LLM 一次重排序所有候选 | 全局视角、上下文感知 | 昂贵、受上下文窗口限制 |
| 成对式 (RankZephyr) | LLM 成对比较文档 | 更细粒度、易于判断 | O(n^2) 比较、较慢 |
| 点式 (RankLlama) | LLM 独立对每个文档评分 | 简单、可并行化 | 上下文排序较差 |
基于 API 的排序器
对于偏好托管服务的团队,Rerankers 包装了来自 Cohere、Jina、Voyage 和 Together 的商业重排序 API。这些提供高质量排序,无需本地 GPU 基础设施。
如何开始使用 Rerankers?
开始使用 Rerankers 很简单。该库围绕一个可在几分钟内学会的极简 API 设计。
| 步骤 | 命令 / 代码 | 备注 |
|---|---|---|
| 安装 | pip install rerankers | 纯 Python,无大型依赖项 |
| 基本交叉编码器 | from rerankers import Reranker\nr = Reranker('ms-marco-MiniLM-L6-v2') | 首次使用时下载模型 |
| 排序文档 | results = r.rank(query='cat', docs=['dog', 'mouse']) | 返回带分数的排序列表 |
| API 重排序器 | r = Reranker('cohere', api_key=key, model='rerank-english-v3.0') | 需要 API 密钥 |
| LLM 重排序器 | r = Reranker('rankllama') | 需要本地 GPU |
API 的一致性意味着您可以通过更改单个参数,在轻量级交叉编码器和强大的基于 LLM 的排序器之间切换。这使得 Rerankers 成为在投入生产选择之前,针对您的特定数据对不同排序策略进行基准测试的理想工具。
# 更改一行即可切换重排序器
# r = Reranker('ms-marco-MiniLM-L6-v2') # 轻量级交叉编码器
# r = Reranker('cohere', api_key=COHERE_KEY) # 基于 API
# r = Reranker('rankllama') # 基于 LLM
results = r.rank("法国的首都是哪里?", documents)
for doc in results:
print(f"{doc.score:.3f} - {doc.text[:50]}")
何时应该在生产中使用每种重排序器类型?
选择合适的重排序器取决于您的延迟预算、准确度要求和基础设施限制。
| 场景 | 推荐的重排序器 | 理由 |
|---|---|---|
| 高吞吐量、低延迟 | ms-marco-MiniLM-L6-v2 | 在 GPU 上每个文档 <5ms |
| 最佳准确度、有 GPU | BAAI BGE 交叉编码器 | MTEB 排行榜顶端 |
| 无 GPU、中等预算 | Cohere rerank API | 托管式、准确度好 |
| 研究 / 基准测试 | 全部(通过行切换) | 易于比较 |
| 注重隐私 | 本地 RankLlama 或交叉编码器 | 数据永不离开您的基础设施 |
| 最高准确度、不计成本 | RankGPT 列表式 | 最佳排序、最高延迟 |
许多生产团队使用的实用策略是级联:使用快速交叉编码器将 100 个候选减少到 20 个,然后对最终子集应用更昂贵的 LLM 列表式排序器,以确定传递给生成 LLM 的前 3-5 份文档。
常见问题
什么是 Rerankers? Rerankers 是由 AnswerDotAI 开发的开源 Python 库,为数十种重排序模型和方法提供统一、极简的接口。它支持交叉编码器、基于 LLM 的列表式和成对排序器、基于 API 的服务(如 Cohere 和 Jina),甚至包括用于消融研究的常数分数排序器。
为什么在 RAG 管道中重排序很重要? 在 RAG 管道中,初始检索步骤(例如 BM25 或基于嵌入的搜索)会返回一组广泛的候选文档。重排序应用一个更昂贵但更准确的模型来重新排序这些候选,将最相关的文档推到顶部。这大大改善了馈送给 LLM 的上下文质量,而无需完全重新索引。
Rerankers 支持哪些重排序模型? Rerankers 支持交叉编码器(BAAI BGE、mixedbread-ai、ms-marco、jina)、基于 API 的重排序器(Cohere、Jina、Voyage、Together)、基于 LLM 的列表式排序器(RankGPT、RankZephyr、RankLlama),以及用于基线比较的无模型排序器,如随机、直通和身份排序器。
如何使用 Rerankers?
使用 pip install rerankers 安装并导入一个重排序器类。用模型名称实例化它,然后调用 reranker.rank(query, docs) 以获取带分数的排序文档列表。在模型之间切换只需要更改导入和模型名称。
Rerankers 与其他重排序库相比如何? Rerankers 通过其极简的 API 表面、单依赖项安装和广泛的模型支持来区分自己。与更复杂的框架不同,Rerankers 设计为只需单行更改即可切换,使其成为快速原型设计和基准测试的理想选择。
延伸阅读
- Rerankers GitHub 仓库 – 源代码、示例和社区讨论
- Cohere Rerank API 文档 – Cohere 的托管重排序服务
- MTEB 排行榜 – 按基准表现比较重排序器和嵌入模型
- AnswerDotAI FastAI 博客 – Rerankers 背后的团队撰写的文章