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 还是全量格式