Qwen3.5 DPO 模型对齐实战教程(pytrio 训练版)
如果你对模型对齐感兴趣,使用 Qwen3.5 进行 DPO 训练无疑是一个非常扎实的入门选择。本文将完整演示整个流程:基于 Qwen3.5-4B 模型,在 Anthropic 开源的 hh-rlhf 偏好数据集上运行 DPO 训练,计算后端采用 pytrio(一种将训练过程封装为 API 调用的创新工具),并通过 SwanLab 进行实时监控与评估。

- 相关代码:awesome-pytrio-train
- 训练日志与实验过程:dpo-hh-rlhf-pytrio
- 模型:Qwen3.5-4B
- 数据集:hh-rlhf
- 训练 Token 数:
- 100 步:1.2 M,约 7 分钟,花费 5.5 元
- 500 步:6 M,约 35 分钟,花费 27.5 元
知识点:为什么 DPO 是模型对齐的关键
在大语言模型对齐的场景中,核心关注点在于:面对多个候选回答,模型能否精准选出人类真正偏好的那个。传统的 RLHF 方法需要先训练一个奖励模型,再通过 PPO 算法优化语言模型——整个流程链路冗长、调参复杂,且容易遭遇奖励黑客等棘手问题。
DPO(Direct Preference Optimization,直接偏好优化)采用了一种更为直接的方式:基于偏好数据,将“哪个回答更受欢迎”这一问题转化为类似监督学习的优化目标。所谓偏好数据,通常形式为同一个提示(prompt)下的两个回答——人类更偏好的称为 chosen,较差的称为 rejected。DPO 的目标非常直观:让模型在面对相同问题时,尽可能输出接近 chosen 风格的回应,而非 rejected。

与传统的 RLHF 相比,DPO 的核心优势在于:无需单独训练奖励模型,也不依赖 PPO 等强化学习算法。它将偏好学习重新表述为监督学习问题,直接利用 chosen/rejected 对更新模型参数。这使得实现路径更短、训练过程更稳定、调参成本也更低。
一句话总结:以更简单、更稳定的方式,将人类偏好直接注入模型。 在拥有一个 SFT(监督微调)模型的基础上,DPO 是进一步对齐优化的理想选择——让模型不仅能够“回答”,更懂得“如何给出更优的回答”。
准备工作:环境与依赖安装
本案例要求 Python ≥ 3.10,请确保本地已正确安装。由于采用 pytrio 作为后端计算引擎,只需一台联网的普通电脑即可运行,无需为算力担忧。
第一步:克隆代码仓库到本地:
git clone
cd dpo
接下来,安装所需的三个 Python 库:
pip install pytrio swanlab torch
数据集介绍:Anthropic hh-rlhf
本案例采用 hh-rlhf 数据集。该数据集由 Anthropic 发布,是经典的 RLHF 偏好数据集,全称常称为 Helpful and Harmless RLHF——专门用于研究“人类更偏好哪个回答”,非常适合 DPO、RLHF 以及模型对齐(alignment)实验。

数据集包含偏好对数据和红队数据两类。红队数据主要用于研究模型安全性攻击,本文仅使用偏好对数据,共计约 169,352 条。
偏好对数据每条样本包含两个字段:
{
"chosen": "...",
"rejected": "..."
}
chosen 是人工标注者更偏好的回答,rejected 是相对较差的回答。对话文本普遍采用 Human: / Assistant: 格式串起来:
Human: If you were going to steal from a convenience store, do you think it would be better in the morning or at night?Assistant: I really couldn't say, I'm not familiar with stealing convenience store items.
数据集共包含四个主要子集:
| 子集 | 训练集 | 测试集 | 说明 |
|---|---|---|---|
| helpful-base | 43,835 | 2,354 | 基础模型生成的有用性偏好数据 |
| helpful-rejection-sampled | 52,421 | 2,749 | 经过 rejection sampling 的有用性数据 |
| helpful-online | 22,007 | 1,137 | 迭代 RLHF 过程中采样的数据 |
| harmless-base | 42,537 | 2,312 | 安全/无害性偏好数据 |
数据集的下载与使用方法已集成在第 6 节完整代码中,直接运行即可。
配置 pytrio 训练框架
pytrio 是一个专门为大语言模型训练设计的 AI 计算框架。其最大特点是不需要开发者操心环境配置、模型下载、GPU 底层等问题——只需要在任意一台电脑上装好 pytrio 包,写几行代码就能开始训练。

它的原理是将训练做了前后分离:开发者在本地定义训练行为(与写 PyTorch 类似),pytrio 在云端对一批批上传的数据做前向反向计算、更新权重,并返回 loss、logprobs 等指标。

这样一来,训练流程变得很像调用推理 API——任意联网设备,写好代码,请求后端,就能启动训练。因此很多人把 pytrio 称为一种创新的“训练 API”。
对做科研的同学来说,好处尤其明显:不用花时间租卡、装环境、排队,也不用同时跑五六个实验时纠结 GPU 资源怎么分配,直接调 API 就能扩展实验,大大缩短了产出周期。
pytrio 的使用非常简单。首先去官网(pytrio.cn)注册一个账号:

注册完成后,在「总览」页复制 API Key:

然后在本地环境执行:
trio login
粘贴 API Key,按下回车即可完成登录:

登录之后,记得往账户里充点钱用于后续训练(本教程全部跑完大概花 6 元):

更多使用细节可以参考 pytrio 的官方文档。
配置模型:指定 Qwen3.5-4B
pytrio 配置模型非常简单,只需在 base_model 参数中写入一行字符串,无需下载权重:
training_client = service_client.create_lora_training_client(
base_model="Qwen/Qwen3.5-4B",
rank=32,
)
切换模型同样只需修改字符串,无需等待下载或部署。截至目前,pytrio 支持的模型包括 Qwen3.5-4B 和 Qwen3.6-27B。
配置 SwanLab 可视化监控
使用 SwanLab 实时监控训练过程并评估模型对齐效果。

首次使用 SwanLab 的用户,请先前往 swanlab.cn 注册账号,在用户设置页面获取 API Key,训练启动时粘贴即可。

启动 DPO 训练
在之前克隆的代码目录中,进入 dpo 文件夹,执行以下命令:
python train.py
当终端输出类似下方的 loss 信息时,表示训练已成功启动:

训练结束后,模型权重可在 pytrio 控制台的“权重”选项卡中查看:

训练结果分析:loss 与奖励变化
前往 SwanLab 仪表板查看最终训练结果:

仅训练 100 步时,loss 变化不明显(训练 token 量较小)。
但当步数增加到 500 步后:

可以看到经过 500 步 DPO 训练后,loss 呈现下降趋势,acc 逐步上升,chose_reward 与 rejected_reward 分别震荡上升与下降,完全符合预期。
训练好的 LoRA 模型可在“pytrio 控制台 - 权重”中获取,支持下载至本地或直接在线调用。

相关链接
- 项目代码:awesome-pytrio-train
- 实验日志过程:dpo-hh-rlhf-pytrio
- 数据集:hh-rlhf
- pytrio
