
1. 从预训练到后训练一条被低估的分水岭如果你这两年一直在跟大模型打交道大概率会有一种感觉预训练Pre-Training决定模型的下限后训练Post-Training决定模型的上限。这句话我第一次听到的时候觉得有点绝对但真正自己动手做过几轮SFT和RLHF之后我越来越认同。预训练像是给模型打地基、灌通识后训练才是把它从一个什么都懂一点但什么都不精的博学少年调教成一个能干活、听得懂人话、不胡说八道的靠谱员工。这篇文章我想系统聊聊Post-Training这件事——它的前世是怎么来的今生大家都在用什么方法未来可能往哪走。核心会围绕几个关键词展开Post-Training、Pre-Training、Fine-Tuning、SFT、RL-Based Post-Training。不管你是刚入行想搞清楚这几个概念区别的新人还是已经在做微调但想理清整体脉络的工程师我都尽量把话说透把踩过的坑和实操细节摊开讲。先说清楚定位这篇文章不是论文综述也不是官方文档翻译而是一个一线从业者对整条技术脉络的梳理和实战总结。我会解释每个阶段为什么这么做会给出可参考的参数和流程也会分享一些文档里不会写的经验。读完之后你应该能自己判断手上这个任务到底该用SFT还是上RL数据该怎么准备坑在哪里。2. Post-Training的前世它到底是怎么被逼出来的2.1 预训练时代的能力过剩困境要讲后训练的前世得先回到预训练本身。早期的语言模型比如GPT-1、BERT那个阶段大家的核心思路是用海量无标注文本做自监督学习让模型学会语言的统计规律。BERT用的是掩码语言建模Masked Language ModelingGPT系列用的是自回归预测下一个token。这个阶段的目标很纯粹——让模型读懂语言。但问题很快就暴露了。一个只在预训练目标上训练出来的模型本质上是一个文本续写机器。你给它一句话它会顺着概率往下写但它并不理解指令这个概念。比如你输入帮我写一封请假邮件预训练模型可能会续写出帮我写一封请假邮件帮我写一封辞职邮件帮我写一封……这种复读机式的输出。这不是模型笨而是它的训练目标里根本没有遵循指令这一项。我在早期做实验的时候深有体会一个几十亿参数的预训练模型知识储备其实相当可观但你没法直接用它因为它不听话。你想让它做A它偏要做B输出格式也完全不可控。这就是所谓的能力过剩但可控性为零——模型有能力但你调不动它。2.2 从Fine-Tuning到SFT第一次驯化解决这个问题的第一代方案就是Fine-Tuning微调。最朴素的做法是拿一批输入-输出配对的数据在预训练模型基础上继续训练让模型学会针对特定输入给出特定输出。这在BERT时代非常流行比如文本分类、命名实体识别都是拿标注数据微调。但真正让指令遵循这件事跑通的是SFTSupervised Fine-Tuning监督微调。SFT和传统Fine-Tuning的核心区别在于SFT的数据是指令-回答格式的目标是让模型学会看到指令就给回答这个行为模式。OpenAI在InstructGPT那篇工作里把这个思路讲得很清楚——他们雇了一批标注员写了几万条高质量的指令-回答对然后拿这些数据去微调GPT-3结果模型在遵循指令上的表现大幅提升。我自己的经验是SFT的效果对数据质量极其敏感。同样是1万条数据精心写的和随便爬的效果能差出一个档次。这里有个反直觉的点SFT不是让模型学新知识而是让它学会以什么格式、什么风格、什么态度来输出它已经知道的东西。所以数据量不是关键数据的示范性和一致性才是关键。2.3 为什么SFT还不够对齐问题的浮现SFT解决了听不听话的问题但没解决听得好不好的问题。具体来说SFT有几个绕不过去的坎第一SFT只能模仿不能超越。模型学的是标注员写的答案标注员的水平就是模型的上限。如果标注员写得不完美模型就学得不完美。第二SFT难以处理多答案场景。同一个问题可能有多个合理回答SFT会让模型在这些答案之间平均结果可能哪个都不像。第三SFT无法表达偏好。人类对回答的偏好是相对的——这个回答比那个好而不是绝对的这个回答是对的。SFT的监督信号是绝对的对错表达不了这种相对偏好。正是这些局限催生了RL-Based Post-Training基于强化学习的后训练。这就是后训练今生的主线故事。3. Post-Training的今生SFT与RL的双轮驱动3.1 SFT依然是地基但定位变了现在业界主流的后训练流程基本是**预训练 → SFT → RL三段式**。SFT的角色从最终方案变成了打底方案。它的任务是把模型拉到一个基本能用的状态为后面的RL提供一个合理的起点。为什么RL需要SFT打底因为强化学习本质上是在一个策略空间里搜索如果起点太差搜索效率极低甚至训崩。SFT相当于把模型先放到一个及格线附近RL再从这个位置往上推。我试过跳过SFT直接上RL结果模型输出乱七八糟奖励信号根本没法有效传导纯属浪费时间。SFT阶段有几个实操要点值得说数据配比不要只堆某一类任务。指令多样性比数量重要。我一般会保证任务类型覆盖至少10个大类每类几百到几千条不等。数据质量宁缺毋滥。一条低质量数据带来的负面影响可能需要十条高质量数据才能抵消。训练轮数通常1-3个epoch就够多了容易过拟合模型会变得死板丧失泛化能力。学习率比预训练小一到两个数量级常见在1e-5到2e-5之间。提示SFT阶段最容易被忽视的是负样本的处理。如果你的数据里混入了错误示范模型会照单全收。清洗数据这一步花多少时间都值得。3.2 RL-Based Post-Training从RLHF到更细的分支RL-Based Post-Training的核心思想是不再告诉模型标准答案是什么而是告诉它哪个答案更好让模型自己去优化。这条线最早的代表是RLHFReinforcement Learning from Human Feedback后来演化出一堆变体。RLHF的经典流程分三步SFT先做监督微调得到基础策略模型。训练奖励模型Reward Model, RM让人类对同一问题的多个回答进行排序用这些排序数据训练一个能打分的模型。RL优化用RM作为奖励信号通过PPO等算法优化策略模型让它生成RM打分更高的回答。这套流程的问题也很明显流程复杂、训练不稳定、对RM质量极度依赖。PPO本身调参就够头疼了再加上RM的偏差整个系统像个精密但脆弱的仪器。我见过太多团队卡在PPO不收敛上最后不了了之。后来出现了DPODirect Preference Optimization思路是把训练RM RL优化两步合并成一步直接用偏好数据优化策略模型。DPO的好处是简单、稳定不需要单独训RM也不需要PPO那套复杂的采样和优势估计。实测下来DPO在很多场景下能达到接近RLHF的效果但工程复杂度低了一个量级。再往后又出现了GRPO、KTO、ORPO等一系列变体各有侧重。GRPO去掉了价值网络用组内相对奖励来估计优势KTO只需要好/坏二元标签不需要成对偏好ORPO把SFT和偏好优化合并。这些方法的共同趋势是降低对标注数据的依赖简化训练流程提升稳定性。3.3 方法选型到底该用哪个面对这么多方法实际项目里怎么选我整理了一个简单的判断表方法数据需求训练复杂度稳定性适用场景SFT指令-回答对低高基础能力对齐、格式控制RLHF (PPO)偏好排序 RM高低追求极致效果、有充足资源DPO成对偏好数据中中高大多数偏好对齐场景GRPO成对偏好数据中中高推理类任务、需要组内对比KTO二元好坏标签中中高标注成本敏感场景我的建议是除非你有明确证据表明DPO类方法不够用否则优先从DPO或GRPO入手。RLHF那套PPO流程除非团队里有专门做RL的人否则投入产出比不高。4. 核心细节拆解数据、奖励与训练稳定性4.1 数据后训练的真正瓶颈做后训练做久了会发现算法是次要的数据才是核心。同样的DPO算法数据质量差一个档次效果差出十万八千里。后训练的数据大致分三类SFT数据指令-回答对要求示范性强、格式统一、覆盖多样。偏好数据同一输入下的多个回答及排序要求标注一致、区分度明显。奖励数据用于训练RM的打分数据要求评分标准清晰、标注员培训到位。偏好数据的标注有个大坑标注员之间的不一致性。同一个回答A标注员觉得好B标注员觉得差这种噪声会直接污染训练信号。解决办法是制定详细的标注指南做标注员一致性校验比如计算Kappa系数并且定期抽检。另一个坑是偏好数据的区分度。如果两个回答质量差不多标注员硬要分个高下这种数据对训练是有害的。我一般会要求标注员在两个都好或两个都差时明确标注这类数据要么丢弃要么单独处理。4.2 奖励模型RLHF的命门如果你走RLHF路线RM的质量直接决定最终效果。RM训练有几个关键点RM的容量要匹配RM太小学不到细粒度偏好RM太大容易过拟合标注噪声。一般和策略模型同量级或略小。RM的偏差会被放大RL优化会疯狂寻找RM的漏洞生成高分但实际很差的回答这就是所谓的reward hacking。缓解办法包括加KL惩罚约束策略不要偏离SFT模型太远、定期用人类评估校准RM、使用多个RM集成。RM的评估不能只看RM在验证集上的准确率还要看它和人类判断的一致性。我一般会保留一批人工评估数据专门用来检验RM。注意reward hacking是RLHF最隐蔽的坑。模型可能学会输出又长又啰嗦但看起来很全面的回答因为RM可能被长度带偏。训练时一定要监控输出长度分布发现异常及时调整。4.3 训练稳定性那些文档不会告诉你的事后训练的训练稳定性问题比预训练更棘手。几个我踩过的坑KL散度爆炸RLHF里KL惩罚系数设小了策略会跑飞设大了模型学不动。这个系数需要根据实际训练曲线动态调整没有万能值。奖励崩塌训练到某个点奖励突然掉下去模型输出变得重复或无意义。这通常是学习率过大或KL约束失效导致的。解决办法是降低学习率、增大KL系数、或者回滚到之前的checkpoint。DPO的隐式奖励偏移DPO虽然稳定但如果偏好数据里好回答和坏回答的差异太小模型学到的信号很弱。这时候需要提高数据质量或者调整beta参数控制偏离参考模型的程度。GRPO的组大小选择GRPO需要为每个prompt采样一组回答组大小太小优势估计噪声大太大计算成本高。一般4-8比较合适具体看任务。5. 实操过程一次完整的后训练流程复现5.1 环境与工具准备假设你要做一次标准的SFT DPO后训练需要准备的东西基座模型选一个开源基座比如7B或13B量级根据你的算力决定。训练框架HuggingFace TRL是目前最方便的选择SFT、DPO、PPO、GRPO都有现成实现。DeepSpeed或FSDP做分布式训练。数据SFT数据至少几千条高质量指令对DPO数据至少几千条偏好对。算力7B模型全量SFT大概需要几张A100如果资源紧张用LoRA做参数高效微调。环境配置大致如下pip install transformers trl peft accelerate deepspeed datasets5.2 SFT阶段实操SFT的数据格式一般是JSONL每行一个样本{instruction: 解释什么是过拟合, input: , output: 过拟合是指模型在训练数据上表现很好但在未见过的数据上表现差……}用TRL的SFTTrainer核心参数from trl import SFTTrainer, SFTConfig config SFTConfig( output_dir./sft_output, num_train_epochs2, per_device_train_batch_size4, gradient_accumulation_steps8, learning_rate2e-5, lr_scheduler_typecosine, warmup_ratio0.03, logging_steps10, save_strategyepoch, bf16True, max_seq_length2048, )几个参数选择的理由学习率2e-5是SFT的常见起点太大容易破坏预训练知识太小收敛慢warmup 3%是为了避免训练初期梯度震荡bf16比fp16更稳定不容易出现loss NaN。训练过程中重点看两个指标训练loss和验证loss。如果训练loss持续下降但验证loss开始上升说明过拟合了该停。如果loss震荡剧烈检查学习率和batch size。5.3 DPO阶段实操DPO的数据格式是三元组prompt、chosen、rejected。{prompt: 写一首关于秋天的诗, chosen: 秋风起落叶黄……, rejected: 秋天到了天气凉了……}DPO训练的核心参数from trl import DPOTrainer, DPOConfig config DPOConfig( output_dir./dpo_output, num_train_epochs1, per_device_train_batch_size2, gradient_accumulation_steps8, learning_rate5e-6, beta0.1, bf16True, max_length2048, max_prompt_length1024, )beta参数是DPO的关键它控制模型偏离参考模型的程度。beta越大约束越强模型越保守beta越小模型越激进。0.1是个常用起点实际要根据效果调。我一般会试0.05、0.1、0.3三档看哪个在验证集上表现最好。DPO训练时重点监控隐式奖励的差值chosen和rejected的log概率差。如果这个差值一直不涨说明模型没学到东西可能是数据区分度不够或beta设置不当。5.4 评估别只看loss后训练的评估是最容易被糊弄的环节。loss降了不代表模型变好了。我一般会做三层评估自动评估用GPT-4类模型做裁判对回答质量打分。方便但有小偏差。人工评估抽样一批输出人工打分。成本高但最可靠。专项测试针对你的目标能力设计测试集比如格式遵循率、事实准确率、拒绝率等。提示一定要保留一个训练时没见过的测试集。我见过太多团队在训练集上评估结果上线后效果崩盘。6. 常见问题与排查技巧实录6.1 后训练高频问题速查问题现象可能原因排查方向解决办法SFT后模型变傻学习率过大、数据质量差检查loss曲线、抽样数据降学习率、清洗数据DPO不收敛beta不当、数据区分度低看隐式奖励差值调beta、筛数据RLHF奖励崩塌KL约束失效、reward hacking监控KL和输出长度增大KL系数、加长度惩罚输出重复训练过度、解码参数问题检查epoch数和temperature减epoch、调解码参数格式不遵循SFT数据格式不统一检查数据模板统一格式、增加格式样本拒绝能力差缺少安全/边界数据检查数据覆盖补充拒绝类样本6.2 几个独家避坑经验第一SFT数据里的完美答案未必是好事。如果所有回答都写得像教科书模型会变得过于正式、缺乏灵活性。适当加入一些口语化、简洁的回答能让模型输出更自然。第二DPO的chosen和rejected不要差异太大。如果chosen是满分回答rejected是垃圾模型学到的信号太粗泛化差。理想情况是两者质量有差距但差距适中让模型学到细粒度的偏好。第三RL训练一定要设checkpoint回滚机制。RL训练崩是常态没有回滚机制一次崩盘可能浪费几天算力。我一般每几百步存一次发现异常立即回滚。第四评估集要防污染。如果你的评估数据不小心混进了训练集评估结果会虚高。我一般会用哈希去重确保训练集和评估集零重叠。第五别迷信大而全。后训练不是数据越多越好。一个精心设计的几千条数据集效果可能超过几万条粗糙数据。质量永远优先于数量。7. Post-Training的未来几个值得关注的方向7.1 从对齐到能力增强早期的后训练主要解决对齐问题——让模型听话、安全、有用。但现在的趋势是后训练开始承担能力增强的角色。比如推理能力很多工作表明通过RL后训练可以显著提升模型的数学和代码推理能力。这不再是简单的对齐而是在预训练基础上逼出新的能力。这个转变的意义很大它意味着后训练不再只是锦上添花而是可能成为模型能力的第二增长曲线。预训练的边际收益在放缓后训练的想象空间反而更大了。7.2 数据效率与自动化后训练最大的成本是数据标注。未来的方向一定是用更少的人工标注撬动更大的效果。几个思路AI反馈替代人工反馈用强模型给弱模型的输出打分即RLAIF。成本低但要注意偏差传递。自我博弈与自我改进让模型自己生成数据、自己评估、自己迭代。这条路有潜力但容易陷入自我强化的偏差。合成数据用强模型生成训练数据。关键是保证多样性和真实性避免模式坍塌。7.3 多模态与Agent场景的后训练现在的后训练方法大多针对纯文本。但随着多模态模型和Agent的兴起后训练要处理的东西更复杂了图像、动作、工具调用、多轮交互。这些场景下的偏好定义、奖励设计、数据标注都是全新的问题。比如Agent场景一个动作的好坏不能只看单步要看整个任务是否完成。这种延迟奖励的处理比文本生成难得多。我预计未来几年Agent后训练会是一个热门方向。7.4 训练与推理的融合还有一个有意思的趋势后训练和推理的边界在模糊。比如一些工作把推理时的搜索、验证能力通过后训练内化到模型参数里。反过来也有一些方法在推理时做动态的偏好优化。这种融合可能会催生新的训练范式。8. 我个人的一些体会做了这么多轮后训练最大的感受是这活儿七分靠数据两分靠算法一分靠运气。算法层面的创新层出不穷但真正决定效果的往往是你有没有把数据这件事做扎实。我见过太多团队在算法上反复折腾却不愿意花时间清洗数据、设计标注指南最后效果上不去还以为是算法不行。另一个体会是后训练没有银弹。SFT、DPO、RLHF各有适用场景没有哪个方法能通吃。实际项目里往往是组合使用——先SFT打底再DPO对齐必要时上RL精调。关键是理解每个方法解决什么问题、有什么局限然后根据手头的资源和目标做取舍。最后分享一个小技巧后训练的效果很多时候在数据准备阶段就决定了。与其在训练时反复调参不如在数据上多花一倍时间。我现在的习惯是数据准备和清洗的时间至少占总时间的60%。这个比例听起来夸张但实测下来它带来的收益远超在算法上的折腾。后训练这个领域变化很快今天好用的方法明天可能就被新的替代。但底层逻辑是不变的让模型更好地理解人类意图更可靠地完成人类任务。抓住这个核心具体方法怎么变都不会迷路。