11.4 SFT:让模型学会"回答"而不是"续写"
一、概念:SFT 是什么
预训练模型的核心困境
想象你去图书馆读书。过去的三年,你每天从早到晚翻阅图书馆里所有的书——小说、论文、新闻、百科、代码、论坛帖子。你读完了相当于整个互联网的文字量。现在的你能续写任何一段文字的开头,能补全一首诗,能根据前文猜测接下来最可能出现的词。但有人突然问你:“帮我写一封给客户的道歉邮件”,你愣住了。你的大脑里储存了无数道歉邮件的片段,但你不知道”回答问题”这件事应该怎么做——你只会”续写”,不会”应答”。
这正是预训练(Pre-training)后的大语言模型面临的困境。预训练阶段,模型在海量文本上只做一件事:预测下一个词(Next Token Prediction)。这个看似简单的任务让模型学会了语法、常识、推理模式甚至某些专业知识,但它没有学会”遵循指令”——它不知道当用户给出一个问题时,应该以回答的形式而非续写的形式来回应 1。
打个比方:预训练让模型成了一个”活字典”——什么都知道,但不知道什么时候该说什么。你问它”北京的首都是什么?“,它可能会续写”北京的首都是什么?上海是中国的经济中心。广州是南方的大城市…”——它在按照互联网文本的统计规律”续写”,而不是在”回答”。
SFT 的定义
SFT(Supervised Fine-Tuning,监督微调) 就是解决这个问题的。它的核心思路极其朴素:给模型看大量”问题-标准答案”的配对例子,让它模仿这些例子的格式来回答问题 2。
用类比来说:预训练是让孩子读遍天下书,SFT 是给孩子一本”课后习题集”——每一道题旁边都写着标准答案。孩子做完这本习题集,就知道考试时遇到类似题目应该按什么格式作答了。SFT 不是一种特定的算法,而是一种训练范式——用一个标注好的数据集,在预训练模型的基础上继续训练。
SFT 在完整训练管线中的位置是第二步:
预训练 (Pre-training) --> SFT (监督微调) --> 偏好对齐 (DPO/RLHF)
"学会语言和知识" "学会回答问题" "学会回答得更好"
如果没有 SFT,基座模型就无法成为一个”助手”。所有你能对话的 AI(ChatGPT、Claude、文心一言、通义千问等)都经过了 SFT 3。
为什么叫”监督”微调
“监督”(Supervised)在机器学习中的意思是:每个训练样本都有”标准答案”。区别于无监督学习(数据没有标签,比如纯粹让模型读文本自学生成规律),SFT 告诉模型:“对于这个输入,输出应该是这个”。这就像老师批改作业——老师手里有标准答案,学生做完后对照答案纠正。
一次典型的 SFT 效果对比
| 阶段 | 输入:“解释什么是重力” |
|---|---|
| 预训练模型 | “解释什么是重力?重力是一种基本相互作用。电磁力是另一种基本相互作用。强核力和弱核力…”(继续列举,停不下来) |
| SFT 后 | “重力是地球(或其他天体)对物体的吸引力。你跳起来会落回地面,苹果会从树上掉下来,这都是重力的作用。简单来说,重力就是让万物互相靠近的一种力。“(直接回答问题,用浅显语言解释,然后自然收尾) |
同样的知识储备,SFT 改变了模型”输出知识的方式”。
二、教学:SFT 怎么做
2.1 SFT 的数据长什么样
SFT 的核心是指令-回答对(Instruction-Response Pair)。目前业界有三种主流的数据格式。理解这三种格式,就像理解三种不同的”答题卡”——格式不同,但最终目的都是告诉模型”这道题的标准答案是什么”。
格式一:Alpaca(单轮问答格式)
Alpaca 格式由斯坦福大学在 2023 年提出,用于训练 Stanford Alpaca 模型。它用 GPT-3.5 生成了 52,000 条指令数据,训练出的 7B 参数模型在很多任务上接近 GPT-3.5 的表现,震惊了整个社区 4。
Alpaca 格式有三到四个字段:
{
"instruction": "用简单的语言解释什么是光合作用,适合小学三年级学生理解",
"input": "",
"output": "光合作用是植物做饭的过程。植物用三样东西做饭:阳光、水和空气里的二氧化碳。\n\n植物叶子里面有一种叫叶绿素的东西(就是让叶子变绿的那个),它像一个小工厂,用阳光当能源,把水和二氧化碳做成葡萄糖——这是植物的食物。做完饭还会放出氧气,就是我们需要呼吸的气体。\n\n所以,植物吃饭的方式就是晒太阳!",
"system": "你是一位耐心的小学科学老师"
}
- instruction:用户的指令或问题(必填)
- input:额外的上下文信息,通常为空(选填)
- output:标准答案(必填)
- system:系统提示词,定义 AI 的角色(选填)
如果把 system、instruction、input 想象成”题目”,output 就是”标准答案”。训练时,模型学习的是”看到题目后写出标准答案”。
Alpaca 格式的优点是简单直观,缺点是只支持单轮对话——如果用户追问”那为什么叶子是绿色的?“,需要把整个对话历史手动拼到 input 里。
格式二:ShareGPT(多轮对话格式)
ShareGPT 格式来自用户分享的 ChatGPT 对话记录,天然支持多轮交互。它的结构是对话角色列表 5:
{
"conversations": [
{"from": "human", "value": "推荐三部科幻电影"},
{"from": "gpt", "value": "推荐这三部:\n1.《星际穿越》- 关于时间与爱\n2.《银翼杀手2049》- 关于人与复制人\n3.《降临》- 关于语言与宿命"},
{"from": "human", "value": "这些电影的导演是谁?"},
{"from": "gpt", "value": "《星际穿越》和《银翼杀手2049》都是克里斯托弗-诺兰和丹尼斯-维伦纽瓦..."}
]
}
每个对话轮次包含两个角色:
- human(或 user):人类用户说的话
- gpt(或 assistant):AI 助手的回答
ShareGPT 格式就像话剧剧本——记录了一整段对话中每个人说的话,按时间顺序排列。模型学习的是:“看到人类说了什么后,AI 应该说什么”。因为保留完整的对话上下文,模型能学会处理追问、澄清、话题切换等真实对话场景。
格式三:ChatML(标准消息格式)
ChatML(Chat Markup Language)由微软/OpenAI 提出,使用特殊标记分隔不同角色的消息,是目前最通用的格式 6:
{
"messages": [
{"role": "system", "content": "你是一个乐于助人的助手"},
{"role": "user", "content": "解释什么是量子计算"},
{"role": "assistant", "content": "量子计算是一种利用量子力学原理..."},
{"role": "user", "content": "它和普通计算机有什么不同?"},
{"role": "assistant", "content": "最大的不同在于信息单元..."}
]
}
ChatML 有三个标准角色:
- system:定义 AI 的整体行为和角色(如”你是客服”、“你是翻译”)
- user:用户的输入
- assistant:AI 助手的回答
ChatML 可以理解为”短信聊天记录”——每条消息都有发送人和内容,system 消息相当于群聊里的”群公告”,为整个对话定调。
三种格式对比速查
| 维度 | Alpaca | ShareGPT | ChatML |
|---|---|---|---|
| 对话轮数 | 单轮 | 多轮 | 多轮 |
| 系统提示 | 可选字段 | 通过首条 human 实现 | 独立的 system 角色 |
| 多轮支持 | 需手动拼接 | 原生支持 | 原生支持 |
| 学习难度 | 最简 | 中等 | 中等 |
| 适用场景 | 翻译、分类、摘要等单轮任务 | 聊天机器人、客服 | 通用,OpenAI API 原生格式 |
| 社区工具支持 | 广泛(LLaMA Factory、Unsloth、HuggingFace) | 广泛 | 广泛 |
不管用哪种格式,数据最终都会被拼接成一个文本序列,喂给模型做”下一个词的预测”——只不过这次的”下一个词”是标准答案里的词,而不是随意续写。
2.2 SFT 的数据从哪里来
SFT 数据的来源有三条路,成本和质量的权衡各不相同:
第一条路:人类标注(最贵但质量最高)
雇人手动写”问题-标准答案”对。OpenAI 在训练 ChatGPT 时雇了数百名标注员,每条数据的成本在 1 到 10 美元不等,取决于复杂度 7。一万条高质量人类标注数据的成本大约在 10,000 到 50,000 美元之间。
打个比方:这就像请大学教授手写出题+写标准答案——精准、可靠,但成本极高。适合预算充足、对质量要求严格的企业场景。
第二条路:知识蒸馏(最常用,性价比最高)
用更强大的模型(如 GPT-4、Claude)来生成”标准答案”,然后拿这些生成的数据去训练较弱的模型。就像让博士生帮小学生写参考答题——答案质量有保障,成本远低于人类标注。Stanford Alpaca 就是用 GPT-3.5 生成了 52,000 条指令数据,仅花费约 500 美元 API 费用,训练出的 LLaMA 7B 模型就在多项任务上接近 GPT-3.5 的表现 8。
蒸馏的核心优势是低成本大规模。2026 年,几乎所有开源微调模型都使用蒸馏数据。
第三条路:社区开源数据集(最省事,零成本)
直接使用开源社区的高质量数据集。截至 2026 年,主流选择包括:
- OpenAssistant(OASST2):约 12,000 条人类标注的多轮对话,涵盖 35 种语言,由全球志愿者贡献 9
- Dolly(Databricks):15,000 条数据,由 Databricks 员工标注,涵盖开放问答、分类、摘要、创意生成等七大类任务 10
- WildChat:50 万条真实用户与 ChatGPT 的对话,包含了各种边缘情况和复杂场景 11
- LMSYS-Chat-1M:100 万条 Chatbot Arena 平台上的真实用户对话,涵盖不同模型的表现 12
实践建议:纯通用数据训练的模型”什么都行但什么都不精”;纯领域数据训练的模型”只懂这个领域但不会聊天”。最优做法是:自己标注 100 到 500 条高质量领域数据(比如你公司的产品知识),然后混入开源通用 SFT 数据中一起训练。这样既保证了领域专业性,又保持了通用对话能力。
2.3 SFT 训练的两个关键技巧
SFT 的底层技术和预训练几乎一样,都做”预测下一个词”。但有两个关键区别,缺一不可。
技巧一:只在”回答”部分计算损失(Loss Masking)
这是 SFT 最重要的技术细节。拼接后的训练文本是这样的:
用户:请解释什么是光速
助手:光速是宇宙中信息传播的最快速度,约为每秒30万公里...
用户:那为什么不能超过光速?
助手:根据爱因斯坦的相对论...
如果对整个序列计算损失(loss),模型会学到两个行为:(1) 预测用户说了什么,(2) 预测助手说了什么。但我们只想要后者——我们希望模型在”看到用户输入后,生成助手回答”,而不是”生成用户输入”。
Loss Masking(损失掩码) 的做法是:把”用户输入部分”的损失权重设为 0(不参与训练),只对”助手回答部分”计算损失 13。
用考试来类比:老师阅卷时只看你写的答案对不对,不会因为你抄题目抄得漂亮就给你加分。Loss Masking 就是这个逻辑——“抄题目”(用户输入)不算分,“写答案”(助手回答)才算分。
对于多轮对话,每一轮的助手回答都需要计算损失,每一轮的用户输入都忽略。这意味着模型在第三轮回答时,需要”看到”前两轮的完整对话历史,但只需要为第三轮的回答负责。
技巧二:训练轮数极少(2-3 Epochs)
预训练阶段,海量数据通常只过一遍(1 epoch),因为数据量够大不会过拟合。但 SFT 数据量小(几千到几万条),如果只过一遍,模型可能学得不够充分。
然而过多的训练轮数会导致模型”死记硬背”——只会重复训练数据里的回答,泛化能力急剧下降。这就是灾难性遗忘(Catastrophic Forgetting):模型过度适应了微调数据,忘了预训练阶段学到的一般能力。
实践中,SFT 训练 1 到 3 个 epoch 是标准配置 14:
- 1 epoch(保守):数据量较大时(10,000 条以上),保护通用能力
- 2 epochs(标准):大多数场景的最佳平衡点,数据量适中时(3,000-10,000 条)
- 3 epochs(激进):数据量很小(1,000 条以内)且非常确定质量极高时
研究显示,超过 2 个 epoch 后,MT-Bench(多轮对话评测)得分下降约 4.3%;激进训练参数下,下降幅度可达 26.7% 15。
典型超参数配置
| 参数 | 全量微调 | LoRA / QLoRA | 说明 |
|---|---|---|---|
| 学习率 (Learning Rate) | 1e-5 ~ 5e-5 | 1e-4 ~ 5e-4 | LoRA 可承受更高学习率,因为只更新少量参数 |
| 训练轮数 (Epochs) | 1 ~ 2 | 2 ~ 3 | 数据多则少训,数据少则多训 |
| 批次大小 (Batch Size) | 32 ~ 128 | 16 ~ 64 | 有效批次大小(含梯度累积) |
| 学习率调度器 | Cosine | Cosine | 余弦衰减,逐步降低学习率 |
| 预热步数 (Warmup) | 3% ~ 10% | 3% ~ 10% | 初始阶段线性增加学习率 |
| 最大序列长度 | 2048 ~ 4096 | 2048 ~ 4096 | 覆盖大多数指令-回答对 |
| 优化器 | AdamW | AdamW | 标准选择 |
2.4 SFT + LoRA/QLoRA:2026 年最常用的组合
绝大多数个人和小团队的 SFT 实践是:QLoRA 量化基座模型 + SFT 数据 + LoRA 训练。这个三件套组合让微调变得平民化 16。
完整的典型流程如下:
- 选择一个预训练基座模型(如 LLaMA 3 70B),原始精度 fp16,约 140GB 显存需求
- 用 QLoRA 将模型量化到 4-bit(NF4 格式),显存需求降至约 35GB
- 在量化模型上插入 LoRA 适配器(rank=16,alpha=32),新增可训练参数仅约 0.3GB
- 准备 SFT 数据,通常是 1,000 条精心筛选的指令-回答对
- 用 LoRA 配置训练 2 个 epoch,学习率 2e-4,单张 RTX 4090(24GB 显存)就能跑
- 训练完成后,保存 LoRA 权重(仅几十 MB)
- 推理时,将 LoRA 权重合并回基座模型(或动态加载),即可使用
整个流程的算力成本可以控制在几十元人民币以内。SFT 不再是”只有大厂才做得起”的事情。
LoRA 超参数推荐 17:
| 场景 | r (rank) | alpha | dropout | 目标模块 |
|---|---|---|---|---|
| 轻量(风格/语气调整) | 8 | 16 | 0.05 | q_proj, v_proj |
| 标准(通用指令微调) | 16 | 32 | 0.05 | q_proj, k_proj, v_proj, o_proj |
| 深度(强推理/专业领域) | 32 ~ 64 | 64 ~ 128 | 0.05 ~ 0.1 | 所有线性层 |
记住一个经验:alpha 一般设为 rank 的 2 倍。rank=16, alpha=32 是经过大量实践验证的稳健起点。
三、注意事项:SFT 的局限和常见坑
3.1 SFT 的核心局限
局限一:SFT 只教格式,不教知识
这是 SFT 最重要的局限。LIMA 论文(Zhou et al., 2023)提出了”表面对齐假说”(Superficial Alignment Hypothesis):预训练模型在预训练阶段已经学到了几乎所有需要的知识,SFT 的主要作用是教模型”怎么组织回答的格式和风格”,而不是注入新知识 18。
这个实验用了仅 1,000 条精心筛选的 SFT 数据,就在 65B 参数的 LLaMA 模型上实现了强大的指令跟随能力。它证明:SFT 的效果主要来自数据质量而非数量,并且 SFT 主要在”唤醒”模型已有的能力,而非教模型新东西。
用生活比喻:一个读过无数医书的医学生(预训练),你给他 1,000 个”病人症状-医生诊断”的例子(SFT),他就能学会”用医生的方式回答患者”。但他没有学到新的医学知识——他只是学会了怎么把已经知道的知识”说出来”。如果你问他关于一种他从未读过的罕见病,SFT 给不了他答案。
这意味着:如果你需要模型回答关于你公司内部系统、你私人文档、最新新闻的内容,SFT 帮不了你。 这些知识不在预训练数据里。你需要的是 RAG(检索增强生成)——让模型在回答前先去”查资料”,而不是靠微调”记住”。
局限二:标注数据贵,且质量 > 数量
高质量 SFT 数据需要人类标注,成本不菲。蒸馏可以降低成本,但蒸馏数据的质量受限于”老师模型”的质量——如果 GPT-4 在某个领域本身就不擅长,用它生成的数据训练出的模型也不会好。
更关键的是:1,000 条精心筛选、格式统一、答案准确的高质量数据,效果远好于 10,000 条来源杂乱、格式不一、答案不一致的脏数据。 19。数据清洗(去重、格式检查、质量评分、人工抽检)的时间往往比训练本身还长。
局限三:SFT 只是”模仿”,不能超越
SFT 的本质是模仿学习(Imitation Learning):模型学习的是训练数据中”平均”的回答水平。它不可能产生比训练数据更好的回答——因为它的目标是”模仿标准答案”,而不是”超越标准答案” 20。
这就引出了 SFT 的下一步:偏好对齐(DPO/RLHF)。SFT 解决”这个回答的格式对不对”,DPO/RLHF 解决”这个回答好不好、够不够安全、够不够有用”。SFT 教格式,偏好对齐教品味。
3.2 常见坑
坑一:数据格式不一致
训练数据和推理数据的格式不匹配,会导致模型在推理时输出混乱。例如,训练时用 <|assistant|> 标记助手回答,但推理时用的是 Assistant:——模型可能不认识新格式,输出奇怪的内容。解决方案:在训练前确认训练数据和推理时使用的聊天模板(Chat Template)完全一致,包括特殊标记、换行符、空格。
坑二:忘记 Mask 用户输入
如果没有正确做 Loss Masking,模型会把用户输入也当成”需要预测”的内容。结果是:你问模型”翻译:Hello”,它可能输出”翻译:Hello -> 你好”,而不是只输出”你好”。解决方案:使用 HuggingFace TRL 的 DataCollatorForCompletionOnlyLM 或等效工具,自动为助手回答部分生成训练标签。
坑三:训练太多轮导致”背书”
超过 3 个 epoch,模型开始”死记硬背”训练数据,泛化能力下降。验证方法是:在训练过程中监控验证集(validation set)上的损失——如果训练损失持续下降但验证损失开始上升,说明已经过拟合,应立即停止训练。
坑四:只用纯领域数据训练
如果 100% 的 SFT 数据都来自同一个领域(比如医疗问答),模型会”忘记”怎么进行日常对话——它可能对所有问题都用医学术语回答,甚至把”你好”也当成症状来分析。解决方案:始终混入 10-30% 的通用对话数据,保持模型的通用能力。
坑五:蒸馏时没有人工抽检
完全依赖 GPT-4 等强模型生成的蒸馏数据,如果不做人工抽检,可能会把”老师模型”的错误、偏见、幻觉也一并蒸馏到”学生模型”中。解决方案:随机抽取 5-10% 的蒸馏数据进行人工检查,确认答案质量。
3.3 SFT 什么时候适用,什么时候不适用
适合使用 SFT 的场景:
- 让模型学会特定的输出格式(如 JSON、表格、特定模板)
- 让模型学会特定的语气和风格(如正式/口语、学术/通俗)
- 让模型遵循特定的指令模式(如”先分析再回答”、“分步骤解释”)
- 模型已有相关知识,但不会按你期望的方式表达
不适合使用 SFT 的场景:
- 需要注入预训练数据中没有的全新知识(用 RAG 或继续预训练)
- 需要频繁更新的知识(用 RAG——《西游记》里妖怪的弱点天天变,微调跟不上)
- 只有不到 50 条数据(数据量太少,用 few-shot prompt 更实际)
- 需要教模型”什么是更好”而不仅仅是”怎么做”(用 DPO/RLHF)
四、关联:延伸阅读与导航
本章相关
- 第11章 · 模型微调 — 微调章节总览
- 11.2 全量微调与LoRA — SFT 可以用全量微调实现(贵但效果好)
- 11.2 全量微调与LoRA — SFT 最常用的训练方法
- 11.3 QLoRA:单卡微调大模型 — SFT + QLoRA 组合让微调平民化
- 11.5 DPO与偏好对齐 — SFT 教格式,DPO 教品味,两者互补
概念文件
- 模型训练管线 — 预训练 -> SFT -> 偏好对齐 的完整管线全景图
- 精选训练数据集 (Curated Training Data) — 训练数据的质量筛选与来源
- GRPO (Group Relative Policy Optimization) — 偏好对齐的最新方法,SFT 之后的可选进阶
深挖文件
- 偏好对齐:DPO vs GRPO(深挖) — DPO vs GRPO vs RLHF,SFT 之后的偏好对齐深度分析
- 全量微调(Full Fine-Tuning) — 全量微调的技术细节(SFT 的一种实现方式)
对比文件
- 对比-SFTvsRLHF — SFT 与 RLHF 的全面对比:目标、数据、成本、适用阶段
- 对比-DPOvsRLHF — 两种偏好对齐方法的对比
关键论文
- InstructGPT: https://arxiv.org/abs/2203.02155 (Ouyang et al., 2022)
- LIMA: https://arxiv.org/abs/2305.11206 (Zhou et al., 2023)
- Stanford Alpaca: https://crfm.stanford.edu/2023/03/13/alpaca.html (Taori et al., 2023)
- DPO: https://arxiv.org/abs/2305.18290 (Rafailov et al., 2023)
- LoRA: https://arxiv.org/abs/2106.09685 (Hu et al., 2021)
- QLoRA: https://arxiv.org/abs/2305.14314 (Dettmers et al., 2023)
← 上一节:11.3 QLoRA:单卡微调大模型 | 下一节:11.5 DPO与偏好对齐 →
注释
-
Ouyang et al., “Training language models to follow instructions with human feedback (InstructGPT)”, 2022, https://arxiv.org/abs/2203.02155 ↩
-
Zhou et al., “LIMA: Less Is More for Alignment”, 2023, https://arxiv.org/abs/2305.11206 ↩
-
Ouyang et al., “InstructGPT”, 2022, https://arxiv.org/abs/2203.02155 ↩
-
Taori et al., “Stanford Alpaca: An Instruction-following LLaMA model”, 2023, https://crfm.stanford.edu/2023/03/13/alpaca.html ↩
-
ShareGPT community, “ShareGPT conversations dataset”, 2023, https://sharegpt.com ↩
-
OpenAI, “ChatML format”, 2023 ↩
-
Ouyang et al., “InstructGPT”, 2022, https://arxiv.org/abs/2203.02155 ↩
-
Taori et al., “Stanford Alpaca”, 2023, https://crfm.stanford.edu/2023/03/13/alpaca.html ↩
-
OpenAssistant Community, “OASST2 Dataset”, 2024, https://open-assistant.io ↩
-
Databricks, “Free Dolly: Introducing the World’s First Open Source Instruction-Tuned LLM”, 2023, https://www.databricks.com/blog/2023/04/12/dolly-first-open-commercially-viable-instruction-tuned-llm ↩
-
Zhao et al., “WildChat: 1M ChatGPT Interaction Logs”, 2024, https://arxiv.org/abs/2405.01470 ↩
-
Zheng et al., “LMSYS-Chat-1M: A Large-Scale Real-World LLM Conversation Dataset”, 2024, https://arxiv.org/abs/2309.11998 ↩
-
HuggingFace TRL, “SFTTrainer Documentation”, 2025, https://huggingface.co/docs/trl/sft_trainer ↩
-
THUDM/Slime, “Qwen3 SFT Cookbook”, 2025, https://github.com/THUDM/Slime ↩
-
THUDM/Slime, “Qwen3 SFT Cookbook with KL Regularization Study”, 2025 ↩
-
Dettmers et al., “QLoRA: Efficient Finetuning of Quantized LLMs”, 2023, https://arxiv.org/abs/2305.14314 ↩
-
Hu et al., “LoRA: Low-Rank Adaptation of Large Language Models”, 2021, https://arxiv.org/abs/2106.09685 ↩
-
Zhou et al., “LIMA: Less Is More for Alignment”, 2023, https://arxiv.org/abs/2305.11206 ↩
-
Zhou et al., “LIMA”, 2023, https://arxiv.org/abs/2305.11206 ↩
-
Rafailov et al., “Direct Preference Optimization”, 2023, https://arxiv.org/abs/2305.18290 ↩
关联18
知识图谱局部图谱 · 点节点跳转