DPO(Direct Preference Optimization,直接偏好优化)
基座模型 A → (SFT+合并) → 模型 B → (DPO) → 模型 C
| 阶段 | 模型 | 作用 |
|---|---|---|
| 基座模型 A | Qwen3-4B-Instruct | 通用能力 |
| SFT 后模型 B | 合并后的模型 | 学会维修回答格式 |
| DPO 后模型 C | 在 B 上训练 | 更符合偏好(安全、完整) |
DPO则通过“偏好对比”,教模型“什么是好回答,什么是坏回答”,是一种后训练对齐技术
为什么在SFT之后选择DPO?
-
流程更简单,更稳定:它将复杂的强化学习(RLHF/PPO) 过程,简化为一个监督学习式的损失函数,无需单独训练奖励模型,成本更低,训练也更稳定。
-
效果直接:通过拉大“好回答”和“坏回答”的概率差距,DPO能让模型的回答更精准地符合人类偏好。
-
资源友好:框架支持LoRA高效微调,即便显存有限也能进行,比如在消费级GPU上也能完成训练。
-
灵活组合:作为模块化组件,DPO既可以和后续的PPO组成完整的RLHF流程,也能作为一次性改进使用
DPO实践宝典:从数据到训练
第一步:准备偏好数据
DPO的数据是偏好对(Preference Pair)。你需要为每个样本准备一个 Prompt 和两个回答(chosen vs rejected)。
-
⚠️ 数据格式与关键配置:LLaMA-Factory 对DPO数据要求严格:
-
JSONL文件格式:你准备的数据文件必须是
.jsonl格式,每条数据是一个独立的JSON对象,且所有对象的key必须完全一致。文件内不要用[ ]包裹全部内容。 -
数据结构:参考 ShareGPT 格式,包含
messages对话数组以及chosen和rejected字符串字段。
-
{
"system": "You are a helpful assistant.",
"messages": [
{"from": "human", "value": "解释什么是机器学习"},
{"from": "gpt", "value": "机器学习是人工智能的一个分支..."}
],
"chosen": "机器学习是人工智能的核心,它使计算机能从数据中学习...",
"rejected": "机器学习是一种技术。"
}
在注册数据集时,除了定义 file_name 和 columns 映射外,必须添加 "ranking": true 字段,以标识它为DPO数据。
dpo_train_full.jsonl 放入 LLaMA-Factory/data/ 目录,在 data/dataset_info.json 中添加以下注册信息:
"my_dpo_full": {
"file_name": "dpo_train_full.jsonl",
"ranking": true,
"formatting": "alpaca",
"columns": {
"instruction": "instruction",
"input": "input",
"chosen": "chosen",
"rejected": "rejected"
}
}

-
"formatting": "alpaca":向框架声明你的数据遵循alpaca的标准结构。 -
"ranking": true:这是DPO任务的关键标识,告诉框架你的数据包含chosen和rejected偏好对。 -
"columns":负责将你实际的JSON字段(如instruction)映射到框架内部理解的字段名上,确保数据被正确读取。
-
"file_name": 指定数据文件路径。 -
"ranking": true: 标识它为偏好数据集。 -
"formatting": "alpaca": 指定数据格式。 -
"columns": 建立字段映射。
1. 查看原始模型目录中 tokenizer 文件列表
首先确认原始模型路径下的 tokenizer 文件。通常路径为:/home/aistudio/text_lora/models/Qwen/Qwen3-4B-Instruct-2507
请执行以下命令确认文件存在:
bash
ls -l /home/aistudio/text_lora/models/Qwen/Qwen3-4B-Instruct-2507/tokenizer* ls -l /home/aistudio/text_lora/models/Qwen/Qwen3-4B-Instruct-2507/*.json | grep -E 'vocab|merges|special_tokens|tokenizer_config'
cp /home/aistudio/text_lora/models/Qwen/Qwen3-4B-Instruct-2507/tokenizer.json \
/home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged/
cp /home/aistudio/text_lora/models/Qwen/Qwen3-4B-Instruct-2507/tokenizer_config.json \
/home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged/
cp /home/aistudio/text_lora/models/Qwen/Qwen3-4B-Instruct-2507/vocab.json \
/home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged/
cp /home/aistudio/text_lora/models/Qwen/Qwen3-4B-Instruct-2507/merges.txt \
/home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged/
cp /home/aistudio/text_lora/models/Qwen/Qwen3-4B-Instruct-2507/special_tokens_map.json \
/home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged/
再次检查目标目录,确保至少存在 tokenizer.json 或 tokenizer_config.json:
ls -l /home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged/ | grep -E 'tokenizer|vocab|merges|special_tokens'
llamafactory-cli train --stage dpo --do_train True --model_name_or_path /home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged --dataset my_dpo_full --template qwen --finetuning_type lora --lora_rank 16 --lora_alpha 32 --lora_dropout 0.1 --lora_target all --output_dir output/qwen3-4b-dpo --per_device_train_batch_size 4 --gradient_accumulation_steps 4 --lr_scheduler_type cosine --learning_rate 5e-6 --num_train_epochs 1.0 --cutoff_len 4096 --save_safetensors True --save_steps 50 --plot_loss --fp16
内存不足,优化命令如下:
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True && \
llamafactory-cli train \
--stage dpo \
--do_train True \
--model_name_or_path /home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged \
--dataset my_dpo_full \
--template qwen \
--finetuning_type lora \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0.1 \
--lora_target all \
--output_dir output/qwen3-4b-dpo \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 4 \
--cutoff_len 2048 \
--learning_rate 5e-6 \
--num_train_epochs 1.0 \
--lr_scheduler_type cosine \
--save_steps 50 \
--plot_loss \
--fp16 \
--gradient_checkpointing True --val_size 0.1 \
--per_device_eval_batch_size 1 \
--eval_strategy steps \
--eval_steps 50
# merge_config_dpo.yaml
model_name_or_path: /home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-merged
adapter_name_or_path: /home/aistudio/text_lora/LLaMA-Factory/output/qwen3-4b-dpo
template: qwen
finetuning_type: lora
export_dir: /home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-dpo-merged
export_size: 4
export_legacy_format: false
合并:
llamafactory-cli export merge_config_dpo.yaml
转化:在 llama.cpp目录下
python convert_hf_to_gguf.py /home/aistudio/text_lora/LLaMA-Factory/models/qwen3-4b-dpo-merged/ --outfile /home/aistudio/llama.cpp/qwen3-4b-dpo-f16.gguf --outtype bf16
量化:
./build/bin/llama-quantize /home/aistudio/llama.cpp/qwen3-4b-dpo-f16.gguf /home/aistudio/llama.cpp/qwen3-4b-dpo-Q4_K_M.gguf Q4_K_M
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)