建立一個生產級的檢索增強生成 (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 背後的團隊撰寫的文章