
如果你最近读过大模型对齐Alignment方向的论文大概率会注意到一个变化论文实验部分的 Base Model 一栏除了 LLaMA 之外越来越多的名字换成了 Qwen、DeepSeek、GLM、InternLM、Yi 这类由中国团队训练并开源出来的模型。这不是零星现象而是过去一年里逐渐成型的技术趋势——中国开源模型正在成为全球对齐研究社区的高频基座。这篇文章想把这个趋势拆开来看而不是停留在“中国开源模型很强”的感叹上。对齐研究到底在研究什么为什么论文作者愿意把中国开源模型作为实验基底如果你自己也想在 Qwen 或 DeepSeek 这类模型上做一轮对齐实验应该怎么选模型、怎么准备环境、怎么写训练代码读完这篇文章你会得到一条可以照着执行的路径也会理解这件事背后的工程逻辑。文章会按“现象 → 概念 → 方法 → 实操 → 评估 → 工程建议”的顺序展开。其中核心实操部分会给出三个可以直接运行的代码示例SFT 对齐微调、DPO 偏好优化、基于 LLaMA-Factory 的完整训练流程。1. 为什么说中国开源模型成了对齐研究的主流基底首先要界定一下“主流基底”这个词。在学术研究里基底模型Base Model / Foundation Model指的是研究者拿来继续训练、修改和评估的初始模型。对齐研究的实验往往要改变模型权重、观察不同训练策略对模型行为的影响因此它天然依赖可获取权重的开源模型。闭源模型只能通过 API 调用能测输入输出却不能深入权重内部做机制分析也无法在模型上执行新一轮训练。从公开论文、开源项目和技术社区的实践来看Qwen、DeepSeek、GLM、InternLM 等模型已经成为对齐实验里高频出现的选择。比如偏好优化、安全对齐、指令遵循、越狱防御、模型诚实性这类课题很多实验都在这些模型上做训练和评测。选择它们不只是“因为免费”更因为这类模型本身具备几个对齐研究所必须的条件权重公开、性能足够接近前沿、工具链支持完善、社区迭代快。这恰好形成了一种正循环模型越多人用问题暴露越多工具和最佳实践就越丰富后来者越愿意用。对开发者和研究者个人来说这件事最大的价值在于对齐研究不再被少数拥有超大算力、能自研模型的团队垄断。任何具备基础 GPU 资源的人都可以在一个 0.5B 或 7B 的开源模型上复现 DPO、KTO、GRPO 等对齐方法验证自己的 idea。这也是“开源模型成为基底”背后最实际的推动力——它把实验门槛降下来了。2. 什么是对齐研究从“能生成”到“按指令执行”要理解对齐研究首先要理解预训练模型和对话助手之间的差别。大模型在预训练阶段做的事情本质上是在学习语言规律给它一段文本它预测下一个词。这个阶段得到的 Base 模型基础模型非常擅长续写但它并不会主动遵循用户的指令。你问“写一篇请假申请”它可能顺着提问继续补一段不相关的话或者把问题当文本续写下去。这不是模型“笨”而是它训练目标里根本没有“回答问题”这个约束。对齐研究要解决的就是如何让模型从“一个会补全文本的语言模型”变成“一个服从指令、内容安全、行为可控的助手”。SFT有监督微调让模型学会指令格式RLHF基于人类反馈的强化学习让模型学会输出人类偏好更高的内容DPO、KTO 等后续方法则试图用更轻量的方式实现同样的目标。对齐的实际内容包括指令遵循、输出安全性、减少幻觉、拒答有害请求、保持诚实等。它和微调的区别在于普通微调更关注任务层面比如把模型调成能分类、能抽取、能翻译对齐则更关注模型作为助手时的行为准则。对齐研究之所以需要基座模型是因为研究者必须使用一个尚未对齐的 Base 模型才能干净地归因“对齐方法带来的效果”。如果拿已经对齐过的 Instruct 模型再训练实验就无法判断改善来自新方法还是来自原来模型的底子。这里有一个容易踩的坑很多初学者想研究对齐却直接下载 Instruct 版本模型继续做 SFT 或 DPO。这样也能跑出结果但实验解释力会大打折扣。更合理的做法是选择对应的 Base 模型作为起点并且明确记录基座版本。对比维度基础模型Base对齐模型Instruct/Chat训练目标预测下一个词遵循指令、输出安全有用内容是否适合做对齐实验适合便于归因不适合已有对齐叠加典型表现续写能力强、不服从指令按格式回答、主动拒答实际获取方式模型仓库中的 Base 版本模型仓库中的 Instruct/Chat 版本3. 对齐研究的主流技术路线RLHF、DPO、KTO 与 RLAIF对齐方法的发展脉络可以看成一条“如何用更少标注、更稳定训练拿到更好效果”的演进线。最经典的路线是 RLHF。它先训练一个奖励模型来给生成结果打分再用强化学习算法如 PPO让策略模型优化奖励分数。PPO 的最大问题是工程复杂度高需要四份模型Actor、Ref、Reward、Critic显存开销大超参敏感训练不稳定。DeepSeek 提出的 GRPO 给了另一种做法去掉 Critic 价值网络用组内多个样本的相对奖励来估计优势降低了训练复杂度和显存占用因此也被大量社区项目采用。DPO 则是把 RLHF 的优化目标直接改写成分类损失让模型在给定偏好对chosen 和 rejected上增大好样本的概率、降低坏样本的概率完全不依赖强化学习循环。它实现简单、训练稳定成为目前对齐研究里最常用的方法之一。KTO 进一步降低了数据要求它不要求成对的偏好数据只需要对单条输出标注“可取/不可取”更贴近真实业务中只能给整体反馈的场景。RLAIF 则是对齐数据生产方式的转变不再依赖昂贵的人工标注而是让一个更强的模型或规则模型对生成结果打分再交给对齐算法训练。这个方法特别适合研究团队还没有建立大规模人工标注渠道的阶段。再往后还有 Self-Alignment、宪法 AI 这类强化模型自我约束的路线它们更强调模型在无监督或弱监督条件下形成安全偏好。对于刚入门的人我的建议是先掌握 SFT再吃透 DPO最后根据问题需要去了解 RLHF/GRPO。SFT 是地基DPO 是性价比最高的偏好优化方法GRPO 是复现前沿工作时的进阶选项。方法是否需要偏好对是否使用强化学习需要奖励模型训练稳定性推荐场景SFT不需要否否稳定让模型学会指令格式RLHF/PPO需要是是较难追求上限、已有奖励模型GRPO需要是是相对稳定替代 PPO 的强化对齐DPO需要否否稳定偏好优化首选KTO不需要否否稳定只有整体质量标注RLAIF需要按算法而定用 AI 替代稳定降低人工标注成本4. 面向对齐研究的模型选型与运行环境准备工欲善其事必先利其器。在跑对齐实验之前先想清楚两个问题用什么模型用什么硬件。模型选择上建议先看自己实验要验证什么。教学演示和小规模假设验证可以选择 0.5B 到 4B 的小模型消费级显卡就能跑主流研究规模往往是 7B 到 14B需要 24GB 以上显存如果要做系统性的 SOTA 复现才需要 70B 级别多卡环境。选模型的另一个关键点是区分 Base 和 Instruct 版本。对齐研究尽量用 Base 版本否则实验结果很难归因。以 Qwen2.5 系列为例它的 Base 模型和 Instruct 模型都有开源权重Tokenizer 支持 chat templateHuggingFace Transformers 原生支持适合作为入门基座。DeepSeek、GLM、InternLM 也都有相应 Base 权重许可协议通常允许学术研究部分允许商用。选择时注意核对模型仓库的 License不要带到生产环境才发现许可不符合要求。运行环境方面建议使用 Linux 服务器Python 3.10 以上PyTorch 2.xCUDA 11.8 或更高版本。依赖库按需安装即可最核心的是以下这些pip install torch transformers accelerate peft datasets trl bitsandbytes vllm显存有限的场景可以额外安装flash-attn来降低显存占用和加速训练但要注意它需要编译环境匹配 CUDA 版本。环境装好之后先用一个最小模型做一次加载和推理确认底层依赖没有问题再进入正式实验。如果你使用的是 Windows 或 macOS也可以运行小模型实验但 DPO 等训练任务对显存有硬性要求建议优先使用云 GPU 实例。5. 实操一用 TRL 完成 SFT 基础对齐微调SFT 是对齐的起点目的是让 Base 模型学会“用户问、助手答”的对话格式。这里我用 Qwen2.5-0.5B Base 模型做一个最小示例。0.5B 的参数量意味着即使只有一张 8GB 显存的显卡也能完成全参数训练。先准备训练数据。以一个简单的 JSONL 文件为例每行包含用户指令和期望输出{instruction: 用自己的话解释什么是梯度下降, output: 梯度下降是一种通过反复调整参数来最小化损失函数的优化方法。每一步都朝着损失下降最快的方向移动所以被称为下降。} {instruction: 写一条请假申请, output: 您好我因感冒需要请假一天明天会正常工作。感谢您的理解。} {instruction: 推荐一种适合新手的编程语言, output: 对编程新手来说Python 是一个不错的选择语法简单、生态丰富适合快速上手。}然后写训练脚本。核心是使用 HuggingFace Transformers 加载模型用 TRL 的 SFTTrainer 完成训练。# 文件路径train_sft.py import torch from datasets import load_dataset from transformers import AutoModelForCausalLM, AutoTokenizer from trl import SFTTrainer, SFTConfig model_name Qwen/Qwen2.5-0.5B model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.bfloat16, device_mapauto, ) tokenizer AutoTokenizer.from_pretrained(model_name) # 读取 JSONL 数据集 dataset load_dataset(json, data_filessft_data.jsonl, splittrain) def format_chat(example): messages [ {role: user, content: example[instruction]}, {role: assistant, content: example[output]}, ] return tokenizer.apply_chat_template(messages, tokenizeFalse) training_args SFTConfig( output_diroutput/qwen2_5-0.5b-sft, per_device_train_batch_size2, gradient_accumulation_steps4, learning_rate2e-4, num_train_epochs3, logging_steps10, save_steps100, bf16True, max_seq_length2048, ) trainer SFTTrainer( modelmodel, argstraining_args, train_datasetdataset, formatting_funcformat_chat, tokenizertokenizer, ) trainer.train() trainer.save_model(output/qwen2_5-0.5b-sft)这段代码里最关键的是format_chat。Qwen2.5 的 Tokenizer 自带apply_chat_template它会把对话消息序列转换为模型期望的格式。如果不做这一步模型看到的训练文本和推理时的输入格式不一致就会导致“训练时挺好的、推理时变傻”的现象。运行命令很简单python train_sft.py训练完成后可以用一个小脚本验证模型是否学会按指令回答from transformers import AutoModelForCausalLM, AutoTokenizer model_path output/qwen2_5-0.5b-sft tokenizer AutoTokenizer.from_pretrained(model_path) model AutoModelForCausalLM.from_pretrained(model_path) messages [{role: user, content: 讲一个关于拖延症的笑话}] text tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) inputs tokenizer(text, return_tensorspt) outputs model.generate(**inputs, max_new_tokens256) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))如果输出是完整的角色对话说明 SFT 已经让模型“知道”了回答格式。如果输出只有指令本身、没有助手回答优先检查apply_chat_template是否在训练和推理两端保持一致。6. 实操二用 DPO 做偏好对齐训练SFT 解决的是“会不会按指令回答”DPO 解决的是“回答得好不好”。经典做法是人工标注一批偏好数据同一个 prompt 下一个好答案chosen和一个差答案rejectedDPO 让模型学会增大好答案的概率、降低差答案的概率。使用上一节的 SFT 模型作为起点继续训练。D PO 需要的数据格式如下{prompt: 写一个关于猫的笑话, chosen: 猫为什么讨厌电脑因为鼠标长得像老鼠。, rejected: 猫是一种宠物。} {prompt: 推荐一部适合周末放松的电影, chosen: 可以看《千与千寻》节奏轻松、想象力丰富适合周末。, rejected: 周杰伦的歌很不错。}这里的rejected不一定是错误答案只是相比chosen更差。这也是 DPO 一个重要特点它不需要人工给模型打分只需要能区分好坏。训练脚本如下同样使用 TRL# 文件路径train_dpo.py import torch from datasets import load_dataset from transformers import AutoModelForCausalLM, AutoTokenizer from trl import DPOTrainer, DPOConfig model_path output/qwen2_5-0.5b-sft model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, device_mapauto, ) tokenizer AutoTokenizer.from_pretrained(model_path) dataset load_dataset(json, data_filesdpo_data.jsonl, splittrain) dpo_args DPOConfig( output_diroutput/qwen2_5-0.5b-dpo, per_device_train_batch_size1, gradient_accumulation_steps8, learning_rate1e-5, beta0.1, bf16True, max_length2048, max_prompt_length1024, logging_steps10, save_steps100, num_train_epochs1, ) dpo_trainer DPOTrainer( modelmodel, ref_modelNone, # 不传时自动使用模型深拷贝作为参考模型 argsdpo_args, train_datasetdataset, tokenizertokenizer, ) dpo_trainer.train() dpo_trainer.save_model(output/qwen2_5-0.5b-dpo)DPO 训练中有两个参数需要格外关注。第一个是beta它控制参考模型对训练过程的约束强度。beta越大模型越不敢偏离原来的分布训练越稳定但偏好提升也更慢beta太小模型可能产生过拟合偏好数据的风险甚至出现输出退化的“奖励黑客”现象。一般从 0.1 附近开始尝试。第二个是learning_rateDPO 通常比 SFT 用更小的学习率常见范围是 1e-6 到 1e-5避免把已有能力冲掉。还要注意一个细节DPOTrainer 里的ref_modelNone在部分 TRL 版本中会提示需要显式传入参考模型。更稳妥的做法是先深拷贝一份原模型作为ref_model。如果你使用的 TRL 版本报错可以直接创建from transformers import AutoModelForCausalLM ref_model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, device_mapauto, )然后传给DPOTrainer(ref_modelref_model, ...)。训练完成后可以复用第五节末尾的推理脚本把model_path改为 DPO 输出目录观察模型对同一 prompt 的输出是否更符合偏好标准。7. 实操三用 LLaMA-Factory 跑完整对齐流程如果你不想手写训练脚本或者希望快速在多个模型、多种对齐方法之间切换实验LLaMA-Factory 是目前社区里非常成熟的选择。它封装了 SFT、DPO、KTO、ORPO 等多种训练流程并提供命令行和 WebUI 两种操作方式适合从新手到研究者的不同需求。安装时建议直接从源码安装git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e .[torch,bitsandbytes]LLaMA-Factory 的数据集统一放在data/目录下也内置了多个中文指令数据集。这里我们直接使用内置的alpaca_zh_demo数据集通过一个 YAML 配置文件启动 SFT# 文件路径config/sft_qwen.yaml model_name_or_path: Qwen/Qwen2.5-0.5B stage: sft do_train: true dataset: alpaca_zh_demo template: qwen finetuning_type: lora lora_rank: 8 lora_target: all output_dir: output/llamafactory-qwen2_5-sft overwrite_cache: true per_device_train_batch_size: 2 gradient_accumulation_steps: 4 learning_rate: 2.0e-4 num_train_epochs: 3.0 bf16: true配置项里finetuning_type: lora表示使用 LoRA 低秩适配训练这样显存占用远低于全参数微调template: qwen指定对话模板不同模型家族需要选择对应模板。运行命令llamafactory-cli train config/sft_qwen.yamlLLaMA-Factory 的优点在于切换训练方法非常方便。把stage改成dpo再把数据集换成偏好数据同一个模型、同一个 LoRA 配置就可以继续训练。下面是一个 DPO 配置示例# 文件路径config/dpo_qwen.yaml model_name_or_path: Qwen/Qwen2.5-0.5B stage: dpo do_train: true dataset: dpo_zh_demo template: qwen finetuning_type: lora lora_rank: 8 lora_target: all output_dir: output/llamafactory-qwen2_5-dpo overwrite_cache: true per_device_train_batch_size: 1 gradient_accumulation_steps: 8 learning_rate: 1.0e-5 num_train_epochs: 1.0 bf16: true如果你想在交互界面里操作也可以启动 WebUIllamafactory-cli webuiWebUI 适合快速看配置是否合理、数据是否加载成功。但正式跑大批量实验时建议还是使用 YAML 加命令行方便记录实验配置、做版本管理。LLaMA-Factory 训练完成后导出的 LoRA 适配器和 Tokenizer 都在output_dir下可以用 Transformers 的PeftModel加载进行推理。LLaMA-Factory 这种“一套框架、多种 stage”的设计实际上也折射出对齐研究的一个工程趋势方法可以快速切换数据是真正的差异点。当你把训练框架固定下来之后真正决定对齐效果的反而是数据质量、偏好对构造和评估方式。8. 对齐效果评估、常见问题与排查清单对齐训练接近完成时不要只看训练 loss。Loss 下降说明模型在拟合训练数据但不能完全说明模型变好了。真正的效果判断需要结合自动评测和人工评测。自动评测方面可以先用一组固定的指令集做抽样对比 SFT 前后、DPO 前后的输出。也可以借助公开评测基准例如 MT-Bench 用于多轮对话质量评估AlpacaEval 2 用于单轮指令遵循评估IFEval 用于指令约束满足评估SafetyBench 则可用于安全能力评估。要注意的是任何 benchmark 都可能被数据污染因此不要只依赖单一指标尤其不要使用与训练数据重叠的评测集。人工评测则更适合判断“用户真实体感”。可以让团队内部给几组模型的输出盲评从有用性、安全性、格式正确性、信息真实度几个维度打分。这个工作看起来原始却是对齐评估里不可替代的一环。下面是实操中常见的几个问题及排查思路问题现象可能原因排查方式解决方案训练时显存 OOMbatch_size 过大或序列过长查看显存占用日志降低 batch_size、开启 gradient_accumulation、换 LoRA模型不按指令回答训练和推理的 chat template 不一致打印训练样本和推理 prompt 的纯文本统一使用 tokenizer.apply_chat_templateDPO 训练 loss 不降甚至上升beta 过大、偏好数据质量差、chosen 和 rejected 差异太小画 loss 曲线、随机抽看训练样本调低 beta、清洗偏好数据、加大好坏答案差距模型开始生成重复内容温度过低、generate 参数未调检查不同温度下输出提高 temperature/top_p或加 repetition_penalty训练 loss 很低但评估结果差训练数据与评估数据重叠检查数据集来源和去重严格隔离训练/验证/测试集去重后再评测LoRA 训练后加载报错adapter_config 中的 base model 路径与实际不一致读取 adapter_config.json 检查设置正确 base_model_name_or_path遇到问题时最有效的排查顺序是先打印模型实际看到的输入文本确认数据格式没问题再看训练日志中的 loss 趋势确认是否在学习最后用随机样本做小范围人工评测确认改变是否符合预期。这个顺序能筛掉大部分“看起来代码报错、实际上是数据或格式问题”的情况。9. 最佳实践、工程建议与后续方向对齐研究进入工程化阶段后决定成败的往往不是某一个算法的数学公式而是实验设计、数据治理和工程规范。实验设计上坚持用 Base 模型作为起点记录模型版本、训练数据分布、超参组合。建议每次训练前生成一份包含样本条数、来源、语言分布、长度统计的数据报告避免黑盒式实验。对比实验要固定随机种子和评估集否则很难判断改进来自方法本身还是样本波动。数据治理上严格区分训练数据、验证数据、测试数据并且提前做去重。偏好数据要仔细检查 chosen 和 rejected 的区分度如果两者差异太微弱DPO 和 KTO 都很难学到有效信号。更推荐少量、高质量、差异明显的标注而不是大量低质量粗标数据。这里真正容易踩坑的地方是很多团队用大模型自动生成偏好数据但忘记清理格式混乱、答案重复、事实错误的样本结果模型在错误模式上更自信。安全与合规上使用开源模型前先看 License确认是否符合学术、商用场景涉及隐私数据时不要在训练集里混入未脱敏的个人信息做安全对齐研究时要避免无意中训练出恶意能力实验边界和模型发布策略要提前和团队确认。生产环境变更时先小流量验证再逐步放量保留回滚能力。算力和成本上不必一开始就冲大模型。0.5B 到 7B 模型已经能验证大多数对齐方法的机理同一个 idea 在小模型上跑通后再考虑放大到 14B 或 70B。使用 LoRA 可以显著降低显存和训练时间但要注意低秩适配也可能限制模型学习复杂偏好实际效果需要和全参数微调对比。接下来值得深入的方向包括多模态对齐、长上下文行为对齐、自动合成偏好数据、模型诚实性和可解释性。对齐研究最大的吸引力恰恰在于它既需要深入理解模型机制又有大量尚未形成共识的问题。而开源模型的开放权重给了研究者一个亲手试验这些问题的入口。如果看完这篇你还想动手实践一个具体问题建议从“偏好数据质量如何影响 DPO 效果”这个题目开始。选一个 1.5B 左右的开源 Base 模型构造三组质量明显不同的偏好数据分别用 DPO 训练再在同一评测集上对比。这个实验规模可控、结论清晰也能帮你把 SFT、DPO、评估闭环完整跑通一遍。做完之后你对开源模型对齐研究的理解就不再只是“别人论文里的结论”而是亲手验证过的工程经验。