XTuner 偏好数据集完全指南:prompt/chosen/rejected 格式与 Reward Model、DPO 训练标签生成原理

发布时间:2026/9/18 2:18:07
XTuner 偏好数据集完全指南:prompt/chosen/rejected 格式与 Reward Model、DPO 训练标签生成原理 XTuner 偏好数据集完全指南prompt/chosen/rejected 格式与 Reward Model、DPO 训练标签生成原理【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner本篇技术指南围绕 XTunerxtuner中 Reward Model 与 DPO、ORPO 等偏好学习算法共用的**偏好数据集Preference Dataset**展开完整讲解prompt、chosen、rejected三字段的数据格式、Reward 与 DPO 两种不同的训练标签生成机制以及如何用自定义 JSONL 数据或 HuggingFace 开源数据集启动训练。读完本文你将能够独立构造一份符合 XTuner 要求的偏好数据集并在配置文件中正确设置is_reward/is_dpo、dataset_map_fn等关键字段。一、偏好数据集的三字段统一格式在 XTuner 中Reward Model 训练与 DPO、ORPO 等依赖偏好数据的算法采用完全相同的数据格式偏好数据集中的每一条训练样本都包含三个字段——prompt、chosen、rejected且每个字段的值都使用 OpenAI chat message 格式即由role与content组成的消息列表。一个具体示例如下{ prompt: [ { role: system, content: You are a helpful assistant. }, { role: user, content: Who won the world series in 2020? }, { role: assistant, content: The Los Angeles Dodgers won the World Series in 2020. }, { role: user, content: Where was it played? } ], chosen: [ { role: assistant, content: The 2020 World Series was played at Globe Life Field in Arlington, Texas. } ], rejected: [ { role: assistant, content: I dont know. } ] }从语义上看prompt完整的对话上下文可以是多轮用于描述待评价的输入场景chosen人类偏好的回复好回复通常为一条assistant消息rejected人类不偏好的回复坏回复同样为一条assistant消息。模型需要学习的正是在相同 prompt 下chosen 的得分高于 rejected。这一统一格式贯穿了 xtuner/dataset/preference_dataset.py 中的数据集构建逻辑使 Reward Model、DPO、ORPO 可以共享同一套数据处理管线。二、Reward 与 DPO两种训练标签生成机制当进行 Reward Model 训练或 DPO 训练时XTuner 会根据训练任务类型的不同将偏好数据集处理为不同的训练标签。2.1 Reward Model 训练末尾追加|reward|token如上图所示Reward Model 训练参考 ChatGPT 的训练方式在对话数据的最后添加一个特殊的|reward|token并且只对该 token 输出的 logits 计算损失。模型在这一 token 位置输出的 logits 经过v_head一个nn.Linear(hidden_size, 1, biasFalse)的线性层投影后即为该样本的奖励得分。在源码 xtuner/dataset/preference_dataset.py 的tokenize函数中Reward 模式的标签构造逻辑为if is_reward: # reward label chosen_ids chosen_ids [reward_token_id] rejected_ids rejected_ids [reward_token_id] chosen_labels [-100] * len(chosen_ids[:-1]) [0] rejected_labels [-100] * len(rejected_ids[:-1]) [1]即在 chosen 与 rejected 序列末尾分别追加reward_token_idchosen 的标签中仅最后一位为0rejected 的标签中仅最后一位为1其余位置全部为-100即IGNORE_INDEX不参与损失计算。-100与0/1的组合正是 xtuner/model/reward.py 中compute_loss通过torch.where(labels 0)与torch.where(labels 1)分别提取 chosen/rejected logits 的依据。注意由于is_rewardTrue时必须指定reward_token_idPreferenceDataset的构造函数中有显式断言assert reward_token_id ! -1。默认的reward_token_id -1仅作为一个未设置的占位符。2.2 DPO 训练屏蔽 prompt只对回复部分计算损失而当进行 DPO 系列算法训练时XTuner 则会屏蔽掉 prompt 部分的 token只对 chosen 和 rejected 的回复部分计算损失。对应源码逻辑为else: # dpo label prompt_len min(len(prompt_ids), max_length) chosen_labels [-100] * prompt_len copy.deepcopy(chosen_ids[prompt_len:]) rejected_labels [-100] * prompt_len copy.deepcopy(rejected_ids[prompt_len:])即 prompt 部分标签全部置为-100不参与损失回复部分则保留真实 token id 用于计算 DPO 损失。这里prompt_ids是通过tokenizer.apply_chat_template(pair[prompt], tokenizeFalse, add_generation_promptTrue)得到的而 chosen/rejected 则是将 prompt 与回复拼接后整体编码add_generation_promptFalse。2.3is_reward与is_dpo配置文件中的开关在配置文件中我们通过train_datasetdataset 构建参数中的is_reward和is_dpo两个字段来控制数据集的类型字段取值含义is_dpoTrue默认按 DPO 方式构造标签屏蔽 prompt、仅对回复计算损失is_rewardTrue按 Reward 方式构造标签追加|reward|token仅对该位置计算损失这两个字段必须且只能有一个为 True。在PreferenceDataset.__init__中有对应的互斥断言assert is_dpo ! is_reward, Only one of is_dpo and is_reward can be True。因此 Reward 训练配置中必须显式写is_dpoFalse, is_rewardTrue这一点在 xtuner/configs/reward_model/internlm/internlm2_chat_1_8b_reward_full_varlenattn_ultrafeedback.py 等真实配置文件中均有体现。三、使用自定义 JSONL 数据进行训练在理解单个样本的格式之后只需将转换好的数据保存为 JSON Lines 格式即可——文件中的每一行都是一个完整的样本一个包含prompt/chosen/rejected的 JSON 对象{prompt: [{content: How can I learn to better regulate my emotions as a grown adult?, role: user}], chosen: [{content: You could do emotional regulation exercises with me, and try to notice and practice ways that you could better control your emotions in real life., role: assistant}], rejected: [{content: Do you mean how can you learn to be more emotionally mature?, role: assistant}]} {prompt: [{content: What are some interesting things I can add to a grilled cheese sandwich?, role: user}, {content: A tomato, a slice of pickle, some chopped pickles, some chopped green onions. Also, some mayonnaise if you like., role: assistant}, {content: Sounds great. Anything else?, role: user}], chosen: [{content: If youd like something a little different, I recommend grating some horseradish on top of the sandwich., role: assistant}], rejected: [{content: Maybe some nice fresh basil?, role: assistant}]} {prompt: [{content: How do I bob for apples?, role: user}], chosen: [{content: Ah! Do you mean the game of applesauce, or do you mean the idea of to bob for apples?, role: assistant}], rejected: [{content: Sorry, I dont know that term., role: assistant}]} ......3.1load_jsonl_dataset的加载能力在准备完自定义数据集后将保存的数据路径填入配置文件中的data_files字段即可。从源码 xtuner/dataset/preference_dataset.py 可以看到load_jsonl_dataset支持两种加载方式data_files直接传入文件路径可以是字符串也可以是字符串列表支持同时加载多个 jsonl 文件进行训练data_dir传入目录路径函数会列出目录下所有文件可通过suffix参数按后缀过滤逐个按行解析后合并。同时该函数内部要求data_files与data_dir二者恰好提供一个assert (data_files is not None) ! (data_dir is not None)并将多个文件的数据通过concatenate_datasets拼接为同一个数据集。3.2 配置文件写法####################################################################### # PART 3 Dataset Dataloader # ####################################################################### train_dataset dict( typebuild_preference_dataset, datasetdict( typeload_jsonl_dataset, data_files[ /your/jsonl/path/here.jsonl, /your/another/jsonl/path/here.jsonl ]), )完整的可运行示例可参考 xtuner/configs/reward_model/internlm/internlm2_chat_1_8b_reward_full_varlenattn_jsonl_dataset.py该配置即使用load_jsonl_datasetdata_files加载本地 JSONL 偏好数据并配套is_rewardTrue、use_varlen_attnTrue等完整训练参数。四、使用 HuggingFace 开源数据集进行训练与 XTuner 配置 SFT 数据的方式一致使用 HuggingFace 上的开源数据集时只需定义一个映射函数 map_fn将开源数据集格式转换为 XTuner 的prompt/chosen/rejected三字段格式即可。4.1 以 Intel/orca_dpo_pairs 为例编写 map_fnIntel/orca_dpo_pairs数据集包含system、question、chosen、rejected四个字段且每个字段的值为**纯文本text**而非 OpenAI chat message 格式因此需要为其定义 map_fndef intel_orca_dpo_map_fn(example): prompt [{ role: system, content: example[system] }, { role: user, content: example[question] }] chosen [{role: assistant, content: example[chosen]}] rejected [{role: assistant, content: example[rejected]}] return {prompt: prompt, chosen: chosen, rejected: rejected}从代码可以看到intel_orca_dpo_map_fn对原数据的四个字段进行处理将其转换为prompt、chosen、rejected三个字段并且每个字段都处理为 OpenAI chat message 格式rolecontent确保了后续数据处理流程的统一。该函数在仓库中已内置实现位于 xtuner/dataset/preference_dataset.py 的intel_orca_dpo_map_fn定义处。此外该模块还提供了orpo_dpo_mix_40k_map_fn它按chosen[:-1]取 prompt、chosen[-1:]取 chosen、rejected[-1:]取 rejected适用于chosen/rejected本身已是多轮消息列表格式的数据集例如argilla/ultrafeedback-binarized-preferences-cleaned与Intel/orpo_dpo_mix_40k格式相同因此共用此映射函数。4.2 在配置文件中配置 map_fn完成 map_fn 的定义后需要在配置文件中 import 该函数并在dataset_map_fn字段中进行配置train_dataset dict( typebuild_preference_dataset, datasetdict( typeload_dataset, pathIntel/orca_dpo_pairs), tokenizertokenizer, max_lengthmax_length, dataset_map_fnintel_orca_dpo_map_fn, )在底层build_preference_dataset会先通过build_origin_dataset加载原始数据集然后调用map_dataset对应源码 xtuner/dataset/preference_dataset.py执行映射。map_dataset还支持传入注册在MAP_FUNC中的字符串或完整的函数对象若传入的是字符串则会从xtuner.registry的MAP_FUNC注册表中查找找不到时再尝试按完整可导入路径解析。映射过程可通过num_proc参数开启多进程默认 32 进程。五、从源码看数据流的完整生命周期为了帮助读者理解偏好数据如何一步步变成模型输入这里把build_preference_dataset的关键流程梳理如下实现见 xtuner/dataset/preference_dataset.py加载原始数据build_origin_dataset(dataset, splittrain)加载 JSONL 或 HuggingFace 数据集格式映射若配置了dataset_map_fn调用map_dataset将字段统一为prompt/chosen/rejectedTokenize 与打标签PreferenceDataset通过tokenize函数对每个样本执行 chat template 编码并按is_reward/is_dpo生成chosen_ids、rejected_ids、chosen_labels、rejected_labels。该过程使用_multi_progress多进程并行加速并带有进度条输出可选变长注意力打包若use_varlen_attnTrue则用PackedDatasetWrapper将多个样本的 chosen/rejected 序列打包进同一序列通过cumulative_len记录每个子序列的边界从而避免 padding 造成的显存浪费分布式广播broad_cast_dataset确保在多卡环境下仅 rank 0 做 tokenize随后将结果广播给所有进程。在数据装载阶段xtuner/dataset/collate_fns/preference_collate_fn.py 中的preference_collate_fn负责把样本整理成 batch非变长注意力模式下chosen 与 rejected 会被拆分为两条独立样本送入模型并按 pad token 补齐labels 用IGNORE_INDEX填充变长注意力模式下则要求batch_size1直接堆叠打包后的序列并输出cumulative_len、position_ids、max_seqlen等字段。六、相关参考快速开始训练请参阅 Reward Model 快速上手训练参数详解loss_type、penalty_type、reward_token_id、use_varlen_attn等请参阅 修改 Reward Model 训练配置Reward Model 背景与 XTuner 训练优势请参阅 Reward Model 介绍官方提供的 Reward Model 配置文件位于 xtuner/configs/reward_model涵盖 InternLM2 1.8B 与 Llama3 8B 的 full / QLoRA 训练方案。【免费下载链接】xtunerA Next-Generation Training Engine Built for Ultra-Large MoE Models项目地址: https://gitcode.com/GitHub_Trending/xt/xtuner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询