跳转至

偏好、过程与轨迹数据

后训练数据不只包含“输入—答案”。偏好对、过程标签、模型评分与环境轨迹表达不同监督语义,必须使用不同的数据契约和切分方式。

四种基本对象

对象 最小字段 能回答的问题
示范 prompt、response、provenance 应该怎样回答
偏好对 prompt、chosen、rejected、criterion 两个回答哪个更符合某一标准
过程样本 step sequence、step labels、outcome 哪一步可能改善或失败
环境轨迹 observations、actions、tool results、terminal state 多步行动怎样改变外部状态

把这些对象全部压成纯文本会丢失比较关系、动作边界、终止原因和验证器版本。

偏好并非绝对标签

偏好记录应说明评价维度:事实性、帮助性、风格、安全、长度、代码是否通过或整体选择。若同一 chosen 同时被解释为“更正确”“更简洁”“更安全”,模型无法知道信号来自哪一项。

Bradley–Terry 模型常写为

\[ P(y_a\succ y_b\mid x) =\sigma\left(r(x,y_a)-r(x,y_b)\right). \]

它假设一个标量奖励足以解释成对选择。真实偏好可能非传递、依赖标注者或包含多目标冲突,因此数据中应保留标注者群体、准则、分歧和置信度,而不只保存多数票。

负样本怎样构造

负样本可以来自:

  • 同一策略的低分采样;
  • 人工编辑出的单一错误;
  • 旧 checkpoint 或较弱模型;
  • 正确答案的格式、事实或安全扰动;
  • verifier 找到的失败轨迹。

过于容易的负样本让模型只学会表面风格;只用同一生成器又会把模型身份当作捷径。更稳妥的集合应覆盖局部错误、整体错误和“两个都可接受但一方更优”的细粒度比较。

过程监督

将解题或行动拆成步骤 \(s_1,\ldots,s_T\) 后,可以为每步记录正确性、进展或风险。这里至少区分:

  1. 局部有效:本步本身是否成立;
  2. 全局可达:执行后是否仍能到达正确终态;
  3. 效率:是否制造无谓成本;
  4. 权限:动作是否被允许。

一个数学步骤局部正确,仍可能把搜索带入死路;一个工具调用返回成功,也可能没有满足业务终态。过程标签不能只由语言流畅度决定。

轨迹状态

多步数据需要记录:

task and initial state
environment and tool-schema versions
policy and tokenizer versions
observation/action boundaries
raw tool status and normalized result
terminated / truncated / infrastructure_error
reward components and verifier version
cost and replay metadata

terminated 表示环境到达定义终态;truncated 表示预算、超时或外部中断。把二者都写成“失败”会污染价值估计与恢复训练。更严格的 token/action 契约见轨迹与策略契约。

最小语义实现

discounted_returns 接收逐步奖励、真正终止标记和截断点之后的价值估计。真正终止会切断 bootstrap;时间或预算截断在数据中保持 terminated=False,于是尾部价值仍能进入目标。

import torch
@torch.no_grad()
def discounted_returns(reward, terminated, bootstrap, gamma=0.99):
    reward = torch.as_tensor(reward, dtype=torch.float32)
    terminated = torch.as_tensor(terminated, dtype=torch.bool, device=reward.device)
    if reward.ndim != 1 or reward.numel() == 0 or reward.shape != terminated.shape:
        raise ValueError("reward and termination flags must be aligned non-empty vectors")
    tail = torch.as_tensor(bootstrap, dtype=reward.dtype, device=reward.device)
    if tail.numel() != 1:
        raise ValueError("bootstrap must be scalar")
    output = []
    for current, done in zip(reversed(reward), reversed(terminated)):
        tail = current + gamma * torch.where(done, 0., tail)
        output.append(tail)
    return torch.stack(output[::-1])
reward = torch.tensor([1., 2.], requires_grad=True)
terminal = discounted_returns(reward, [False, True], bootstrap=float("nan"))
truncated = discounted_returns([1., 2.], [False, False], bootstrap=9.)
torch.testing.assert_close(terminal[-1], torch.tensor(2.))
assert torch.isfinite(terminal).all() and not terminal.requires_grad
assert truncated[-1] > terminal[-1]

它只展示数据语义,没有加入 \(\lambda\)-return、mask、变长 batch 或 critic 训练;生产数据必须另外区分基础设施错误和环境终态。优势估计的完整向量化实现见 LLM 策略优化:Packed trajectory 上的 GAE。

切分与污染

随机切分单条记录往往泄漏:

  • 同一 prompt 的多个候选被分到训练与测试;
  • 同一仓库 issue、题目变体或模板跨集合;
  • teacher 生成的近重复轨迹跨集合;
  • verifier 或隐藏测试通过工具被模型读取。

应按任务族、来源对象、时间和生成模板成组切分,再做文本与语义近重复检查。对真实环境还要冻结依赖和初始状态,否则版本漂移会伪装成能力变化。

质量筛选

最终奖励不是唯一质量指标。可以为轨迹建立多维评分:

\[ q(\tau)=f( \text{validity}, \text{success}, \text{replayability}, \text{diversity}, \text{efficiency}, \text{policy compliance}). \]

失败轨迹也有价值:它们可训练错误识别、恢复和偏好比较。筛选的目标不是只保留最高分输出,而是保留能区分策略、可重放且覆盖失效面的学习信号。

数据卡

后训练数据卡至少报告:

  • 任务分布、语言、长度和生成来源;
  • 模型生成与人工编写的比例;
  • 标注准则、分歧与质量抽检;
  • chosen/rejected 的生成策略与去重;
  • 过程标签或 verifier 的准确性边界;
  • 环境、权限和可重放性;
  • train/dev/test 的分组规则与污染审计;
  • 许可、隐私、删除和保留期限。

目标函数见奖励建模与偏好优化,在线环境数据见 Agentic RL 数据与环境。

Reference