目录
问一个基础模型“法国的首都是哪里?”,它不一定像助手那样直接回答。它也可能接着写下一道题、补齐网页段落,或者模仿某篇文章的语气。这并不奇怪:预训练让它大量练习续写文本,却没有明确教它“面对用户提问时应怎样接话”。
监督微调(Supervised Fine-Tuning,SFT)做的事很直白:给模型看一些提问和理想回答的示范,继续用下一 Token 预测训练它。要注意,SFT 不会突然换掉模型的工作原理;它改变的是模型更常见到什么上下文、哪些回答会得到训练信号。InstructGPT 的训练流程就先使用人工示范做监督微调,再进入后续偏好优化。[1]
可以把 SFT 理解为:不重新教模型识字,而是用示范教它在对话里怎样开口、怎样收尾。
先从一条对话说起
假设我们希望助手简短回答事实问题,一条训练样本可以写成:
system: 请简洁、准确地回答。
user: 法国的首都是哪里?
assistant: 法国的首都是巴黎。
这里的 assistant 回答不是模型自己挑出的“最佳答案”,而是数据里提供的示范答案。多轮对话也能成为一条样本:前面的 user 和 assistant 消息提供上下文,模型学习在当前轮怎样继续。示范可以来自人工编写、已有数据或经过筛选的合成数据;关键是要知道来源、检查质量,并让内容符合想要的助手行为。
模型看到的不是聊天气泡
模型真正接收的是 Token 序列。Chat Template 会把上面的角色和内容串起来,并加上角色边界、轮次结束等特殊标记。下面只是讲原理的示意,不是某个模型可直接复用的真实模板:
[系统开始] 请简洁、准确地回答。 [系统结束]
[用户开始] 法国的首都是哪里? [用户结束]
[助手开始] 法国的首都是巴黎。 [助手结束]
这些标记让模型分清“谁说的”和“这一轮在哪里结束”。不同模型的模板和特殊 Token 并不相同。训练时用一套格式,推理时却换成另一套,模型就可能接错位置或不正常停下。因此,训练与推理要使用同一模型所要求的聊天模板。Hugging Face 的文档也强调:若要精确标出 assistant 回答范围,模板必须能返回对应的 Token Mask。[2]
它究竟在学哪个部分
常见的一种做法是:system 和 user 内容只作上下文,assistant 回答参与 Loss 计算。模型读到了“法国的首都是哪里?”,但训练信号主要告诉它:在这个前文后,应该逐步写出“法国的首都是巴黎。”;回答的结束标记通常也要按所用模板正确处理。
| 序列片段 | 训练时的作用 | 这个示例是否计入 Loss |
|---|---|---|
| system:请简洁、准确地回答 | 提供行为要求 | 否 |
| user:法国的首都是哪里? | 提供问题与上下文 | 否 |
| assistant:法国的首都是巴黎。 | 提供目标回答 | 是 |
这叫 Response Mask 或 Assistant-only Loss。它不是“把用户消息从输入中删掉”:用户消息依然在输入里,模型只是不用为那些位置的预测错误付出 Loss。具体实现通常把不训练的位置设为忽略标签。也要避免一句话说死:有些数据集或训练配置会计算完整序列的 Loss;SFT 的定义是用示范做监督训练,不是“必须只训练 assistant Token”。Hugging Face 的 SFT 文档明确区分了全序列、仅 completion 和仅 assistant 等设置。[3]
自己看一眼 Loss Mask:切换两种训练方式,绿色表示该位置参与 Loss。
问题仍会输入模型;只是只有助手回答的位置参与这个示例的 Loss。
这里只按语义片段展示;真实训练是在 Token 位置上逐个生成 Mask。
训练目标没有换
模型不会把整句答案一次性“记到脑中”。训练时,前文和已知的答案前缀一起输入;模型仍在每个目标位置预测下一个 Token,再与示范答案比较。例如它先预测“法国”,看到正确前缀后再预测“的”“首都”“是”“巴黎”……实际 Token 划分由 tokenizer 决定,不一定恰好是这些词。
如果把目标位置记作 $A$,SFT 的交叉熵目标可以写成:
\[L=-\sum_{t\in A}\log p_\theta(y_t\mid y_{<t})\]$A$ 是参与 Loss 的 Token 位置;$y_{<t}$ 是当前位置之前的所有 Token,包括问题和已给出的答案前缀。训练会调整参数,让示范答案在这些上下文中更容易出现。训练时能看到正确前缀,推理时只能接着自己已生成的前缀往下写;所以训练 Loss 下降,不等于真实聊天一定顺畅。
示范质量决定学到什么
如果示范答案把首都写错,模型就可能学到错误;如果一半样本要求一句话回答,另一半在同类问题上写长篇套话,模型的风格也会摇摆。数据检查至少要覆盖事实准确性、指令与回答是否匹配、重复和泄漏、拒答边界、来源许可,以及长短和难度分布。
LIMA 的实验提示:对已有较强预训练能力的模型,少量精心整理的示范也可能显著改变交互表现。它并不意味着“数据越少越好”,更不意味着 SFT 能凭空补齐基础模型缺乏的知识。模型规模、基础能力、目标任务和数据质量都会影响结果。[4]
训练完要怎样检查
先留出未参与训练的样本,再用真实用户问题测试:是否答对、是否遵守格式、是否在不知道时承认不确定、是否会在多轮中延续上下文。若目标是特定业务,还要测那个业务里的失败案例。对比基础模型和 SFT 模型,才知道改变来自哪里。
SFT 能教会模型常见的对话格式与回答方式,也能让已有能力更容易被调用;但它不是事实校验器,也不能仅靠几条示范建立可靠的新知识。若还希望模型在几个都合理的答案中偏好更有帮助、更安全的那个,后续通常会用偏好数据做进一步训练——这就是后面 RLHF、DPO 等课程要讨论的事。InstructGPT 也是把 SFT 与后续偏好优化区分开的。[1]
本课最值得带走的一句是:SFT 用示范对话告诉模型“在这样的前文后,助手应怎样继续”,训练目标仍是下一 Token 预测。
约 100 秒讲解视频
参考文献(References)
- Ouyang, L., Wu, J., Jiang, X., et al. “Training language models to follow instructions with human feedback.” NeurIPS, 2022. arXiv:2203.02155.↩
- Hugging Face. “Chat Templates.” TRL Documentation, accessed 2026-10-07.↩
- Hugging Face. “SFT Trainer.” TRL Documentation, accessed 2026-10-07.↩
- Zhou, C., Liu, P., Xu, P., et al. “LIMA: Less Is More for Alignment.” NeurIPS, 2023. arXiv:2305.11206.↩
第二十一课复习总图
下一课看 LoRA 与 QLoRA:普通显卡怎样用更少的可训练参数微调模型?