大模型蒸馏实战:用大模型当老师,教出小而强的学生模型
模型蒸馏不是简单让小模型模仿大模型输出。本文讲透数据构造、温度控制、教师选择与评估,附可运行蒸馏流程与踩坑清单。
如果你的业务场景是”固定领域的问答、分类、摘要”,用超大模型每天烧几百美元 API 费,很可能是在浪费。模型蒸馏(Distillation) 的核心思路是:用大模型当”老师”生成高质量训练数据,教一个小模型”学生”学会同样的能力。训好之后学生模型的推理成本可以降到老师的 5%~10%。
一、蒸馏不是”抄答案”
最常见的误解是:把老师的输出直接当标签,拿去微调学生。这样做的学生往往只会模仿表面措辞,遇到没见过的输入就露馅。正确的蒸馏包含三个层次:
- 硬标签蒸馏:直接用老师的最终答案(最简单)。
- 软标签蒸馏:用老师输出的概率分布(logits)作为目标,学生能学到”这个答案有多确定”的微妙信息。
- 推理链蒸馏:让老师输出思考过程,学生连”怎么想”一起学。这是当前效果最好的方式。
二、关键步骤
第1步:选对老师。 老师不一定要最强,但要在目标领域上足够强且稳定。通用能力强的模型在垂直领域未必好。建议先用小批量数据对比 2~3 个候选老师。
第2步:构造输入分布。 蒸馏的上限由训练数据的分布决定。数据要覆盖:真实业务问题(主力)、边界与长尾问题、容易出错的诱导性问题、未在知识范围内的”该拒答”问题。
第3步:生成老师标注。 批量调用老师模型,建议开启较低温度(0.2~0.5)保证稳定,但要抽样人工校验,剔除错误标注。老师的错误会被学生 100% 学走。
第4步:训练学生。 用 LoRA 做参数高效微调即可,通常几千条高质量样本就能见效。
第5步:对比评估。 学生、老师、基线模型,在留出集上比较准确率、拒答率、格式合规率,以及最关键的——单位成本下的质量。
三、一个最小蒸馏流程
import json
from openai import OpenAI
client = OpenAI()
def teacher(prompt):
r = client.chat.completions.create(
model="gpt-5", # 老师
messages=[
{"role": "system", "content": "逐步推理后给出答案。"},
{"role": "user", "content": prompt},
],
temperature=0.3,
)
return r.choices[0].message.content
def build_dataset(inputs, out_path="distill.jsonl"):
with open(out_path, "w", encoding="utf-8") as f:
for q in inputs:
ans = teacher(q)
f.write(json.dumps(
{"instruction": q, "output": ans},
ensure_ascii=False) + "\n")
# 之后用 LLaMA-Factory / axolotl 加载该 jsonl 做 LoRA 微调
四、五个高频踩坑
坑1:数据质量不过关。 老师错了、老师偷懒答得敷衍、老师格式不统一——学生全盘照收。必须先人工抽检 5%~10%。
坑2:只蒸一样的数据。 训练分布覆盖不到的场景,学生表现断崖式下跌。务必留出真实业务的长尾样本。
坑3:忘了蒸”拒答”。 只教学生”怎么答”,不教”什么时候不答”,上线后就会疯狂幻觉。
坑4:评估只看准确率。 更要看格式合规、拒答率、延迟、显存占用——毕竟蒸馏的初衷是降本。
坑5:老师一换就重来。 把数据构造脚本、prompt 模板、评估集版本化,否则下次老师迭代就抓瞎。
五、什么时候值得做蒸馏
- 日均调用量大(超过 10 万次),成本敏感;
- 场景相对固定,答案有标准;
- 对延迟有要求(本地小模型推理更快);
- 有数据合规要求,不希望数据出内网。
反过来,如果你的场景是开放式创意、频繁变更需求,蒸馏的投入产出比会很低。
结语
蒸馏的本质是用一次性的训练成本,换长期的推理成本下降。做好数据、选对老师、盯住评估,一个 7B 的学生模型在你的垂直场景里打败 72B 老师,完全可能。关键在于:别把它当”抄作业”,而要当”重新备课”。