File size: 5,097 Bytes
0ab2566 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | # Instruct-Reranker
基于大语言模型(LLM)的多模态 Listwise 重排序训练与评估框架,用于电商搜索场景下的商品候选集重排。
## 项目结构
```
rerank_ins/
├── train/ # 训练脚本
│ ├── train_reranker_qwen3vl.py # Qwen3-VL-8B 训练
│ └── train_reranker_qwen35.py # Qwen3.5-9B 训练
├── eval/ # 评估脚本
│ ├── eval_reranker_qwen3vl.py # Qwen3-VL 评估 (vLLM)
│ └── eval_reranker_qwen35.py # Qwen3.5 评估 (Transformers)
├── models/ # 模型定义
│ ├── ranking_loss.py # RankingLoss + ListwiseLoss
│ ├── qwen3_vl_rank.py # Qwen3-VL DPO 变体
│ └── qwen3_5_rank.py # Qwen3.5 DPO 变体
├── collators/ # 数据 Collator
│ ├── base.py # 基类
│ ├── qwen_vl_rerank.py # 训练/评估 Collator
│ └── vision_process.py # 图像/视频预处理
├── loaders/ # 模型加载器
│ ├── base.py
│ ├── qwen3_vl.py
│ └── qwen3_5.py
├── dataset/ # 数据集
│ ├── data_utils.py # 消息构建工具
│ └── dataset_listwise.py # Listwise 数据集类
├── format_prompt/ # Prompt 模板
│ ├── listwise_reranker_v1.jinja # 单图模式 (query crop + doc crop)
│ └── listwise_reranker_v2.jinja # 双图模式 (query full+crop + doc full+crop)
├── ds_configs/ # DeepSpeed 配置
│ ├── zero2.json
│ └── zero3.json
├── scripts/ # 启动脚本
│ ├── train_qwen3vl.sh
│ ├── train_qwen35.sh
│ ├── eval_qwen3vl.sh
│ └── eval_qwen35.sh
├── arguments.py # 参数定义
├── supported_models.py # 模型注册
├── utils.py # 工具函数
├── setup.py
├── requirements.txt
└── README.md
```
## 数据格式
训练/评估数据为 JSONL 格式,每行一个样本:
```json
{
"query_image": "/path/to/query_image.jpg",
"query_crop_image": "/path/to/query_crop.jpg",
"instruction": "找相似款红色连衣裙",
"intent": "属性筛选",
"docs": [
{
"doc_image": "/path/to/doc_full.jpg",
"crop_image": "/path/to/doc_crop.jpg",
"doc_title": "商品标题",
"label": 0
}
]
}
```
**Label 定义**:
- `0`:绝对正例 — 品类正确,完全满足用户意图
- `1`:相对正例 — 品类正确,基本满足或边界模糊
- `2`:违约负例 — 品类正确但违背关键条件
- `3`:弱负例 — 品类不对,与需求无关
## 训练
记得在train中修改路径
### Qwen3-VL-8B(单图模式)
```bash
bash scripts/train/train_qwen3vl.sh
```
提交训练
```
bash scripts/submit/submit_train_qwen3vl.sh
```
### Qwen3.5-9B(双图模式,最佳效果)
```bash
bash scripts/train/train_qwen35.sh
```
提交训练
```
bash scripts/submit/submit_train_qwen35.sh
```
**关键超参数**:
| 参数 | Qwen3-VL | Qwen3.5 |
|------|----------|---------|
| 学习率 | 5e-6 | 1e-5 |
| Batch Size/GPU | 4 | 2 |
| Gradient Accum | 1 | 2 |
| Full+Crop 双图 | 否 | 是 |
| Max Crop Tokens | 80 | 160 |
| Flash Attention | 是 | 否 |
## 评估
### Qwen3-VL(基于 vLLM 加速推理)
```bash
python eval/eval_reranker_qwen3vl.py \
--model-path /path/to/checkpoint \
--eval-data /path/to/eval.jsonl \
--tp 2 --full-crop-mode
```
### Qwen3.5(基于 Transformers 原生推理)
```bash
python eval/eval_reranker_qwen35.py \
--model-path /path/to/checkpoint \
--eval-data /path/to/eval.jsonl \
--full-crop-mode
```
## 评估指标
| 指标 | 定义 |
|------|------|
| Strict Hit Rate@N | 只有 label=0 算命中 |
| Soft Hit Rate@N | label=0 和 label=1 都算命中 |
**排序方式**:从模型输出的 logits 中提取 token "0"/"1"/"2"/"3" 的概率,以 P(token="0") 降序排列候选商品。
## 模型原理
采用 **Listwise** 训练方式:
- **输入**:1 张查询图 + 用户 instruction + 10 张候选商品图像及标题
- **输出**:10 个连续数字(0-3),分别代表每个候选商品的相关性 label
- **排序依据**:取 token "0" 的概率作为排序分数(概率越高越相关)
## 支持的模型
| Model ID | 模型 | 推荐配置 |
|----------|------|----------|
| `qwen3-vl-8b` | Qwen3-VL-8B-Instruct | 单图 + v1 prompt |
| `qwen3_5-9b` | Qwen3.5-VL-9B | 双图 + v2 prompt(最佳) |
## 注意事项
1. 训练脚本中的 `MODEL_LOCAL_PATH`、`TRAIN_DATA_PATH`、`EVAL_DATA_PATH` 需要修改为实际路径
2. 默认冻结 Vision Encoder 和 Vision Projector,只训练 LLM 部分
3. 支持 LoRA 和全量微调两种模式(脚本默认全量微调)
4. 评估脚本会自动识别 checkpoint 是 LoRA 还是全量格式
|