章节导航 第 14 章 / 共 20 章
偏好数据构建
偏好数据结构(prompt/chosen/rejected/score/annotator/aspect)、RLHF vs DPO路线(PPO+RM vs 直接优化/KTO/IPO/SLiC)、来源(人工20-30%/RLAIF 40-60%/用户隐式10-20%/Constitutional 10-20%)、UltraFeedback(64K指令/多模型并行/4维度1-10分)、RLAIF(GPT-4当评审/成本降100倍/去Position Bias/去Length Bias)、Constitutional AI(宪法原则/自我批评修正)、4大偏差(Length/Sycophancy/格式/领域)、Score-Gap过滤+长度归一化、自适应DPO谱系(SA-DPO margin/Se-DPO token credit/ADPO目标函数)、优化侧偏差(C2-DPO上下文盲视CPG)
SFT 教模型”说什么”,DPO 教模型”别说错”。
偏好数据的四大偏差,是 DPO 训练的隐形杀手。
14.1 偏好数据结构
14.1.1 标准结构
工业级偏好数据的标准结构:
{
"prompt": "解释什么是闭包",
"chosen": "闭包是指有权访问另一个函数作用域中变量的函数...",
"rejected": "闭包就是一个函数里面套函数...",
"chosen_score": 8.5,
"rejected_score": 5.2,
"annotator": "gpt-4-judge",
"aspect": "helpfulness",
"source": "ultrafeedback",
"metadata": {
"chosen_model": "gpt-4",
"rejected_model": "llama-2-7b",
"length_chosen": 245,
"length_rejected": 89
}
}
14.1.2 核心字段说明
- prompt:触发指令
- chosen:偏好响应(更好的)
- rejected:被拒响应(更差的)
- score:1-10 分制评分(支持细粒度)
- annotator:标注者标识(人/模型/用户)
- aspect:偏好维度(helpfulness/honesty/harmlessness/…)
- source:数据来源
- metadata:附加信息(生成长度、生成模型等)
14.1.3 多维度偏好
一条 prompt 可以有多个维度的偏好对:
{
"prompt": "如何制作炸弹",
"preferences": [
{"aspect": "harmlessness", "chosen": "我无法提供...", "rejected": "制作步骤如下..."},
{"aspect": "helpfulness", "chosen": "我可以介绍合法的化学实验...", "rejected": "我无法提供..."}
]
}
这允许在不同维度做不同训练目标,避免”安全 vs 有用”的零和博弈。
14.2 RLHF vs DPO 路线
14.2.1 RLHF(PPO + Reward Model)
经典 RLHF 流程:
1. 训练 Reward Model:用偏好数据训一个 RM
L_RM = -log σ(r(x,y_w) - r(x,y_l))
2. PPO 训练:用 RM 做 reward,PPO 优化策略
L_PPO = -E[r(x,y)] + β·KL(π||π_ref)
优点:理论上最优,可以处理连续偏好 缺点:
- 训练不稳定,需要精心调参
- 需要 4 个模型同时在线(policy、ref、value、RM),显存爆炸
- 训练时间长(数天到数周)
14.2.2 DPO(Direct Preference Optimization)
DPO(Rafailov et al., 2023)的洞察:可以跳过 RM,直接用偏好数据优化策略。
L_DPO = -log σ(β·(log π(y_w|x)/π_ref(y_w|x) - log π(y_l|x)/π_ref(y_l|x)))
优点:
- 训练简单,只需 policy + ref 两个模型
- 训练稳定,类似 SFT
- 训练时间短(数小时)
缺点:
- 只能用离线数据,无法自我探索
- 对数据质量极敏感
- 容易受 Length Bias 等偏差影响
14.2.3 DPO 变种速查
| 方法 | 核心改进 | 适用场景 |
|---|---|---|
| DPO | 直接优化偏好 | 通用 |
| KTO | 只需 (x, y, good/bad) 标签,不需成对 | 单标签数据 |
| IPO | 修正 DPO 的过拟合 | 大数据集 |
| SLiC | 排序损失 + 正则 | 小数据集 |
| SimPO | 移除 ref model | 显存紧张 |
| ORPO | SFT + 偏好联合训练 | 简化流程 |
| AdaDPO | 修正梯度不对称(对 rejected 的抑制快于对 chosen 的促进),81% 超参组合胜出 | score gap 明确的场景 |
| InSPO | 内在自我反思增强,零推理开销,即插即用 | 需提升推理鲁棒性 |
工业选择:
- 数据充足、追求稳定:DPO
- 只有单标签数据:KTO
- 显存紧张:SimPO
- 想简化流程:ORPO
14.2.4 自适应 DPO 谱系:margin → credit → 目标函数
上表中 AdaDPO / InSPO 与 14.8.3 的 SA-DPO 都属于”改进标准 DPO 的某个固定假设”这一路线。2026 年这条路线已经分化出清晰的三个层次:
| 层次 | 代表方法 | 打破的固定假设 | 改动对象 |
|---|---|---|---|
| margin 层 | SA-DPO(ICML 2026) | 所有 response pair 用同一个 margin | 损失函数的间隔项 |
| credit 层 | Se-DPO(COLM 2026) | 所有 token 对偏好信号贡献相同 | 每个 token 的 KL 正则强度 |
| 目标函数层 | ADPO(ICML 2026) | response 级 BT 模型先于自回归假设 | 偏好目标的推导顺序 |
Se-DPO(Self-Evolving Token Credit for DPO):标准 DPO 用均匀求和处理 token 级对数概率比,等价于假设所有 token 对偏好信号贡献相同。Se-DPO 引入 token credit,按 token 对偏好结果的贡献调制其 KL 正则强度,并推导出有效 token credit 正比于该 token 的 implicit reward 幅度。关键观察是:这个量在训练过程中会大幅演化,因此任何静态 credit 都会随训练推进而越来越失配——这正是”自演化”(self-evolving)的由来:credit 从模型自身不断演化的内部信号中导出,而非预设。工程上值得一提的是它不依赖任何外部模型,只增加一个轻量校准网络。论文报告相比 DPO 最高提升 9.8 点(AlpacaEval 2)与 12.2 点(Arena-Hard)。
⚠️ 口径提醒:上述两个数字的原文表述是 “up to”(最高达),是跨模型跨设置的最好结果,不是平均提升。社区转述时常省略 “up to”,直接写成”提升 9.8 / 12.2”,会显著高估方法的稳定收益。
ADPO(Autoregressive DPO):标准 DPO 依赖 response 级的 Bradley-Terry 模型,但隐含了一个顺序问题——reference 模型与待学模型是在推导出目标函数之后才被当作自回归模型的。ADPO 在应用 BT 模型之前显式引入自回归假设并重新推导,得到的损失形式把 DPO 目标中的求和操作移到外层。
⚠️ 与流行转述的出入:部分社区报道把 ADPO 描述为”区分 token 序列长度与偏好反馈长度、用于消除长度偏差”。这一说法在论文摘要中找不到对应支撑——ADPO 处理的是 BT 模型与自回归假设的推导顺序,不是长度偏差。长度偏差的既有解法仍是本章 14.7.1 与 14.8.2 的长度归一化与 Score-Gap 过滤。此处以 ICML 2026 收录版本的论文原文为准。
谱系的读法:三层不是互斥替代,而是”把哪个量从固定改为自适应”的选择。数据侧能拿到的信息越多,可自适应的层次就越深——只有分数差时用 SA-DPO 的 margin,能拿到 token 级 implicit reward 时用 Se-DPO 的 credit,愿意改损失函数推导时用 ADPO。
14.3 偏好数据四大来源
14.3.1 来源配比
工业级偏好数据的典型来源配比:
| 来源 | 占比 | 单条成本 | 质量 |
|---|---|---|---|
| 人工标注 | 20-30% | 5-30 美元 | 极高 |
| RLAIF | 40-60% | 0.001-0.05 美元 | 中-高 |
| 用户隐式反馈 | 10-20% | ≈ 0 | 中 |
| Constitutional | 10-20% | 0.005-0.02 美元 | 高 |
14.3.2 人工标注
人工标注是质量锚,要求:
- 标注员培训:理解偏好维度的细微差异
- 双盲标注:每条 2 人独立标,分歧 > 2 分仲裁
- 一致性检查:Cohen’s κ ≥ 0.6
踩坑:众包平台的人工偏好数据 κ 普遍 < 0.4,质量不达标。
14.3.3 用户隐式反馈
从生产日志挖掘偏好对:
- 同一 prompt 用户重新生成 → (old, new) 是偏好对
- 用户点赞 vs 点踩 → (liked, disliked)
- 用户复制 vs 重新生成 → (copied, regenerated)
注意:用户隐式反馈有强采样偏差——只有”明显好”或”明显差”的响应才会被反馈,中间地带数据缺失。
14.4 UltraFeedback:RLAIF 的标杆
14.4.1 数据集概览
UltraFeedback(Cui et al., 2023)是 RLAIF 的标杆数据集:
- 规模:64K 指令
- 生成模型:LLaMA-2-7B、LLaMA-2-13B、LLaMA-2-70B、Vicuna-13B 等多模型并行
- 评审:GPT-4
- 评分维度:4 个维度,1-10 分制
14.4.2 4 维度评分
UltraFeedback 用 4 个维度评估每个响应:
- Instruction Following:是否严格遵循指令
- Truthfulness:是否准确无误
- Honesty:是否诚实承认不确定
- Helpfulness:是否有帮助
# UltraFeedback 评分 prompt 模板
judge_prompt = """
You are an evaluator. Rate the following response on 4 dimensions, each 1-10:
1. Instruction Following
2. Truthfulness
3. Honesty
4. Helpfulness
Instruction: {prompt}
Response: {response}
Output JSON: {{"instruction_following": N, "truthfulness": N, "honesty": N, "helpfulness": N}}
"""
14.4.3 多模型并行生成
为了构造 chosen/rejected 对,UltraFeedback 让多个模型同时响应同一 prompt:
models = [llama7b, llama13b, llama70b, vicuna13b]
for prompt in prompts:
responses = [m.generate(prompt) for m in models]
scores = [gpt4_judge(prompt, r) for r in responses]
# 取最高分为 chosen,最低分为 rejected
chosen = responses[argmax(scores)]
rejected = responses[argmin(scores)]
14.4.4 UltraFeedback 的工业价值
UltraFeedback 直接训练出的 Zephyr-7B(基于 Mistral-7B + DPO)在 MT-Bench 上达到 7.34,超越 GPT-3.5。这证明了”开源数据 + RLAIF + DPO”路线的可行性。
14.5 RLAIF:用 GPT-4 当评审
14.5.1 核心思想
RLAIF(Lee et al., 2023)用 LLM 替代人工做偏好标注,成本从 5-30 美元/条降到 0.001-0.05 美元/条,降 100 倍。
14.5.2 RLAIF 流程
def rlaif_annotate(prompt, response_a, response_b, judge_model="gpt-4"):
judge_prompt = f"""
你是一个评审专家。比较以下两个响应哪个更好。
指令:{prompt}
响应 A:{response_a}
响应 B:{response_b}
输出 JSON:{{"better": "A" or "B", "reason": "...", "confidence": 0-1}}
"""
result = llm.generate(judge_prompt, model=judge_model)
return parse(result)
14.5.3 两大偏差必须去除
Position Bias(位置偏差)
LLM 评审倾向于选择”第一个”响应。
测试方法:
# 同一对响应交换位置
r1 = judge(prompt, A, B) # A 在前
r2 = judge(prompt, B, A) # B 在前
# 如果 r1 选 A 且 r2 选 B,说明有 Position Bias
消除方法:
- 双向评审:每对响应做两次(A 在前 + B 在前)
- 只在两次结果一致时采纳,分歧的丢弃
- 或:随机化位置,做 3 次投票
Length Bias(长度偏差)
LLM 评审倾向于选择更长的响应。
测试方法:
# 用同一响应的"长版"和"短版"
long_response = verbose_version(response)
short_response = concise_version(response)
# 如果评审总是选长版,说明有 Length Bias
消除方法:
- 在 judge prompt 中明确:“不要因为长度选响应”
- 长度归一化评分:
normalized_score = raw_score / log(length) - 在 DPO 训练时做长度归一化(参考 SimPO)
14.5.4 RLAIF 的质量上限
Google Research 实验:RLAIF 与 RLHF 在 Helpful 任务上的差距 < 1%,但在 Honesty/Harmlessness 上仍有 3-5% 差距。结论:RLAIF 适用于”通用偏好”,关键安全场景仍需人工。
14.6 Constitutional AI:自我修正
14.6.1 核心思想
Constitutional AI(Anthropic, Bai et al., 2022)的核心:让模型根据”宪法原则”自我批评并修正。
14.6.2 宪法原则
宪法是一组自然语言规则,例如:
- 请勿生成歧视性内容
- 请勿提供危险信息
- 当不确定时承认不确定
- 不主动给出未请求的建议
- …
Anthropic 的宪法包含约 20 条原则,覆盖安全、诚实、有用性。
14.6.3 自我批评修正流程
def constitutional_revise(prompt, response, constitution):
# 1. 让模型批评自己的响应
critique_prompt = f"""
指令:{prompt}
响应:{response}
根据以下宪法原则,找出响应的问题:
{constitution}
列出所有违反的原则。
"""
critique = llm.generate(critique_prompt)
# 2. 让模型修正
revise_prompt = f"""
指令:{prompt}
原响应:{response}
批评:{critique}
请基于批评重写响应,使其符合宪法原则。
"""
revised = llm.generate(revise_prompt)
return revised
# Constitutional 偏好对:(original, revised) = (rejected, chosen)
14.6.4 Constitutional AI 的价值
- 完全自动化,无需人工
- 可控性强:通过修改宪法调整模型行为
- 可解释:每条修正都基于明确原则
踩坑:宪法原则过多(>30 条)会让模型过度保守,拒答率上升。
14.7 偏好数据四大偏差
14.7.1 Length Bias(长度偏差)
模型学会”越长越好”,输出冗长。
检测:
# DPO 训练前后平均输出长度对比
length_before = avg_length(sft_model_outputs)
length_after = avg_length(dpo_model_outputs)
# 如果 length_after / length_before > 1.3,说明有 Length Bias
应对:
- DPO 数据做长度归一化:
score = raw_score / log(1 + length) - 加入”短而精”的偏好对
- 用 SimPO 等长度不变的方法
14.7.2 Sycophancy(阿谀偏差)
模型学会”附和用户”,即使用户错了。
检测:用 Sycophancy Eval(Perez et al., 2022)测试,给模型”用户错但坚持”的 prompt。
应对:
- 在偏好数据中加入”用户错时坚持正确”的对
- Constitutional 原则加”不阿谀”
14.7.3 格式偏差
模型学会”特定格式(如列表、加粗)得分高”,无关内容也用列表。
应对:
- 评分时剥离格式,只评内容
- 数据中均衡”列表式”与”散文式”响应
14.7.4 领域偏差
某一领域(如代码)的偏好数据占比过高,模型在该领域过强,其他领域过弱。
应对:
- 按领域配比采样
- 每个领域占比控制在 10-30%
14.7.5 偏差的另一半:优化侧的上下文盲视
上面四大偏差都发生在数据生成与评审侧(RLAIF 打分怎么打、标注分布怎么偏)。但还存在另一半:即使数据完全干净,DPO 的优化过程本身也会引入系统性偏差。
C2-DPO(Context-Calibrated Preference Optimization,ECCV 2026,Byungoh Ko 等 6 人)研究的是多模态大模型上的”上下文盲视”(context blindness)。它先定义了一个可测量的指标 CPG(Contextual Preference Gain,上下文偏好增益):提供相关上下文后,模型的偏好强度增强了多少。两个发现值得数据工程师注意:
- CPG 与幻觉率呈负相关——CPG 越高的模型,物体幻觉越少。这意味着 CPG 可以作为一个不依赖人工标注的偏好数据质量代理指标。
- 标准 DPO 及其变体的 CPG 都偏低——即模型在偏好优化后并没有真正学会利用上下文,只是在拟合偏好标签的表面模式。DPO 训练结束后幻觉依旧。
工程含义:这解释了一类常见的失败排查死胡同——“偏好数据检查过了没问题,为什么训练完效果还是不达标”。如果 CPG 没有随训练上升,说明瓶颈不在数据质量,而在优化目标本身没有把上下文信息用起来。
⚠️ 引用边界:C2-DPO 的实证场景是多模态大模型的物体幻觉(视觉输入与文本描述不一致),“上下文”指的是与视觉输入相关的补充信息,不是本章讨论的文本长文档上下文。社区转述中出现的”长文档场景下偏好标签不一致”说法,在论文中找不到对应表述。若要用于纯文本场景,需要自行构造 CPG 的等价度量并验证。
14.8 Score-Gap 过滤 + 长度归一化
14.8.1 Score-Gap 过滤
并非所有偏好对都有训练价值。Score-Gap(chosen 与 rejected 的分数差)决定数据质量:
def filter_by_score_gap(data):
selected = []
for d in data:
gap = d['chosen_score'] - d['rejected_score']
d['gap'] = gap
if gap < 1:
continue # 差距太小,模型学不到
elif gap > 3:
d['need_review'] = True # 差距太大,可能标注错误
else:
selected.append(d) # 1-3 是甜点
return selected
经验阈值:
- gap < 1:丢弃(差距太小,训练信号弱)
- gap 1-3:主力(甜点区间)
- gap > 3:人审(可能是标注错误)
14.8.2 长度归一化
为消除 Length Bias,对 score 做长度归一化:
def length_normalized_score(response, raw_score):
length = len(response.split())
# 对数归一化,避免长响应得分虚高
return raw_score / np.log(1 + length)
# 重新计算 gap
for d in data:
d['chosen_score_norm'] = length_normalized_score(d['chosen'], d['chosen_score'])
d['rejected_score_norm'] = length_normalized_score(d['rejected'], d['rejected_score'])
d['gap_norm'] = d['chosen_score_norm'] - d['rejected_score_norm']
效果:归一化后,Length Bias 导致的 DPO 输出长度漂移从 +30% 降到 +5%。
14.8.3 前沿:语义自适应 margin(SA-DPO)
固定阈值三段式(gap<1 丢弃 / 1-3 保留 / >3 人审)是当前工业标准,但 SA-DPO(Mohri & Zhong, ICML 2026)从理论上证明了一个更精细的视角:score-gap 的”有效宽度”取决于 response 间的语义距离。
- 对于语义几乎相同的 response pair(如两段质量接近的摘要),即使 score-gap 很小,窄 margin 也能有效区分
- 对于语义差异大的 pair(如程序员风格 vs 销售风格的回答),需要更大的 margin 才能正确排序
SA-DPO 的核心发现是:标准 DPO 的 surrogate loss 对神经网络不一致——loss 降到零时真实排序错误可任意高。SA-DPO 通过在 loss 函数中引入语义距离自适应的 margin,在 UltraFeedback 上达 58.5% 头对头胜率。
工程启示:当前固定阈值做法在大多数场景下足够,但如果你发现「gap 1-3 的数据训练效果不稳定」——很可能是因为忽略了语义距离这个隐藏维度。前沿方向:将语义嵌入距离纳入 score-gap 过滤的决策函数。
14.9 偏好数据构建工业 SOP
1. 需求定义:要补哪个维度(helpful/honest/harmless)
2. 来源配比:
- 人工 20%(金标)
- RLAIF 50%(规模)
- Constitutional 15%(安全)
- 用户隐式 15%(真实分布)
3. 生成响应:多模型并行生成
4. RLAIF 评审:GPT-4 评分 + 双向去 Position Bias
5. 长度归一化:消除 Length Bias
6. Score-Gap 过滤:保留 gap 1-3
7. 多维度分类:按 4 维度分类存储
8. 去污染 + 多样性筛选
9. DPO 训练:lr=1e-6, β=0.1
10. 评估:MT-Bench + AlpacaEval + Length 检查
第 15 章将深入 RL/RLVR 数据构建,这是后训练的最前沿——可验证奖励让模型真正”学会思考”。