最近技术圈里,“蒸馏”可能是被用得最广也最模糊的词之一。有人聊模型蒸馏,有人聊数据蒸馏,还有人聊“把一本书蒸馏成 skill 知识库”——听起来像同一个词,实际做的事情差别很大。更让我留意的,是另一个和它绑定的讨论:开放模型的能力正在快速逼近前沿,而蒸馏在其中扮演了关键角色。这个判断并不夸张。从很多开源模型的发布报告和实际体验看,开放模型与闭源模型的差距正在肉眼可见地缩短,而蒸馏几乎是所有快速追赶路线里绕不开的一环。
但如果只把蒸馏理解成“用大模型教小模型”,会错过更重要的事情。蒸馏并不是单纯的模型压缩技巧,它正在变成一种新的模型生产方式:通过已有的强模型生成高质量数据、行为分布甚至推理路径,再把这些能力迁移到另一个模型上。这条路径绕过了一部分算力和数据门槛,也同时把数据质量、评估体系和工程能力推到了新的瓶颈位置。
1. 先搞清楚概念:蒸馏到底在蒸什么?
1.1 三种常见的“蒸馏”含义
在不同文章里,蒸馏的意思可能完全不同。最经典的是知识蒸馏,最早可以追溯到 Hinton 那篇关于 dark knowledge 的论文,核心思路是让一个较小的学生模型去学习教师模型输出的概率分布,而不只是学习硬标签。这里“蒸”的是模型内部对类别相似度、模糊边界的判断,是一种行为知识。
后来数据蒸馏这个词被越用越广。它通常指的是用大模型生成小模型需要的训练数据,或者从海量数据里筛选出最具信息量的样本。很多人把它叫“蒸馏”,因为它同样是把大模型的能力转化为数据资产。再后来,像“蒸馏一本书”“蒸馏知识库”这类说法出现,本质上也是数据蒸馏的延伸:把非结构化的长文本拆成问答对、知识卡片、摘要,变成模型可直接消费的结构化内容。
三种含义都叫蒸馏,但目标完全不同。经典蒸馏关注模型权重和能力迁移;数据蒸馏关注训练语料的生产与筛选;知识库蒸馏关注的是知识组织形式的重构。如果讨论时不分清楚,很容易鸡同鸭讲。
1.2 蒸馏不是压缩,而是能力迁移
很多人会把蒸馏和剪枝、量化混在一起,因为它们都通向“模型轻量化”。但从机制上看,蒸馏的底层逻辑不太一样。
剪枝是删掉权重中贡献较小的结构,量化是降低权重存储和计算的精度,它们都不改变模型已经学到的能力分布,只是在工程层面做减法。蒸馏则不同,它是在训练阶段引入一个额外的“教师信号”,让学生模型不仅从数据里学,也从教师模型的行为里学。它没有改变模型结构的物理大小,却改变了学生模型的学习目标。
所以更准确的理解是:蒸馏是一种能力迁移方式。剪枝和量化让模型变小,蒸馏让模型“继承”某种行为模式。你完全可以把一个模型蒸馏到另一个同尺寸,甚至更大尺寸的模型上,蒸馏并不天然指向“变小”。
1.3 一个类比:老师傅带实习生
如果要用一个日常类比,蒸馏更像老师傅带实习生,而不是复印文件。
普通训练像是让实习生自己看教材、做习题,从零总结规律。剪枝和量化像是把实习生的工位变小,减少他同时需要处理的信息量。蒸馏则是让老员工手把手教:遇到这个问题你会怎么判断、哪种边界情况容易翻车、两个相近概念之间怎么区分。实习生最后记住的可能不是老员工所有的内部经验,而是那些在实践中最有用的行为习惯。
这也是为什么蒸馏出来的模型经常表现得比同等规模、只用原始数据训练的模型更好。它多了教师模型的“经验过滤”,少走了很多弯路。
2. 开放模型逼近前沿,为什么绕不开蒸馏
2.1 能力扩散速度被重新定义
过去要训练一个接近前沿能力的模型,通常是完整走一遍数据清洗、预训练、指令微调、对齐、评测的流程。这个流程的成本不只是算力,还有数据工程、评测体系、人工反馈和试错周期。很多团队没有能力承担这一步,所以前沿模型长期集中在少数机构手里。
蒸馏改变了这个格局。它提供了一条“站在已有能力之上”的路径:如果有一个足够强的教师模型,你可以用它的输出构造训练数据,也可以直接用它的软分布做监督信号,甚至用它的中间层表征做表征蒸馏。不需要从零开始,也不需要拥有教师模型的权重,只需要能访问它的输出。
这直接影响了开放模型的进化速度。蒸馏出来的模型可能在一开始就有较高的能力下限,再加上后续的继续训练和对齐,就能在更短的时间内逼近教师模型的表现。外部观察者看到的结果是:一个开放模型的发布间隔越来越短,能力却越来越接近前沿。
2.2 模型能力传递链已经形成
在实际生态里,蒸馏已经形成了一条层层传递的链条。
最顶层是少数最强的闭源模型或超大参数模型。中间层是一些开放模型,它们可能直接用最强模型的输出来构造训练集,也可以通过 API 批量生成指令数据来微调。再往下是大量垂直领域模型,它们通常以中间层模型为基础,再结合领域数据做蒸馏或微调。
这条链每一个环节都在做类似的事情:从更强的模型中获取任务知识,转化成自己能用的数据或训练信号。对一个做垂直模型的团队来说,他不一定需要拥有底层大模型,只需要有一个强教师模型和一批高质量任务数据。成本结构完全变了。
这也是海外技术圈关注蒸馏的核心原因之一。它不只是算法论文里的一个 trick,而是模型能力扩散的加速器。它让模型供应从“少数人训练,多数人使用”变成“少数人训练,很多人改造”。
2.3 一个被低估的副作用:评估基准开始失真
蒸馏带来的一个问题是评估基准的可靠性下降。
当一个模型的训练数据本身就来自更强模型的输出时,如果评测集也公开,模型很容易在“见过同类题目”的情况下拿到高分。更麻烦的是,如果教师模型在某些任务上有系统性偏差,学生模型会继承这个偏差,甚至因为数据被反复蒸馏而放大。
这就是为什么现在很多团队开始强调测试集隔离、动态评测、人工抽检。只看几个公开榜单的分数,已经不足以判断一个蒸馏模型到底行不行。要看你关心的任务类型、输入分布、失败样本是否在可控范围内。
2.4 边界:蒸馏只能迁移,不能创造
要泼一盆冷水:蒸馏不能无中生有。如果教师模型本身不具备某种能力,学生模型很难凭空获得它。比如教师模型的推理能力本身就不稳定,蒸馏出来的模型大概率也不会更稳定,甚至可能因为学到的“行为分布”过于集中而丢失多样性。
在需要真正创新能力、跨领域推理能力、强逻辑链能力的场景里,蒸馏不是银弹。它能迁移已有的能力模式,但不能替代基础模型的原始学习过程。你可以用蒸馏快速获得一个不错的领域助手,但不能指望它突然产生教师模型没有掌握的知识边界。
3. 蒸馏怎么做:从软标签到数据蒸馏再到知识库
3.1 经典知识蒸馏:让学生学分布,而不是学答案
经典知识蒸馏的出发点非常朴素:真实标签是唯一的、确定的,但对于一个分类任务,模型内部的判断往往不是“猫就是猫”这么简单。一张图片可能 80% 像猫,15% 像狗,5% 像其他动物。硬标签丢掉了很多这类信息,软标签保留了它们。
教师模型输出的概率分布就是软标签。学生在训练时,不只学习正确类别是什么,还学习类别之间的相似关系。为了让模型输出的概率分布更“平滑”,经典做法是引入温度参数 T。在计算 softmax 之前,把 logits 除以 T。T 越大,分布越平滑,类别之间的细微关系暴露得越充分。
3.2 一个简化版代码示例
下面是一个很简化的知识蒸馏训练示例,结构上覆盖了核心逻辑。实际项目里,教师模型通常很大,需要先缓存输出,再反复训练学生模型。
import torch import torch.nn as nn import torch.nn.functional as F def distillation_loss(student_logits, teacher_logits, labels, T=4.0, alpha=0.7): # 软标签损失:让学生逼近教师模型的概率分布 teacher_soft = F.softmax(teacher_logits / T, dim=-1) student_soft = F.log_softmax(student_logits / T, dim=-1) kd_loss = F.kl_div(student_soft, teacher_soft, reduction="batchmean") kd_loss = kd_loss * (T * T) # 温度缩放补偿 # 硬标签损失:仍然用真实标签兜底 ce_loss = F.cross_entropy(student_logits, labels) return alpha * kd_loss + (1 - alpha) * ce_loss这里的 T 是温度,alpha 是软标签损失和硬标签损失的权重。T 越高,教师模型输出越平滑,学生能学到的“关系信息”越多,但噪声也可能越多。alpha 越接近 1,学生越依赖教师;alpha 越接近 0,学生越依赖真实标签。具体取值没有绝对正确,需要在验证集上试。
实际工程里,你通常不会在线计算教师模型的输出,因为学生模型每一步都要传一次教师模型,成本太高。常见做法是先把所有训练样本的教师 logits 缓存到磁盘或内存,训练学生模型时直接读取。这里最容易被忽略的是缓存数据的版本管理:教师模型更新了,缓存也必须重新生成。
3.3 数据蒸馏:把能力转化成训练语料
数据蒸馏是现在工业界更常用的一种“蒸馏”。它不直接让模型学概率分布,而是用大模型生成训练语料,再用这些语料去微调小模型。它更像是一种数据生产方式。
比如你想做一个客服意图识别模型,与其从零标注几千条语料,不如让一个强模型根据你的业务规则生成一批“用户问题 + 意图标签 + 回复建议”。生成的数据不一定完美,但可以作为初版训练集,然后通过人工抽检和线上反馈逐步修正。
这里常见的方法是提示词工程:给教师模型一段任务描述,让它按指定格式输出。你需要关注的不只是生成内容的数量,还有覆盖度、干净程度、格式合法性和是否越界。
下面是一个提示词示例结构,你可以根据任务调整:
请根据以下产品文档片段,生成 5 组技术问答。 要求: 1. 问题覆盖概念、使用方法、常见错误排查。 2. 答案严格基于给定文档,不要补充外部事实。 3. 如果文档中没有相关信息,请输出“文档未提及”。 输出格式: [ {"question": "...", "answer": "...", "source_chunk_id": "0001"} ]生成之后还有一个关键动作:校验。直接拿去训练大概率会出问题。至少要检查字段是否完整、答案是否忠于原文、有没有明显重复、格式是否能被解析。更严格的做法是让另一个模型做一遍交叉校验,或者用规则脚本做格式检查。
3.4 “蒸馏一本书”到底在做什么
“把一本书蒸馏成知识库”这个说法听起来很玄,但工程流程其实很清晰。
第一步是文档解析。不同格式需要不同解析器,PDF 要处理表格和页眉页脚,Markdown 相对简单,扫描件还得先过 OCR。第二步是清洗和分块。这一步决定后续检索质量,分块大小、重叠策略都需要根据文档结构调整。第三步是内容结构化:可以生成问答对、知识摘要、关键词标签、核心概念解释。这个过程本质上是在用大模型把“叙事型内容”转成“检索型内容”。第四步是导入向量数据库或知识库,供模型在回答时检索引用。
它和传统摘要不一样。摘要通常是把书变短,蒸馏成知识库是把书变成模型可以按需查找的“资产”。用户提出问题时,系统先从知识库里检索相关片段,再交给生成模型组织答案。所以这个流程更准确的名称也许是“知识库构建”或“文档结构化”,只是很多人沿用了蒸馏的说法。
3.5 一个通用处理链路
下面是一个通用流程,不依赖某个具体产品:
原始文档 -> 解析/清洗 -> 分块 -> 生成问答对/摘要/知识卡片 -> 人工或规则校验 -> 向量化 -> 存入知识库 -> 运行时检索 -> 拼接到上下文 -> 生成回答每一步都可能出问题。解析会丢格式,分块会切断上下文,生成会编造文档外内容,向量检索会召回不相关片段。没有一步是“默认就正确”的。只有把这些环节都显式地纳入验证范围,这个流程才能从实验变成可用功能。
4. 工程落地:单次跑通容易,批量稳定很难
4.1 常见的坑:版本、缓存、数据血缘
很多人第一次跑通蒸馏流程后会有一个错觉:好像也不难。单条样本、单批次训练确实不难。但进入真实项目后,最先暴露问题的是工程细节。
第一个坑是教师模型版本管理。教师模型升级后,缓存数据没有重新生成,学生模型还在用旧数据训练。表面上没报错,结果却不理想。更隐蔽的情况是,不同批次的数据来自不同版本的教师模型,导致训练集内部存在风格不一致。
第二个坑是数据血缘。蒸馏数据的来源是哪个文档、哪次生成、哪条提示词、哪个模型版本,这些信息必须记录下来。否则后续排查效果下降时,你根本不知道数据从哪里来,也就没办法定向修复。
第三个坑是格式和异常。批量调用教师模型时,超时、截断、JSON 解析失败、内容为空,这些异常一定会发生。脚本里不处理,数据里就会混入脏样本。一条格式错误的数据也许影响不大,但几百条连续异常,就足以让模型学出错误倾向。
4.2 排查链路:先分层,再定位
遇到蒸馏效果不理想,我一般会按这个顺序排查:
- 看数据:教师模型生成的数据是否和目标任务一致,格式是否完整,有没有明显噪声。
- 看输入:训练样本是否经过了正确清洗,分块是否合理,检索召回片段是否覆盖答案内容。
- 看训练:学生模型参数量是否太小,温度是否过大,alpha 是否失衡,学习率是否合适。
- 看评估:评测集是否和训练集同源,会不会已经泄漏,人工抽检通过比例是多少。
- 看边界:是不是教师模型本身在这个任务上就不稳定,或者任务类型本身不适合用蒸馏解决。
不要一上来就调模型参数。先把数据和评估链路看清楚,问题往往会暴露在更早的位置。
4.3 评估才是真正的难点
蒸馏项目最容易被低估的是评估环节。
训练时的 loss 下降只能说明模型在拟合数据,不能说明它真的掌握了教师模型的能力。你需要一个相对独立的评测集,最好覆盖常见情况、边界情况和错误输入。还要有人工抽检,尤其是对生成类任务,机器评估往往只能覆盖字面相似度,覆盖不了语义质量和业务合规性。
另一个值得做的是分布外测试。故意构造一些教师模型和训练集里都不常见的输入,看学生模型会怎么反应。这个测试能暴露一个蒸馏模型是不是只是“背题”背得好。
4.4 蒸馏、剪枝、量化如何配合
在真实部署里,蒸馏、剪枝、量化经常是组合使用的。
蒸馏负责“让一个小模型获得更好的能力分布”,剪枝负责“把模型结构中冗余的部分去掉”,量化负责“用更低的精度跑推理”。如果你先蒸馏出一个能力不错的中小模型,再剪枝压缩体积,最后量化部署到端侧,效果往往比单用某一种方法更好。
但也要注意顺序。如果先剪枝、再蒸馏,学生模型可能会有更大的容量压力。通常做法是:先确定目标结构,再用蒸馏把能力迁移到这个结构上,最后做量化压缩。具体的顺序要根据任务和框架反复实验,没有统一标准。
5. 给开发者的行动建议:先跑通,再放大,最后看评估
5.1 只是想用蒸馏来提升效果
如果你的目标不是研究蒸馏本身,而是用蒸馏来提升一个小模型的效果,最简单的路径是:
- 找一个大模型作为教师。
- 为你的目标任务准备一小批高质量种子样例。
- 让教师模型基于种子样例扩充数据,生成多样化的训练集。
- 用生成的数据微调一个小模型。
- 用留出的测试集做对比:小模型原始训练 vs 蒸馏数据训练。
不要一开始就追求生成十万条数据。先用几百条到几千条,跑通流程,看效果方向是否正确,再增加数据规模。数据量不是核心,数据质量和覆盖度才是。
5.2 想研究蒸馏原理
如果想把蒸馏作为研究方向,建议先做三件事。第一,找一篇经典知识蒸馏论文,完整复现软标签蒸馏的核心实验,观察温度 T 对结果的影响。第二,复现一个数据蒸馏的流程,让大模型生成数据去训练小模型,对比随机采样数据和生成数据的差异。第三,读几篇关于合成数据、涌现能力和模型评估的近期文献,理解蒸馏为什么会成为行业话题。
这个方向真正的难点不在训练代码,而在设计实验:你怎么证明效果的提升来自蒸馏,而不是来自更多数据、更大模型或随机性。
5.3 想放进生产系统
生产环境不是把训练流程跑通就完事,你需要额外补上这几块:
- 数据血缘:每条训练样本都能追溯到来源、生成批次、使用版本。
- 版本管理:教师模型和蒸馏数据都要有清晰版本号。
- 自动化评估:至少有一个独立评测集和一套定期运行的评估脚本。
- 人工抽检:保留小批量人工审核机制,用于发现自动评估看不到的问题。
- 回滚机制:模型上线后效果下降时,能快速回退到上一个版本。
这些工作看起来和“蒸馏”没有直接关系,但决定了一个蒸馏项目能不能长期跑下去。
5.4 一个可复用的检查清单
| 检查项 | 判断标准 | 常见问题 |
|---|---|---|
| 任务定义 | 目标任务是否明确,输出格式是否稳定 | 任务边界模糊,生成数据杂乱 |
| 教师模型 | 教师模型在目标任务上是否足够强 | 教师本身不强,学生很难超过 |
| 数据质量 | 生成数据是否经过格式校验和内容抽查 | 脏数据直接进训练,效果被稀释 |
| 评估隔离 | 评测集是否独立,是否与训练数据同源 | 评测数据泄漏,分数虚高 |
| 异常处理 | 批量生成是否处理超时、截断、解析失败 | 异常样本静默混入,长期污染模型 |
| 版本回溯 | 是否有教师模型和数据版本记录 | 无法定位效果下降原因 |
6. 真正值得长期关注的,不只是“蒸馏”这个词
6.1 模型生产方式正在变化
蒸馏之所以被反复讨论,是因为它代表了一种更普遍的行业变化:模型能力正在从“少数团队重资产训练”走向“基于已有模型快速复制和改造”。过去获得一个领域模型,必须从数据开始攒;现在可以站在更强模型的基础上,通过蒸馏、合成数据、知识库构建,快速获得一个可用的垂直模型。
这会让模型能力扩散得更快,也会让数据、评估和工程经验变得更值钱。训练一个大模型的难度依然很高,但“基于大模型做改造”的门槛在降低。
6.2 对普通开发者的实际含义
对普通开发者来说,这意味着你可能不需要拥有一支大模型预训练团队,也能做出不错的垂直应用。你需要补的不是算力,而是三个能力:数据构造能力、评估判断能力、工程落地能力。
蒸馏方法不会永远叫“蒸馏”,以后可能会换成合成数据、自我对弈、知识工程等说法。但核心逻辑一致:利用已有强能力,迁移到新的模型或场景中。谁能把数据质量、评估闭环和工程稳定性做好,谁就能更持久地用好这条技术路线。
6.3 结尾
回到一开始的问题:蒸馏到底在蒸什么?它蒸的是模型行为、数据分布、知识结构,也是整个行业对“如何快速获得模型能力”这件事的重新理解。它很强大,但不是魔法;它能加速能力迁移,却不能替代基础创新。真正值得长期关注的,是你在每个具体任务里是否建立了清晰的数据标准、评估边界和验证机制。先把一个小任务跑通,再试着放大,最后用独立的评估去检验它,这条路会比其他追逐新概念的方式走得更远。