RAG-Retrieval:把 embedding、ColBERT 與 reranker 的微調收進同一套訓練程式碼
Unify Efficient Fine-tuning of RAG Retrieval, including Embedding, ColBERT, ReRanker.
秒懂
- 它是什麼?
- 這個專案處理的是 RAG 檢索端三種模型(embedding、late interaction、reranker)各自為政的訓練流程問題,並另外提供一個只做 reranker 推論的輕量套件。核心判斷是:訓練程式碼值得參考,推論套件則只覆蓋 reranker 這一塊,兩者成熟度不同。
- 適合誰用?
- 如果你手上已經有 bge、bce、gte 這類開源檢索模型,想用同一套程式碼跑 embedding、ColBERT 與 reranker 的微調,這個 repo 的目錄結構與 train_embedding.sh 這類入口腳本值得先讀一遍再決定要不要照抄。反過來說,如果你要的是開箱即用的檢索服務,它並不提供,PyPI 上的 rag-retrieval 只涵蓋 reranker 推論,embedding 與 ColBERT 的推論路徑要自己接。
- 可以商用嗎?
- 可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
- 還在維護嗎?
- 有在維護。儲存庫最近一次提交在 18 天前。
- 用什麼語言寫的?
- 主要是 Python(依據 GitHub 的語言統計)。
以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。
開源專案深度解析
它想解決的是檢索端訓練流程分裂的問題
RAG 的檢索端通常不是單一模型。向量召回用 embedding 模型,候選重排用 cross-encoder reranker,中間可能還有一層 late interaction 模型。這三類模型的訓練腳本、資料格式與損失函數在開源生態裡長期分散在不同 repo,換一類模型就要重寫一次訓練管線。RAG-Retrieval 的定位就是把這三條線收進同一個程式庫,README 的說法是提供 training、inference、distillation 的 end-to-end 程式碼。目標讀者是已經在跑 RAG、想針對自家語料微調檢索模型的人,而不是想直接呼叫 API 取得檢索結果的應用開發者。這個區分很重要,因為它決定了你該看 repo 的哪一半。
三種模型共用一個 repo,但各自獨立成子目錄
程式碼的組織方式並不複雜。訓練相關的內容放在 rag_retrieval/train/ 底下,依模型類型再分子目錄,例如 embedding 在 rag_retrieval/train/embedding,其餘類型比照辦理。每個子目錄有自己的 README 說明流程,README 明確寫出「For different model types, please go into different subdirectories」。這代表它不是一個抽象化的統一訓練框架,而是一組並排的訓練實作,共用 repo 與依賴,但彼此不互相呼叫。對要改程式碼的人來說這是好事,你不必先理解一層框架才能動 loss。對想要一個統一 API 的人來說則是壞消息,切換模型類型仍然要換目錄、換腳本、換設定。多 GPU 的部分由 deepspeed 與 fsdp 承擔,README 列為 feature,但沒有給出對應的啟動指令。
推論端只做了 reranker,而且刻意做成可繼承的介面
PyPI 上的 rag-retrieval 套件與訓練程式碼是兩件事。這個套件只處理 reranker 推論,README 的說法是提供 unified way to call any different RAG ranking models。具體覆蓋的模型是 Cross Encoder Reranker 與 Decoder-Only LLM Reranker 兩類。長文件的處理給了兩種邏輯:截斷到最大長度,或切段後取最高分。擴充方式是繼承 BaseReranker 並實作 rank 與 compute_score 兩個函式。這個設計的意圖很明顯,它假設你會遇到沒被內建支援的排序模型,所以把介面留給你。相對地,embedding 與 ColBERT 的推論不在這個套件範圍內,README 的 inference 段落從頭到尾只談 reranker。
安裝與啟動:兩條互不相干的路徑
訓練端的安裝流程是先建環境再裝依賴。README 給的指令是 conda create -n rag-retrieval python=3.8 然後 conda activate rag-retrieval,接著 pip install -r requirements.txt。這裡有一個它自己標註的注意事項:為了避免自動安裝的 torch 與本地 CUDA 不相容,建議在跑下一步之前先手動安裝對應版本的 torch。這個提醒不是客套話,Python 3.8 加上自行指定 torch 版本,意味著你要先確認本地驅動與 CUDA 版本。訓練的入口是進到子目錄後執行腳本,README 舉的例子是 cd ./rag_retrieval/train/embedding 然後 bash train_embedding.sh。推論端則完全獨立,一行 pip install rag-retrieval 即可,同樣附帶手動安裝 torch 的提醒。
蒸餾與 MRL 是這個 repo 比較少見的部分
除了微調,README 把蒸餾列為三大功能之一,方向是把較大的 LLM-based reranker 或 embedding 模型蒸餾到較小的模型,文件舉的目標規模是 0.5B 參數的 LLM 或 BERT-base。這對推論成本敏感、又不想放棄大模型效果的情境有實際意義。另一項是 embedding 模型支援 MRL 演算法,用來降低輸出向量的維度,README 引的是 arXiv 2205.13147。專案在 2024 年 6 月的更新中提到把 MRL loss 實作進 embedding 模型。這兩項功能的價值在於它們是訓練端的技巧,而不是推論端的包裝,也正好是這個 repo 相對其他檢索微調專案差異化的地方。至於蒸餾的具體腳本與設定檔,README 沒有展開,需要進對應子目錄看。
README 的實驗數據有一欄是空的
專案附了一張 reranker 在 MTEB Reranking 任務上的結果表,列出 bge-reranker-base、bce-reranker-base_v1 與 rag-retrieval-reranker 三個模型,欄位包含模型大小與 T2Reranking、MMarcoReranking、CMedQAv1、CMedQAv2 四個資料集。rag-retrieval-reranker 的模型大小標為 0.41 GB,明顯小於前兩者的 1.11 GB,在 CMedQAv1 與 CMedQAv2 上的數字也較高。但表格最後一欄 Avg 對這個模型是空白的,而前兩個模型分別是 67.03 與 66.33。同時它在 MMarcoReranking 上的 31.57 低於前兩者的 35.46 與 34.13。這張表能支持的結論有限:小模型在中文醫療問答上表現不錯,但在多語言檢索上退步,而作者沒有給出平均值,讀者不該自己補上一個看起來漂亮的數字。
什麼情況下它不是對的工具
第一種情況是你需要一個完整的檢索服務。這個 repo 不提供索引建立、向量資料庫整合或查詢服務,PyPI 套件只做 reranker 打分。第二種情況是你的模型不在相容清單內。README 列出的相容對象是 bge、bce、gte 這幾個系列,包含 bge-embedding、bge-m3、bge-reranker、bce-embedding、bce-reranker、gte-embedding、gte-multilingual-reranker-base。清單之外的模型能不能直接套用,文件沒有保證。第三種情況是你期待穩定介面。最近一次 release 是 2024 年 5 月的 rag_retrieval_only_train,標示為 v0.1,而 repo 在 2026 年 8 月仍有推送。訓練程式碼與發布版本之間存在時間落差,從 PyPI 安裝得到的東西與 master 分支上的內容未必一致。如果你要的是長期穩定的 API 契約,這個專案的版本節奏需要先確認。
和 Sentence Transformers 的差別在於覆蓋範圍與抽象層次
同樣做檢索模型微調,Sentence Transformers 走的是另一條路:它把多種模型架構包成一個統一的 Trainer 與 losses 介面,你寫一份訓練腳本就能換模型,代價是要接受它定義的抽象層,改動底層行為時得先讀懂框架。RAG-Retrieval 反其道而行,README 自稱 Simple yet Elegant,強調 rejects complex,實際上就是把三類模型各自的訓練腳本並排放在 train/ 底下,靠目錄隔離而非介面統一。這個取捨的直接後果是:想快速換模型做對照實驗,Sentence Transformers 的統一介面省事;想直接改某個模型的 loss 或資料流,不必先穿過一層框架,RAG-Retrieval 的平鋪結構更好下手。ColBERT 這種 late interaction 模型在 Sentence Transformers 裡並非主要支援對象,這也是 RAG-Retrieval 覆蓋範圍上的差異點。
授權與後續維護成本
授權是 MIT,這對商業使用相對寬鬆,但程式碼中若引入其他套件或預訓練權重,那些元件的授權需要各自確認,這部分文件沒有整理,也不是本文能代為判斷的。維護成本要分開看。推論套件 rag-retrieval 走 PyPI 發布,升級路徑清楚,但它的擴充方式是繼承 BaseReranker,一旦上游改了介面,你的子類別就要跟著改。訓練程式碼則沒有發布週期可言,README 的更新紀錄停在 2025 年 5 月的 Myopic Trap 研究,之後的變動只能從 commit 判斷。如果你把訓練腳本拉進自己的管線,實際上是在維護一份 fork,requirements.txt 中 torch 版本與 CUDA 的綁定關係會是最常出問題的地方。
編輯結論
如果你手上已經有 bge、bce、gte 這類開源檢索模型,想用同一套程式碼跑 embedding、ColBERT 與 reranker 的微調,這個 repo 的目錄結構與 train_embedding.sh 這類入口腳本值得先讀一遍再決定要不要照抄。反過來說,如果你要的是開箱即用的檢索服務,它並不提供,PyPI 上的 rag-retrieval 只涵蓋 reranker 推論,embedding 與 ColBERT 的推論路徑要自己接。動手前先確認三件事:requirements.txt 中 torch 與你本地 CUDA 的版本關係、你要用的模型是否落在它列出的 bge/bce/gte 相容範圍內、以及 README 中那個 reranker 平均分欄位留空的原因。
社群筆記