跳到正文

LlamaFactory 怎么构造训练数据?

SFT/DPO 任务中 instruction、input、output 字段定义与适配

原题:除了TRL之外,你还使用过哪些大模型训练或微调框架(例如LlamaFactory)?请以LlamaFactory为例,说明其支持的数据构造方式、训练数据格式要求(如instruction、input、output字段定义),以及这些格式如何适配SFT或DPO训练任务。

模型训练 · 阶跃星辰真题

回答与解析

LLaMA Factory 通过 Alpaca、ShareGPT 与 dataset_info 映射数据

以官方 data/README.md 当前格式为准。LLaMA Factory 支持 json、jsonl、csv、parquet、arrow,并在 dataset_info.json 登记文件、formatting、ranking 和 columns。Alpaca 是默认格式。SFT 样本使用 instruction、可选 input、output;框架把 instruction 与 input 组合成用户提示,output 是模型回答。若自定义列名,在 columns 中映射 prompt、query、response。

Alpaca 偏好数据不是直接只有 prompt/chosen/rejected 的固定 schema。官方示例使用 instruction、可选 input、chosen、rejected,并在 dataset_info 中设置 ranking:true,再映射 prompt:instruction、query:input、chosen 和 rejected。ShareGPT SFT 使用 conversations 消息列表;偏好数据使用 conversations 作为上下文,chosen 与 rejected 通常是包含 from/value 的更优和更差消息,并设置 formatting:sharegpt、ranking:true 与列映射。

OpenAI messages 格式在官方文档中被视为 ShareGPT 的特例:formatting 仍设 sharegpt,把 messages 映射到 messages,并用 tags 将 role/content 与 user/assistant/system 对齐。训练前还要选择与基础模型匹配的 chat template,检查角色交替、特殊 token、tool/observation、图片占位与 loss mask。数据能被加载不代表语义正确,应抽样渲染最终 prompt,验证 chosen/rejected 共享同一上下文并防止 train/eval 泄漏。

口语版讲法(30秒速答 + 90秒主答 + 完整展开)

  • 锁定 LLaMA Factory 版本和数据文档
  • 说明 Alpaca SFT 字段与列映射
  • 说明 Alpaca 偏好数据和 ranking
  • 区分 ShareGPT 与 OpenAI messages 特例
  • 训练前验证模板、角色、mask 和泄漏

【30秒速答】 LLaMA Factory 当前主要支持 Alpaca 和 ShareGPT。Alpaca SFT 用 instruction、可选 input、output;DPO 等偏好数据用 instruction、可选 input、chosen、rejected,并在 dataset info.json 设置 ranking:true 和 columns 映射。ShareGPT 用 conversations 消息列表,偏好数据另带 chosen 与 rejected 消息。OpenAI 的 messages 不是独立第三套底层格式,而是官方文档定义的 ShareGPT 特例,通过 role、content tags 映射。训练前要按版本检查 chat template、角色交替和 loss mask。

【90秒主答】 自定义数据先放在 dataset dir,并在 dataset info.json 注册 file name 或 hub 地址。默认 formatting 是 alpaca,SFT 中 instruction 是主要指令,input 是可选补充,两者组合成用户提示,output 是目标回复。若实际列名叫 question、context、answer,可通过 columns 把 prompt 映射 question、query 映射 context、response 映射 answer,不必物理改列。偏好训练要设置 ranking:true。Alpaca 官方示例仍以 instruction 和 input 组成 prompt,chosen 与 rejected 存更优和更差回答,columns 同时映射这四类字段;因此不能笼统说默认就是 prompt/chosen/rejected 三列。ShareGPT 适合多轮和工具消息,conversations 中用 from/value 表示 human、gpt、observation、function call 等角色,SFT 学习相应 assistant 或 function 输出。

【完整展开】 ShareGPT 偏好样本的 conversations 提供共同上下文,chosen 与 rejected 是带 from/value 的候选 assistant 消息。dataset info 设置 formatting:sharegpt、ranking:true,并把 messages、chosen、rejected 映射到实际列。OpenAI 格式使用 messages 数组,元素是 role/content;官方配置仍写 formatting:sharegpt,把 messages 列映射为 messages,再通过 tags 指定 role tag、content tag、user tag、assistant tag 和 system tag。它是 ShareGPT 解析器的一种角色标签配置。

格式正确只是入口。训练前抽样调用实际 tokenizer 和 chat template,把最终字符串、special token、BOS/EOS、system、tool 与 observation 渲染出来,确认 user token 是否被 mask、哪些 assistant 回合参与损失。DPO 要确认 chosen 和 rejected 共享同一个 prompt,候选没有反转、空值或长度泄漏,训练与验证按 prompt 去重。推理模型还需按官方版本检查 thinking 配置。LLaMA Factory 迭代快,答案应附 commit 或文档日期,不能把旧版字段与新版 trainer 混用。完成小批 smoke test 后再扩量,并记录被过滤样本及原因,避免“能启动训练”掩盖数据被静默丢弃。

【验证补充】举一个最小 SFT 映射:原文件列为 question、context、answer,dataset info 的 columns 分别写 prompt:question、query:context、response:answer。最小 Alpaca 偏好映射则把 prompt 指向 instruction、query 指向 input,并显式映射 chosen 和 rejected,同时开启 ranking。ShareGPT 自定义 role 名称时要在 tags 中写清映射,否则数据可能通过 JSON 校验却被角色解析器过滤。

工具对话还要确认 function call 与 observation 的顺序符合官方约束,多模态样本检查图片或视频占位符数量和路径一致。多数据集混合时分别统计加载前后样本数、截断比例与被丢弃原因,避免一个错误配置让某个来源实际权重归零。训练日志保存 dataset info、模板名、tokenizer 版本与数据哈希,才能在模型效果变化时复现当时的输入。

【运行检查】先用几十条样本执行预处理而不训练,导出渲染后的 prompt、label mask、chosen 与 rejected 长度。逐条核对 system 是否重复、assistant 是否缺失、特殊 token 是否成对、截断是否删除关键答案。随后分别对 SFT 与 DPO 跑一个小 batch,确认非零监督 token 数、loss 可计算且梯度落在预期参数,再开始正式训练。

关键一句:LLaMA Factory 的字段名由 dataset_info 映射,OpenAI messages 通过 ShareGPT formatting 与角色 tags 解析。

核验来源

  1. LLaMA Factory Official Data README
  2. LLaMA Factory Official Repository

面试官还可能这样问

  1. 问法 1 · 场景切入

    我看你简历里用过TRL,假设现在要做个电商客服的微调,数据是用户咨询和客服回复的对话对,但还有些单轮问答。除了TRL,你还会考虑用LlamaFactory吗?它怎么处理这种混合格式的数据?

  2. 问法 2 · 层层追问

    你做微调时一般用什么框架?……那LlamaFactory呢,它支持的数据格式有哪些?……比如Alpaca格式的instruction和output字段,跟ShareGPT的对话格式有什么区别?……这些格式怎么分别适配SFT和DPO任务?

  3. 问法 3 · 直球架构

    LlamaFactory的数据构造方式和格式要求你清楚吗?从Alpaca、ShareGPT到OpenAI格式,每个字段定义是什么,以及它们怎么映射到SFT和DPO训练的loss计算上?

同模块相关题目