Post-Training Pipeline - 从 Base Model 到可用助手 / The Post-Training Pipeline from Base Model to Assistant
📅 创建时间:2026-05-31 🏷️ 标签:#Post-Training #SFT #RLHF #DPO #Alignment #InstructGPT 📚 前置知识:[[11 - 训练基础扫盲]] [[07 - LLM 进化史]] 🎯 文档定位:科普深入 × 专业浅显 — 讲清楚"ChatGPT 为什么比 Base Model 好用",但不陷入强化学习的数学推导
📋 本章目标
阅读完本文档后,你将能够:
- [ ] 解释 Pretrained Model 和 Instruct Model 的本质区别
- [ ] 描述 SFT 的数据格式和训练方式
- [ ] 理解 RLHF 三阶段流程(Reward Model → PPO → KL 约束)
- [ ] 解释 DPO 为什么能替代 RLHF,以及两者的权衡
- [ ] 了解 Alignment 家族的多种方法(Constitutional AI、RLAIF 等)
- [ ] 理解 InstructGPT 的完整训练流程
- [ ] 为后续理解训练基础设施打下基础
第1部分:Pretraining vs Post-Training — 为什么 Base Model 不能直接用
1.1 预训练学到的是什么
回顾 [[07 - LLM 进化史]] 中讲的内容:预训练的核心任务是 Next Token Prediction(预测下一个词)。
预训练数据:互联网上的万亿 token
预训练目标:给定前 N 个词,预测第 N+1 个词
学到的是什么:
- 语法结构(主谓宾)
- 世界知识(巴黎在法国)
- 基本的推理能力
- 词的语义关系1.2 但预训练有一个致命问题
预训练模型只会"续写",不会"听话"。
┌─────────────────────────────────────────────────────────────────┐
│ Base Model vs Instruct Model 对比 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 用户输入:"帮我写一首关于秋天的诗" │
│ │
│ Base Model(预训练模型)的回答: │
│ ┌─────────────────────────────────────┐ │
│ │ "写一首关于秋天的诗 │ │
│ │ │ │
│ │ 秋风起,白云飞, │ │
│ │ 草木黄落雁南归。 │ │
│ │ 独在异乡为异客, │ │
│ │ 每逢佳节倍思亲。..." │ │
│ │ │ │
│ │ 问题:它在续写"写一首关于秋天的诗"这段文本 │ │
│ │ 而不是真正执行"写诗"这个指令! │ │
│ └─────────────────────────────────────┘ │
│ │
│ Instruct Model(对齐后模型)的回答: │
│ ┌─────────────────────────────────────┐ │
│ │ 当然可以!这是一首关于秋天的诗: │ │
│ │ │ │
│ │ 《秋韵》 │ │
│ │ 枫叶如火染山林, │ │
│ │ 秋风送爽入衣襟。 │ │
│ │ 金桂飘香满庭院, │ │
│ │ 丰收季节最怡人。 │ │
│ │ │ │
│ │ 希望你喜欢这首诗! │ │
│ └─────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘1.3 问题根源
预训练的目标是 P(next_token | context),即"给定上下文,下一个词最可能是什么"。
用户输入:"帮我写一首关于秋天的诗"
Base Model 看到的是:"帮我写一首关于秋天的诗"
它认为最好的续写是",因为这是互联网上这类文本最常见的接法
Instruct Model 看到的是:"帮我写一首关于秋天的诗"
它理解这是"用户的请求",应该生成一首诗来回应这个差异叫做 Distribution Gap(分布差异):
- 预训练数据中,"问题"和"回答"往往在同一个文本流里
- 对话数据中,"问题"和"回答"是分开的 turn
1.4 Post-Training 的定义
Post-Training = 预训练之后的所有训练
┌─────────────────────────────────────────────────────────────────┐
│ LLM 训练的完整阶段 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 阶段1:预训练(Pretraining) │
│ ├─ 目标:学会语言规律和世界知识 │
│ ├─ 数据:数万亿 token 的互联网文本 │
│ └─ 资源:数千 GPU,训练数月 │
│ │
│ 阶段2:后训练(Post-Training)← 本文档重点 │
│ ├─ 目标:让模型对齐人类意图,遵循指令 │
│ ├─ 方法:SFT / RLHF / DPO / ... │
│ └─ 资源:远少于预训练 │
│ │
└─────────────────────────────────────────────────────────────────┘第2部分:SFT — 监督微调
2.1 SFT 的核心思想
SFT(Supervised Fine-Tuning)= 用人工标注的高质量数据做微调
核心逻辑:
1. 收集一批高质量的 Prompt-Response 对(人工编写)
2. 用这些数据做普通的监督学习(和 [[11 - 训练基础扫盲]] 中的训练一样)
3. 模型学会:在收到这个 Prompt 时,生成这个 Response2.2 SFT 数据格式
SFT 的训练数据是 Prompt-Response 对:
┌─────────────────────────────────────────────────────────────────┐
│ SFT 训练数据格式 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 数据集示例: │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Prompt: "用一句话解释量子纠缠" │ │
│ │ Response: "量子纠缠是两个粒子间的一种特殊关联, │ │
│ │ 即使相隔很远,一个粒子的状态变化会立即影响 │ │
│ │ 另一个粒子的状态,这是一种超越空间限制的 │ │
│ │ 非局域关联效应。" │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Prompt: "写一个 Python 快排算法" │ │
│ │ Response: "def quicksort(arr):\n" │ │
│ │ " if len(arr) <= 1:\n" │ │
│ │ " return arr\n" │ │
│ │ " ..." │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ SFT 的 Loss 只在 Response 部分计算(Prompt 部分不参与梯度) │
│ │
└─────────────────────────────────────────────────────────────────┘2.3 SFT 训练方式
和 [[11 - 训练基础扫盲]] 中讲的训练循环完全一样,只是数据格式不同:
SFT 训练循环:
for batch in SFT_dataloader:
# Forward
outputs = model(input_ids=batch["input_ids"])
# 只在 Response 部分计算 Loss
shift_logits = outputs.logits[..., :-1, :].contiguous()
shift_labels = batch["labels"][..., 1:].contiguous()
loss = cross_entropy(shift_logits, shift_labels)
# Backward + Update
loss.backward()
optimizer.step()2.4 SFT 的问题
SFT 听起来很简单,但实际有几个严重问题:
┌─────────────────────────────────────────────────────────────────┐
│ SFT 的三个问题 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 问题1:数据标注成本极高 │
│ ───────────────────────────────────────────────────────────── │
│ 要让模型学会各种任务,需要覆盖所有任务类型的高质量回答: │
│ ├─ 写代码 │
│ ├─ 写文章 │
│ ├─ 回答知识问题 │
│ ├─ 做数学题 │
│ ├─ 对话聊天 │
│ └─ ... 几千种任务 │
│ │
│ 人工标注 10 万条高质量、多样化的数据,成本可能高达数十万美元 │
│ │
│ 问题2:泛化能力有限 │
│ ───────────────────────────────────────────────────────────── │
│ 模型只会模仿训练数据中的回答方式 │
│ 遇到训练集没见过的新任务,可能表现很差 │
│ │
│ 问题3:回答质量依赖标注员水平 │
│ ───────────────────────────────────────────────────────────── │
│ 标注员的水平上限 = 模型的上限 │
│ 要训练出 GPT-4 水平的模型,需要 GPT-4 级别的标注数据! │
│ │
└─────────────────────────────────────────────────────────────────┘关键洞察:OpenAI 在 2022 年的 InstructGPT 论文中发现,RLHF 比 SFT 能用更少的数据达到更好的效果。这推动了 RLHF 的广泛采用。
第3部分:RLHF — 人类反馈强化学习
3.1 为什么需要 RLHF
SFT 不够的根本原因:
1. 无法定义"好"的数学形式
"什么是一篇好的请假邮件?" → 很难用规则写清楚
2. 人工标注成本高且质量有上限
要让 AI 超越人类水平,必须用 AI 来帮助训练
RLHF 的核心思想:
不用人工定义"好",而是让人类来比较"哪个更好"
然后用强化学习让模型学会"生成人类更喜欢的内容"3.2 RLHF 三阶段概述
┌─────────────────────────────────────────────────────────────────┐
│ RLHF 三阶段流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Stage 1:收集人类偏好数据 │ │
│ │ │ │
│ │ Prompt A: "什么是量子计算?" │ │
│ │ Response 1: "量子计算是一种..." │ │
│ │ Response 2: "量子计算利用..." │ │
│ │ 人类选择:哪个更好? → Response 1 │ │
│ │ │ │
│ │ 收集 10 万到 100 万个这样的偏好对比 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Stage 2:训练 Reward Model(奖励模型) │ │
│ │ │ │
│ │ 输入:Prompt + Response │ │
│ │ 输出:一个分数(越高表示人类越喜欢) │ │
│ │ │ │
│ │ 训练目标:让 RM 的打分和人类偏好一致 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Stage 3:用 PPO 微调 LLM │ │
│ │ │ │
│ │ LLM 生成回答 → RM 打分 → 根据分数更新 LLM │ │
│ │ 目标:让 LLM 生成 RM 高分的内容 │ │
│ │ 同时:用 KL 约束防止 LLM 跑偏 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘3.3 Stage 1 — 收集人类偏好数据
这是 RLHF 中最"贵"的部分,也是质量瓶颈。
偏好数据的格式:
┌─────────────────────────────────────────────────────────────────┐
│ 原始 Prompt:写一个 Python 函数判断回文数 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Response A: │
│ def is_palindrome(n):\n s = str(n)\n return s == s[::-1] │
│ 简洁,正确,但缺少注释 │
│ │
│ Response B: │
│ def is_palindrome(n):\n """判断一个整数是否为回文数"""...\n │
│ 包含 docstring,有示例,有边界处理 │
│ │
│ 人类偏好:B > A(更详细) │
│ │
└─────────────────────────────────────────────────────────────────┘偏好数据的特点:
- 不需要绝对打分,只需要相对比较(哪个更好)
- 相对比较更容易判断,成本更低
- 通常每个 Prompt 生成 4-9 个候选回答,让人类排序
3.4 Stage 2 — 训练 Reward Model
Reward Model(RM)的任务:给定 Prompt + Response,输出一个分数。
Reward Model 的结构:
┌─────────────────────────────────────────────────────────────────┐
│ Reward Model(本质上是一个 LLM + 回归头) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Input: Prompt + Response │
│ ↓ │
│ Base LLM 处理文本 → 输出向量 │
│ ↓ │
│ 新增一个线性层:reward_head │
│ ↓ │
│ Output: 一个标量分数 r │
│ │
│ r ∈ (-∞, +∞) │
│ 越高 = 越符合人类偏好 │
│ │
└─────────────────────────────────────────────────────────────────┘RM 的训练( Bradley-Terry 模型):
训练目标:
对于同一个 Prompt 的两个回答 A 和 B:
如果人类更喜欢 A:RM(A) > RM(B)
Loss = -log(σ(RM(A) - RM(B)))
其中 σ 是 sigmoid 函数
直观理解:
如果 RM(A) > RM(B) → Loss → 0,RM 被奖励
如果 RM(A) < RM(B) → Loss → 大,RM 被惩罚3.5 Stage 3 — PPO 微调
PPO(Proximal Policy Optimization) 是强化学习中的一种策略优化算法。
不需要完全理解 PPO 的数学推导,重点理解它的核心思想和在 RLHF 中的作用。
PPO 在 RLHF 中的核心思想:
1. 让 LLM 生成一批回答
2. 用 Reward Model 给每个回答打分
3. 根据分数调整 LLM 的参数:高分回答的概率 ↑,低分回答的概率 ↓
4. 用 PPO 的特殊技巧保证:每次只更新一点点,不要一下子跑太远KL 约束 = 防止模型"作弊"
问题:如果只追求 Reward Model 的高分,模型可能:
├─ 学会"取悦"Reward Model,而不是真正有用
├─ 生成语法正确但事实错误的内容
└─ 输出过于冗余(长回答往往分数更高)
KL 约束的作用:
KL(π_llm || π_sft) = 新模型和 SFT 模型的"距离"
优化目标 = Reward - β × KL
(β 是 KL 惩罚系数)
效果:模型在提升 Reward 的同时,
必须不能离 SFT 太远3.6 RLHF 的效果对比
┌─────────────────────────────────────────────────────────────────┐
│ RLHF 效果实测(InstructGPT 论文) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 评测方式:人类评估员对比不同模型对同一 Prompt 的回答质量 │
│ │
│ 结果(Preferred by human evaluators): │
│ │
│ 1. SFT-1.3B ████ │
│ 2. SFT-175B ██████████ │
│ 3. PPO-1.3B ████████████████ │
│ 4. PPO-175B ████████████████████████████(最佳) │
│ 5. PPO-1.3B + KL ↓ ████████████████████████████ │
│ │
│ 关键发现: │
│ - PPO-1.3B 超过了 SFT-175B! │
│ - 说明 RLHF 比单纯增大模型规模更有效 │
│ - 小模型 + RLHF > 大模型 + SFT(到一定程度) │
│ │
└─────────────────────────────────────────────────────────────────┘第4部分:DPO — 绕过强化学习
4.1 RLHF 的痛点
RLHF 虽然效果好,但工程实现非常复杂:
RLHF 的工程复杂度:
1. 需要同时运行三个模型:
├─ LLM(主模型,要更新的)
├─ Reward Model(打分模型,固定的)
└─ Reference Model(SFT 模型,固定的)
2. PPO 的超参数非常敏感:
├─ 学习率
├─ KL 系数 β
└─ 价值函数系数
3. 训练不稳定,容易崩溃
4. 超参数调优成本极高4.2 DPO 的核心思想
DPO(Direct Preference Optimization,直接偏好优化) 提出了一个革命性的简化:
关键观察:
RLHF 的优化目标(简化版):
最大化 Reward,同时保持和 Reference Model 的 KL 约束
这个问题有闭式解!
Reward = α·KL divergence 的函数
所以:不需要 Reward Model
不需要 PPO
只需要偏好数据,直接优化!4.3 DPO 的数学直觉
DPO 的 Loss 函数:
L_DPO = - E_(x, y_w, y_l) [log(σ(r_θ(x, y_w) - r_θ(x, y_l)))]
其中:
- y_w = 人类偏好的回答(winning)
- y_l = 人类不喜欢的回答(losing)
- r_θ = 用 LLM 自己充当 reward 函数(而不需要单独的 RM)
- σ = sigmoid 函数
直观理解:
让 LLM 学会:
r_θ(x, y_w) > r_θ(x, y_l)
即使得偏好的回答得分更高,不偏好的回答得分更低4.4 DPO vs RLHF 对比
| RLHF | DPO | |
|---|---|---|
| 模型数量 | 3个(LLM + RM + Ref) | 2个(LLM + Ref) |
| 强化学习 | 需要 PPO | 不需要 |
| 训练稳定性 | 不稳定,超参敏感 | 更稳定 |
| 数学复杂度 | 高(策略优化) | 低(类似 SFT 的分类问题) |
| 效果 | 效果更好(理论上) | 效果相当(实践中) |
| 偏好数据格式 | pairwise | pairwise |
| 实现难度 | 高 | 低 |
实践中的选择:
OpenAI / Anthropic 等大厂:仍用 RLHF(控制力更强)
开源社区:大量使用 DPO(Llama 3、Qwen 等都用了 DPO)
原因:DPO 实现简单,效果足够好4.5 代码对比:RLHF vs DPO
RLHF(使用 trl 库的 PPOTrainer):
from trl import PPOTrainer, PPOTrainerConfig
config = PPOTrainerConfig(
model_name="meta-llama/Llama-3-8B",
learning_rate=1.4e-5,
)
trainer = PPOTrainer(config, model, ref_model, reward_model, ...)
trainer.train() # 复杂的 PPO 训练循环
DPO(使用 trl 库的 DPOTrainer):
from trl import DPOTrainer, DPOConfig
config = DPOConfig(
model_name="meta-llama/Llama-3-8B",
learning_rate=1.0e-6,
beta=0.1, # KL 系数,DPO 的唯一关键超参
)
trainer = DPOTrainer(config, model, ref_model, ...)
trainer.train() # 简单的对比学习循环超参对比:RLHF 需要调 PPO 学习率、KL 系数、价值函数系数、PPO epoch 数等。DPO 只需要调 beta(KL 系数),简单得多。
第5部分:Alignment 家族一览
5.1 为什么叫 Alignment
Alignment(对齐) = 让 AI 的行为和人类意图/价值观一致。
不对齐的问题:
├─ 模型可能帮助用户做有害的事情
├─ 模型可能生成虚假信息
├─ 模型可能歧视特定群体
└─ 模型可能不遵循安全指令
对齐的目标:
让 AI Helpful(有用)、Harmless(无害)、Honest(诚实)
= HHH 原则5.2 InstructGPT — RLHF 的开创者
InstructGPT(2022)是第一个系统性地将 RLHF 用于 LLM 对齐的论文:
┌─────────────────────────────────────────────────────────────────┐
│ InstructGPT 完整训练流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ GPT-3(预训练,175B 参数) │
│ ↓ │
│ Stage 1:SFT(人工标注的 demo 数据,~13k 条) │
│ ↓ │
│ SFT-175B 模型 │
│ ↓ │
│ Stage 2:RM 训练(人类偏好对比数据,~33k 条) │
│ ↓ │
│ Reward Model │
│ ↓ │
│ Stage 3:PPO 微调(RM 打分,~31k 条) │
│ ↓ │
│ InstructGPT (PPO-175B) │
│ │
│ 关键数据量: │
│ SFT: 13k demo examples │
│ RM: 33k comparison examples │
│ PPO: 31k prompts │
│ │
│ 小于 5 万条人类标注数据 >> 1750 亿参数预训练模型 │
│ │
└─────────────────────────────────────────────────────────────────┘5.3 Constitutional AI — Anthropic 的方法
Constitutional AI(CAI) 是 Anthropic 在 Claude 中使用的方法:
核心思想:不用人类对每个回答打分,而是用一套"准则(Constitution)"来引导 AI
准则示例:
1. "选择一个对所有文化背景的人都尊重和包容的回答"
2. "选择一个避免仇恨言论的回答"
3. "选择一个事实准确的回答"
训练流程:
1. 让 LLM 自我批评(用准则评估自己的回答)
2. 修改回答使其更符合准则
3. 用这些自我修改的数据做微调
优点:
- 大幅减少人类标注量
- 可以迭代改进准则
- 比纯人类反馈更一致5.4 RLAIF — 用 AI 反馈替代人类反馈
RLAIF(RL from AI Feedback) = 用另一个 AI 模型打分替代人类偏好:
RLAIF vs RLHF:
RLHF:人类对回答打分 → 训练 RM → PPO 微调
RLAIF:AI(通常是更大的模型)对回答打分 → 训练 RM → PPO 微调
Google 的实验结果(2023):
RLAIF 在某些任务上达到了和 RLHF 相当的效果
优点:
- 不需要人类标注,成本大幅降低
- 可以用更大的模型来评估小模型
- 一致性更高(AI 不会疲劳,不会矛盾)
缺点:
- 需要一个足够强的 AI 模型来打分
- 存在"自我服务偏差"(大模型可能给自己的回答打高分)5.5 Alignment 方法对比
|| 核心思想 | 标注成本 | 效果 | 代表模型 | |---------|---------|------|---------| | SFT | 模仿人工标注的回答 | 高 | 一般 | GPT-3(早期) | | RLHF | 人类偏好 + 强化学习 | 很高 | 最好 | ChatGPT、Claude(早期) | | DPO | 直接用偏好数据优化 | 高 | 很好 | Llama 3、Qwen2 | | CAI | AI 自我批评 + 准则 | 低 | 很好 | Claude | | RLAIF | AI 替代人类打分 | 低 | 不错 | Gemini |
第6部分:Post-Training Pipeline — 完整流程
6.1 业界完整流程
┌─────────────────────────────────────────────────────────────────┐
│ LLM Post-Training 完整 Pipeline │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. Base Model(预训练模型) │
│ ↓ │
│ 2. 数据收集与清洗 │
│ ├─ 开源数据集(SlimPajama、RedPajama 等) │
│ ├─ 人工标注(SFT 数据) │
│ ├─ 人类偏好数据(RM 数据) │
│ └─ 质量过滤(去除低质量、有害内容) │
│ ↓ │
│ 3. SFT(Supervised Fine-Tuning) │
│ 几万到几百万条 Prompt-Response 数据 │
│ → 得到 SFT Model │
│ ↓ │
│ 4a. RM 训练(如果用 RLHF) │
│ 人类偏好对比数据 │
│ → 得到 Reward Model │
│ ↓ │
│ 4b. DPO / RLHF / CAI 对齐 │
│ → 得到对齐后的模型 │
│ ↓ │
│ 5. Safety Red Teaming(安全红队测试) │
│ 专门测试有害内容,修复漏洞 │
│ ↓ │
│ 6. Benchmark 评测 │
│ ├─ MMLU(多任务知识理解) │
│ ├─ HumanEval(代码生成) │
│ ├─ GSM8K(数学推理) │
│ └─ MT-Bench(多轮对话) │
│ ↓ │
│ 7. 模型发布 │
│ ├─ Base 版本(研究用) │
│ ├─ Instruct 版本(SFT 后) │
│ └─ Chat 版本(对齐后) │
│ │
└─────────────────────────────────────────────────────────────────┘6.2 各环节资源与耗时
|| 环节 | 数据量 | GPU 资源 | 耗时 | |------|------|---------|------| | SFT | 10K-1M 条 | 8-64 卡 | 数天 | | RM 训练 | 10K-100K 对比 | 8-64 卡 | 数天 | | RLHF/DPO | 数万 prompt | 8-64 卡 | 数天到数周 | | 红队测试 | N/A(人工) | N/A | 数周 | | Benchmark 评测 | N/A | N/A | 数天 |
对比预训练:预训练一个 70B 模型需要数千卡、数月。Post-Training 的总耗时通常在几周到几个月,远少于预训练。
核心总结
总结1:Base Model 和 Instruct Model 的差距
Base Model:会续写,但不会听话
Instruct Model:能理解并执行指令
差距来源:Post-Training(主要是 SFT + RLHF/DPO)总结2:SFT vs RLHF vs DPO
SFT:人工标注 Prompt-Response 对,直接监督学习
简单但成本高、泛化差
RLHF:人类偏好数据 → Reward Model → PPO 微调
效果好但工程复杂
DPO:直接用偏好数据优化,效果接近 RLHF,实现更简单
主流选择总结3:Alignment 的意义
Alignment = 让 AI 的行为符合人类意图
核心挑战:如何定义"好"?
├─ 显式定义(SFT)→ 成本高
├─ 人类比较(RLHF/DPO)→ 效果好
├─ 准则引导(CAI)→ 成本低
└─ AI 反馈(RLAIF)→ 可扩展章节测试
测试1:Base Model 问题
为什么预训练后的 Base Model 不能直接作为聊天助手使用?请用一个具体例子说明。
测试2:SFT 局限性
SFT 的三个主要局限性是什么?为什么说 RLHF 比 SFT 更高效?
测试3:RLHF 流程
描述 RLHF 三个阶段的输入、输出和核心目标。
测试4:DPO vs RLHF
DPO 相比 RLHF 解决了哪些痛点?两者在工程实现上的最大差异是什么?
测试5:Alignment 方法选择
如果一个团队资源有限(只有少量标注预算),应该优先选择哪种 Alignment 方法?为什么?
测试6:完整 Pipeline
按照业界最佳实践,给出一个从 Base Model 到 Chat Model 的完整 Pipeline,并标注每个环节的主要输入。
参考答案
测试1答案
答案:预训练模型只会"续写",不会"理解并执行指令"。
解析:
示例:
用户输入:"帮我写一封请假邮件"
Base Model 的输出:
"写一封请假邮件通常包括以下部分:标题、称谓、正文、落款。
其中正文需要说明请假原因、时间等信息..."
问题分析:
Base Model 把"帮我写一封请假邮件"当作普通文本续写,
而不是当作用户的"请求"来理解。
它输出的是关于"如何写请假邮件"的文本,
而不是"一封具体的请假邮件"本身。
这说明 Base Model 没有学会"遵循指令"这种行为模式。测试2答案
答案:SFT 的三个局限性:
1. 数据标注成本极高
覆盖所有任务类型需要大量高质量人工标注
标注员水平上限 = 模型水平上限
2. 泛化能力有限
模型只会模仿训练数据中的回答方式
遇到没见过的新任务可能表现很差
3. 难以定义"好"的数学形式
有些回答质量很难用规则描述
比如"什么样的代码更好看"?
RLHF 更高效的原因:
- 不需要定义"好"的绝对标准
- 只需要人类判断"哪个更好"(相对比较)
- 可以让模型自主探索更优的回答方式
- 少量偏好数据(万级)就能显著提升效果测试3答案
答案:
Stage 1:收集人类偏好数据
├─ 输入:Prompt + 多个候选回答
├─ 输出:人类偏好标记(如 Response A > Response B)
└─ 核心目标:建立"人类认为什么是好回答"的数据集
Stage 2:训练 Reward Model
├─ 输入:Prompt + Response 对
├─ 输出:标量分数 r(越高越符合人类偏好)
└─ 核心目标:学习一个能预测人类偏好的打分函数
Stage 3:PPO 微调 LLM
├─ 输入:LLM 生成的回答 + RM 分数
├─ 输出:更新后的 LLM 参数
└─ 核心目标:最大化 RM 分数,同时保持和 SFT 模型的 KL 约束测试4答案
答案:
DPO 解决的 RLHF 痛点:
1. 不需要单独的 Reward Model
RLHF 需要同时运行 3 个模型(LLM + RM + Ref)
DPO 只需要 2 个模型(LLM + Ref)
2. 不需要复杂的 PPO 强化学习
PPO 有多个敏感超参数,训练不稳定
DPO 本质上是一个简单的对比学习问题
3. 实现和调参都更简单
RLHF 需要调 PPO 学习率、KL 系数、价值函数系数...
DPO 只需要调一个参数:beta(KL 系数)
最大工程差异:
RLHF 使用强化学习(策略优化)来更新模型
DPO 使用监督学习(类似 SFT)来更新模型测试5答案
答案:优先选择 DPO 或 Constitutional AI。
解析:
推荐策略:
如果有一定标注预算 + 想要最好的效果:
→ DPO
├─ 只需要偏好对比数据(比 SFT 的完整回答标注便宜)
├─ 效果接近 RLHF
└─ 实现简单,开源工具成熟(trl 库)
如果预算非常有限:
→ Constitutional AI(CAI)
├─ 用 AI 自我批评代替人类标注
├─ 准则可以迭代改进
└─ 适合快速原型验证
不推荐:
→ 纯 SFT(泛化差,数据标注成本高)
→ 完整 RLHF(工程复杂,调试成本高)测试6答案
答案:
Base Model(预训练模型)
↓
数据收集与清洗
├─ 开源数据集(RedPajama 等)
├─ 人工标注 SFT 数据
└─ 人类偏好对比数据
↓
SFT(Supervised Fine-Tuning)
输入:Prompt-Response 对
输出:SFT Model
↓
Reward Model 训练(如果用 RLHF)
输入:人类偏好对比数据
输出:能打分的 RM
↓
对齐微调(RLHF 或 DPO)
输入:RM打分数据 或 偏好对比数据
输出:对齐后的模型
↓
Safety Red Teaming
输入:有害/边缘场景测试用例
输出:修复安全漏洞
↓
Benchmark 评测
输入:标准化评测集(MMLU、HumanEval 等)
输出:性能指标报告
↓
模型发布(Base / Instruct / Chat 版本)相关笔记
- [[11 - 训练基础扫盲]] - 训练循环、Loss、优化器的基础
- [[07 - LLM 进化史]] - LLM 的演进历史和 GPT 系列
- [[13 - 训练基础设施]] - 分布式训练和 Infra 组件
下一步学习
- [ ] 阅读 13 - 训练基础设施
学习状态:🟡 待学习