模型 / 数据集
NovaSearch-Team/RAG-Retrieval avatar
NovaSearch-Team/RAG-Retrieval

RAG-Retrieval:把 Embedding、ColBERT 与 Reranker 的微调收进同一套训练代码

Unify Efficient Fine-tuning of RAG Retrieval, including Embedding, ColBERT, ReRanker.

1,129 个 Star87 个 ForkPythonMIT
GitHub

秒懂

它是什么?
它解决的是 RAG 检索侧模型训练代码分散的问题:同一仓库里给出 embedding、late interaction 与 reranker 三类模型的微调、蒸馏和统一推理接口。判断是,训练部分值得当作可改的参考实现来读,推理部分才适合直接当依赖装进项目。
适合谁用?
如果你的团队正在自己微调 bge、bce、gte 这类开源检索模型,或者需要把 LLM reranker 蒸馏到 BERT-base、0.5B 级别的小模型,这个仓库的训练代码值得先读一遍再改,MIT 许可也允许你直接改。反过来,如果你只是想在已有 RAG 链路里加一个 reranker,不需要训练,那只需要 pip install rag-retrieval 这一个包,不必把整个训练仓库拉下来。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 18 天前。
用什么语言写的?
主要是 Python(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它填补的是检索侧训练代码的空白,不是 RAG 框架本身

RAG-Retrieval 不负责文档切分、向量库写入、prompt 拼装这些环节。README 把范围写得很清楚:训练、推理、蒸馏三件事,全部围绕检索模型。训练覆盖 embedding 模型(bert-based 与 llm-based)、late interaction 模型(ColBERT)、reranker 模型(bert-based 与 llm-based);推理侧只聚焦 reranker,做成一个轻量 Python 库 rag-retrieval;蒸馏则是把大的 embedding 或 reranker 模型压到 0.5B LLM 或 bert-base。

目标读者是已经在做检索微调、手上有标注或合成训练数据的人。如果你的流程还停留在直接调用 bge 的预训练权重,这个仓库帮不上忙,因为它提供的是训练代码而不是更好的权重。仓库的 Features 里有一句自我描述,说代码结构追求简单可改。这句话可以当作选型依据:它更像一份可以拿来改的参考实现,而不是一个封装好、你只需要传参数的训练框架。

按模型类型分子目录,训练入口是每个子目录下的脚本

仓库的组织方式是按模型类型切分,而不是按训练阶段切分。README 给出的路径是 rag_retrieval/train/embedding,并说明其他类型同理,各自子目录里还有独立的 README 描述详细流程。训练入口是 shell 脚本,例如在 embedding 目录下执行 bash train_embedding.sh。这意味着超参、数据路径、模型名这些配置分散在脚本和对应的配置文件中,换模型类型就要换目录,不存在一个全局统一的训练命令。

这种结构的代价是你要读多个 README 才能拼出全貌,好处是改起来不会牵一发动全身。README 里没有给出各子目录配置文件的字段清单,所以具体要改哪些 key,只能进到对应目录看文件本身。这一点在评估阶段就应该确认,因为它直接决定接入成本。

推理侧是独立的 pip 包,靠继承 BaseReranker 扩展

训练和推理被拆成了两条安装路径。训练要克隆仓库并执行 pip install -r requirements.txt,README 特别提醒自动安装的 torch 可能和本地 CUDA 不兼容,建议先手动装好匹配版本的 torch。推理只需要 pip install rag-retrieval,装的是发布在 PyPI 上的独立库。

这个库的抽象点是 BaseReranker,扩展新模型时继承它并实现 rank 与 compute_score 两个函数。它兼容 Cross Encoder Reranker 和 Decoder-Only LLM Reranker 两类常见排序模型,对长文档给出两种处理逻辑:按最大长度截断,或者切分后取最高分。第二种逻辑对长文本召回的排序更友好,但也意味着一次查询要跑多次前向,延迟会随切分块数线性增长。这个取舍在文档里是明说的,选型时需要按你的延迟预算决定。

蒸馏与 MRL:把大模型压小,把向量维度压短

仓库在算法层面支持两件具体的事。一是蒸馏,README 说支持从更大的模型蒸馏到更小的模型,例子是 0.5B 参数的 LLM 或 BERT-base,覆盖 embedding 与 reranker 两类。二是 MRL(Matryoshka Representation Learning),用于降低 embedding 输出向量的维度。发布记录里 2024-06-05 那条专门讲在 embedding 模型中实现 MRL loss。

MRL 的实际意义是向量维度可截断,存储和检索成本随之下降,代价是低维截断后的召回质量需要你自己在业务数据上验证,README 没有给出维度与效果的对应表。仓库还提到 2024-12-29 发布的 Stella 与 Jasper embedding 模型的 stage3 核心训练代码,以及 2024-10-21 给出的两种基于 LLM 的 reranker 任务方法及其蒸馏到 BERT 的方案。这些都是代码和方法说明,不是可以直接拿来用的权重,别把两者混为一谈。

README 里的实验表格缺了一行关键数字

仓库在 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 的模型。

问题在于这张表的 Avg 列,rag-retrieval-reranker 这一行的平均值是空的。也就是说,只能看到它在 CMedQAv1 和 CMedQAv2 上高于两个基线,在 T2Reranking 与 MMarcoReranking 上低于基线,但仓库没有给出汇总数字。看到这类表格时应该自己按权重算,而不是默认它整体更优。另外,表格里没有说明这些数字是训练后的结果还是官方权重的结果,也没有给出评测脚本的调用方式,复现前需要先确认这两点。

什么情况下它不合适

第一,如果你不做微调,只想要一个开箱可用的排序模型,那这个仓库的价值只剩推理库那一部分,训练代码对你完全是负担。第二,如果你的检索模型不在它列出的兼容范围内,README 点名的是 bge 系列(bge-embedding、bge-m3、bge-reranker)、bce 系列(bce-embedding、bce-reranker)和 gte 系列(gte-embedding、gte-multilingual-reranker-base),其他架构需要你自己判断接口是否对得上。第三,多卡训练依赖 deepspeed 和 fsdp,这两条路径的配置复杂度不低,单卡能跑完的实验没必要引入。

还有一个容易被忽略的点:仓库最近一次发布是 2024-05-04 的 v0.1,之后的功能更新体现在代码和文章里,而不是版本号上。如果你的流程依赖语义化版本做依赖锁定,需要确认 master 分支的实际状态,而不是照着 v0.1 的发布说明来预期。

和 Sentence Transformers 的差别在抽象层次

Sentence Transformers 也做 embedding 微调,但它的抽象是统一的 Trainer 加 loss 类,你换模型、换损失函数都在同一套 API 里完成,代价是底层训练循环被封装,想改动数据流或加自定义的负采样策略要绕开封装。RAG-Retrieval 走的是另一条路:按模型类型分目录,每个目录给一份可以直接读、直接改的训练脚本。

差别不在于谁支持更多模型,而在于你愿不愿意读训练循环。要做 ColBERT 这类 late interaction 模型的微调,或者要把 LLM reranker 蒸馏进 BERT,前者的现成支持不一定覆盖你的组合,后者至少把这几条路径的代码摆在了仓库里。反过来说,如果你的需求就是标准的双塔 embedding 微调,Sentence Transformers 的封装能省掉大量样板代码,没必要为了统一而统一。

维护成本与许可边界

MIT 许可意味着你可以修改、商用、闭源分发,义务基本只有保留版权声明和许可文本。需要自己判断的是模型权重的许可:仓库训练代码是 MIT,但你加载的 bge、bce、gte 权重各有自己的许可条款,蒸馏出来的小模型该按哪一方的条款分发,README 没有涉及,这属于需要你自己核对的部分。

维护成本主要来自依赖。训练侧依赖 torch、deepspeed、fsdp 这一整套,README 明确提示 torch 与本地 CUDA 的版本匹配要手动处理,这通常意味着环境搭建是整个流程里最容易出问题的一步。推理侧的 rag-retrieval 包依赖轻得多,升级风险也小。如果你的项目同时用到两边,建议把训练环境和线上推理环境彻底分开,不要让训练侧的依赖版本约束住线上服务。

编辑结论

如果你的团队正在自己微调 bge、bce、gte 这类开源检索模型,或者需要把 LLM reranker 蒸馏到 BERT-base、0.5B 级别的小模型,这个仓库的训练代码值得先读一遍再改,MIT 许可也允许你直接改。反过来,如果你只是想在已有 RAG 链路里加一个 reranker,不需要训练,那只需要 pip install rag-retrieval 这一个包,不必把整个训练仓库拉下来。动手前先确认三件事:你本地的 CUDA 与 torch 版本是否匹配,因为 README 明确建议先手动装 torch 再装 requirements;你要用的模型是否属于它列出的 bge、bce、gte 系列,不在其中的模型需要自己确认接口;以及多卡训练时 deepspeed 与 fsdp 哪条路径在你的机器上真正跑得通。

官方来源

  1. Issues
  2. License: MIT
  3. NovaSearch-Team/RAG-Retrieval on GitHub
  4. README
  5. Releases
社区笔记

社区笔记