Reranker训练

SWIFT已经支持Reranker模型的训练,目前已经支持的模型有:

  1. modernbert reranker模型

  2. qwen3-reranker模型

实现方式

目前SWIFT支持两种Reranker模型的实现方式,二者在架构和损失函数计算上有显著差异:

1. 分类式Reranker

适用模型: modernbert reranker模型(如gte-reranker-modernbert-base)

核心原理:

  • 基于序列分类架构,在预训练模型基础上添加分类头

  • 输入:query-document对,输出:单个相关性分数

2. 生成式Reranker

适用模型: qwen3-reranker模型(0.6B/4B/8B)

核心原理:

  • 基于生成式语言模型架构(CausalLM)

  • 输入:query-document对,输出:特定token的概率(如"yes"/"no")

  • 通过对比最后位置特定token的logits进行分类

损失函数类型

SWIFT支持多种损失函数来训练Reranker模型:

Pointwise损失函数

Pointwise方法将排序问题转化为二分类问题,独立处理每个query-document对:

  • 核心思想: 对每个query-document对进行二分类,判断文档是否与查询相关

  • 损失函数: 二分类交叉熵

  • 适用场景: 简单高效,适合大规模数据训练

环境变量配置:

  • GENERATIVE_RERANKER_POSITIVE_TOKEN:正例token(默认:"yes")

  • GENERATIVE_RERANKER_NEGATIVE_TOKEN:负例token(默认:"no")

Listwise损失函数

Listwise方法将排序问题转化为多分类问题,从多个候选文档中选择正例:

  • 核心思想: 对每个query的候选文档组(1个正例 + n个负例)进行多分类,识别正例文档

  • 损失函数: 多分类交叉熵

  • 适用场景: 学习文档间的相对排序关系,更符合信息检索的实际需求

环境变量配置:

  • LISTWISE_RERANKER_TEMPERATURE:softmax温度参数(默认:1.0)

  • LISTWISE_RERANKER_MIN_GROUP_SIZE:最小组大小,如果组内文档数量小于该值,则不计算损失(默认:2)

Listwise vs Pointwise:

  • Pointwise: 独立判断相关性,训练简单,但忽略了文档间的相对关系

  • Listwise: 学习相对排序,性能更优,更适合排序任务的本质需求

loss的源代码可以在这里找到。

数据集格式

{"query": "query", "response": "relevant_doc1", "rejected_response": ["irrelevant_doc1", "irrelevant_doc2", ...]}
{"query": "query", "response": "relevant_doc2", "rejected_response": ["irrelevant_doc1", "irrelevant_doc2", ...]}
...

字段说明:

  • query:查询文本

  • response:与查询相关的正例文档

  • rejected_response:与查询不相关的负例文档列表,支持多个负例

脚手架

SWIFT提供了两个脚手架训练脚本: