基座模型 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数据要求严格:

    1. JSONL文件格式:你准备的数据文件必须是 .jsonl 格式,每条数据是一个独立的JSON对象,且所有对象的key必须完全一致。文件内不要用 [ ] 包裹全部内容。

    2. 数据结构:参考 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任务的关键标识,告诉框架你的数据包含chosenrejected偏好对。

  • "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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐