第 14 章 第三部分:后训练数据工程

偏好数据构建

偏好数据结构(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)

偏好数据 DPO RLHF UltraFeedback RLAIF Constitutional AI Length Bias 自适应DPO 上下文盲视

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显存紧张
ORPOSFT + 偏好联合训练简化流程
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 美元极高
RLAIF40-60%0.001-0.05 美元中-高
用户隐式反馈10-20%≈ 0中
Constitutional10-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 个维度评估每个响应:

  1. Instruction Following:是否严格遵循指令
  2. Truthfulness:是否准确无误
  3. Honesty:是否诚实承认不确定
  4. 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 宪法原则

宪法是一组自然语言规则,例如:

  1. 请勿生成歧视性内容
  2. 请勿提供危险信息
  3. 当不确定时承认不确定
  4. 不主动给出未请求的建议
  5. …

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,上下文偏好增益):提供相关上下文后,模型的偏好强度增强了多少。两个发现值得数据工程师注意:

  1. CPG 与幻觉率呈负相关——CPG 越高的模型,物体幻觉越少。这意味着 CPG 可以作为一个不依赖人工标注的偏好数据质量代理指标。
  2. 标准 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 数据构建,这是后训练的最前沿——可验证奖励让模型真正”学会思考”。