Ch11 模型微调

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 消息相当于群聊里的”群公告”,为整个对话定调。

三种格式对比速查

维度AlpacaShareGPTChatML
对话轮数单轮多轮多轮
系统提示可选字段通过首条 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-51e-4 ~ 5e-4LoRA 可承受更高学习率,因为只更新少量参数
训练轮数 (Epochs)1 ~ 22 ~ 3数据多则少训,数据少则多训
批次大小 (Batch Size)32 ~ 12816 ~ 64有效批次大小(含梯度累积)
学习率调度器CosineCosine余弦衰减,逐步降低学习率
预热步数 (Warmup)3% ~ 10%3% ~ 10%初始阶段线性增加学习率
最大序列长度2048 ~ 40962048 ~ 4096覆盖大多数指令-回答对
优化器AdamWAdamW标准选择

2.4 SFT + LoRA/QLoRA:2026 年最常用的组合

绝大多数个人和小团队的 SFT 实践是:QLoRA 量化基座模型 + SFT 数据 + LoRA 训练。这个三件套组合让微调变得平民化 16。

完整的典型流程如下:

  1. 选择一个预训练基座模型(如 LLaMA 3 70B),原始精度 fp16,约 140GB 显存需求
  2. 用 QLoRA 将模型量化到 4-bit(NF4 格式),显存需求降至约 35GB
  3. 在量化模型上插入 LoRA 适配器(rank=16,alpha=32),新增可训练参数仅约 0.3GB
  4. 准备 SFT 数据,通常是 1,000 条精心筛选的指令-回答对
  5. 用 LoRA 配置训练 2 个 epoch,学习率 2e-4,单张 RTX 4090(24GB 显存)就能跑
  6. 训练完成后,保存 LoRA 权重(仅几十 MB)
  7. 推理时,将 LoRA 权重合并回基座模型(或动态加载),即可使用

整个流程的算力成本可以控制在几十元人民币以内。SFT 不再是”只有大厂才做得起”的事情。

LoRA 超参数推荐 17:

场景r (rank)alphadropout目标模块
轻量(风格/语气调整)8160.05q_proj, v_proj
标准(通用指令微调)16320.05q_proj, k_proj, v_proj, o_proj
深度(强推理/专业领域)32 ~ 6464 ~ 1280.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.3 QLoRA:单卡微调大模型 | 下一节:11.5 DPO与偏好对齐 →

注释

  1. Ouyang et al., “Training language models to follow instructions with human feedback (InstructGPT)”, 2022, https://arxiv.org/abs/2203.02155 ↩

  2. Zhou et al., “LIMA: Less Is More for Alignment”, 2023, https://arxiv.org/abs/2305.11206 ↩

  3. Ouyang et al., “InstructGPT”, 2022, https://arxiv.org/abs/2203.02155 ↩

  4. Taori et al., “Stanford Alpaca: An Instruction-following LLaMA model”, 2023, https://crfm.stanford.edu/2023/03/13/alpaca.html ↩

  5. ShareGPT community, “ShareGPT conversations dataset”, 2023, https://sharegpt.com ↩

  6. OpenAI, “ChatML format”, 2023 ↩

  7. Ouyang et al., “InstructGPT”, 2022, https://arxiv.org/abs/2203.02155 ↩

  8. Taori et al., “Stanford Alpaca”, 2023, https://crfm.stanford.edu/2023/03/13/alpaca.html ↩

  9. OpenAssistant Community, “OASST2 Dataset”, 2024, https://open-assistant.io ↩

  10. 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 ↩

  11. Zhao et al., “WildChat: 1M ChatGPT Interaction Logs”, 2024, https://arxiv.org/abs/2405.01470 ↩

  12. Zheng et al., “LMSYS-Chat-1M: A Large-Scale Real-World LLM Conversation Dataset”, 2024, https://arxiv.org/abs/2309.11998 ↩

  13. HuggingFace TRL, “SFTTrainer Documentation”, 2025, https://huggingface.co/docs/trl/sft_trainer ↩

  14. THUDM/Slime, “Qwen3 SFT Cookbook”, 2025, https://github.com/THUDM/Slime ↩

  15. THUDM/Slime, “Qwen3 SFT Cookbook with KL Regularization Study”, 2025 ↩

  16. Dettmers et al., “QLoRA: Efficient Finetuning of Quantized LLMs”, 2023, https://arxiv.org/abs/2305.14314 ↩

  17. Hu et al., “LoRA: Low-Rank Adaptation of Large Language Models”, 2021, https://arxiv.org/abs/2106.09685 ↩

  18. Zhou et al., “LIMA: Less Is More for Alignment”, 2023, https://arxiv.org/abs/2305.11206 ↩

  19. Zhou et al., “LIMA”, 2023, https://arxiv.org/abs/2305.11206 ↩

  20. Rafailov et al., “Direct Preference Optimization”, 2023, https://arxiv.org/abs/2305.18290 ↩

关联18

知识图谱

局部图谱 · 点节点跳转