大模型 SFT 的训练样本应采用什么输入与监督数据格式?

考查重点:对话格式与监督标签。将指令、用户输入和助手答案按模型 chat template 序列化成 token,通常仅在目标助手答案位置计算监督损失;padding 设忽略标签,多轮样本按训练目标决定监督哪些助手轮

本题目录

参考答案

核心回答

SFT 样本需要区分数据记录格式和模型训练格式。记录层可以是 instruction、input、output,也可以是带 role、content 的 messages;训练时再用模型匹配的对话模板把输入和参考答案组织成词元序列,生成 input_ids、attention_mask 与 labels。

面向助手回答的训练通常只在目标助手答案及相应结束标记上计算损失,用户消息仍保留为上下文;填充位置不计损失。多轮样本是监督全部助手轮还是仅最后一轮,需要明确设置,不能仅凭字段名推断。

记录层:一条样本应包含什么

下面用关键词提取作教学示例:

{
  "messages": [
    { "role": "user", "content": "提取关键词,用英文分号分隔:市图书馆新增儿童阅读区。" },
    { "role": "assistant", "content": "市图书馆;儿童阅读区" }
  ]
}

也可以写成 Alpaca 的指令、输入和输出字段,再由训练工具映射为消息。JSONL 只是存储方式:每个物理行保存一个完整的 JSON 对象,文本中的换行需要正确转义;它不决定模型使用哪种角色标记。

不同工具的字段约定并不完全相同。例如 LLaMA-Factory 通过数据集描述映射字段,ms-swift 可将多种记录转换成标准消息。多轮数据需要完整保存上下文和对应回答,并核查每一轮是否适合用作监督。

模型层:模板、分词和标签如何衔接

对话模板负责添加模型需要的角色、消息和结束边界,分词器再生成词元编号。Hugging Face 的 apply_chat_template() 可一起完成这两步。若先输出模板文本再单独分词,要避免重复添加模板已经包含的特殊标记;常规完整对话训练也不应在答案之后额外添加等待下一次回复的生成提示。

以下是自定义编号的简化示例,每个方括号项视为一个词元,不对应任何真实模型的分词结果。假设仅监督答案和结束标记:

词元:           [BOS] [USER] [问句] [ASSISTANT] [答案] [EOS] [PAD]
input_ids:        1      2      3          4      5     6     0
attention_mask:   1      1      1          1      1     1     0
labels:        -100   -100   -100       -100      5     6  -100

在常见的下一词元训练实现中,用前一位置的输出预测后一位置的目标:助手起始标记位置的输出预测答案5,答案位置的输出预测结束标记6。损失内部进行一位对齐,不应再手动错移一次标签。真实模板可能把角色头或其他标记纳入监督,需查看实际预处理结果。

损失掩码与注意力掩码不是一回事

labels=-100 是常见实现中忽略损失的位置,不会把对应输入删掉。用户消息虽然不直接计损失,仍能通过因果注意力影响助手答案;反向传播也仍会经过相关计算。训练时整条参考答案可以同时放入输入,但因果掩码使某个位置不能偷看未来答案。

attention_mask 则控制填充等位置是否参与注意力,与因果约束一起使用。多轮监督可覆盖所有助手轮,也可只覆盖指定轮次;例如 TRL 的 assistant_only_loss 需要模板提供相应的助手区域标记,ms-swift 支持逐助手消息的损失控制。因此,最终检查应落到解码后的输入、标签区域和截断后的答案,而不止验证原文件能否解析。

对应教程

参考资料

相关面经

1 篇

华为

AI 应用工程师
校招一面、二面、三面
查看原面经 →
你ppo的奖励解耦具体怎么做的,为什么要这样做,sft数据和rm数据的格式分别是什么,训练oom的情况下怎么做归因,有什么解决方案

收录题集

5 个来源,共7 份题集
展开剩余 2 份题集

训练数据与格式

Firefly · llm_interview_note · 1 条原题

查看题集 →

预训练与微调

Firefly · llm_interview_note · 1 条原题

查看题集 →

相关题目

4 题