指令微调(SFT)的数据从哪来,是这个阶段最贵的问题。人工标注几万条指令遵循样本,成本以百万美元计、周期以月计,而且标注者的写作能力封顶了数据质量的上限。2022 年底 Self-Instruct(Wang et al., Self-Instruct: Aligning Language Models with Self-Generated Instructions)给出了一条激进路线:种子任务只要 175 条,剩下的让模型自己生。WizardLM 团队的 Evol-Instruct 随后补上了另一半——自己生的数据太简单,那就写一套"演化算子"把题变难。这两套机制今天仍是合成指令数据的地基,也是 Magpie、UltraChat 等新方案的对照组。
Self-Instruct:自助扩增的闭环
机制本身是个迭代回路:
- 种子池:175 条人工写的种子任务(覆盖分类、生成、改写、推理等类型),每条带示例输出;
- 采样生成:每一步从池子里随机抽 8 条作为 few-shot 示例,让模型生成新指令 + 对应的输入实例 + 输出;
- 过滤:新指令过一组启发式规则——长度异常(过短过长都删)、关键词黑名单(含图片/链接等无法文本回答的词)、非英文、与已有指令重复;
- 多样性筛选:用 ROUGE-L 算新指令与池子里所有指令的最大相似度,超过 0.7 的丢弃——这是防"生成器反复出同义题"的核心阀门;
- 通过的指令进池,回到第 2 步,直到扩到 5.2 万条。
这套流程在 GPT-3 上跑出来的 52k 数据微调的模型(GPT-3 Self-Instruct),在 Super-NaturalInstructions 上比直接指令微调强一大截,且风格上出现了指令遵循的行为——证明指令数据的价值主要在"格式和模式"而非"知识",这恰是合成能补的部分。
但多样性上限被锁死在生成器身上:池子里 5 万条指令的"题型分布"本质上是那 175 条种子在模型语义空间里的插值。实验曲线也印证了这点——扩到约 2 万条后新指令的 ROUGE-L 通过率骤降,说明池子已接近饱和,再往后生成的"新题"大量是近重复。这个天花板催生了演化路线。
Evol-Instruct:把简单题变难
WizardLM(Xu et al., 2023)的观察是:种子+自生成的分布偏向"简单、短答"型指令(写一句话、列三个点),而真正拉开模型能力的是复杂指令。他们的解法不是生成新题,而是改写旧题——设计一组演化算子,每次把指令往更难的方向推一步:
- 加约束:给任务附加限制条件(字数、格式、禁止使用的词);
- 深化:要求更多层次的推理或更完整的论证;
- 具体化:把模糊需求落到具体场景、具体输入;
- 增加推理步:显式要求分步分析、中间结论;
- 复杂化输入:把输入数据做长、加噪声、加干扰项;
- 横向演化(in-breadth):跳出原题域,生成相邻领域的新题型,补多样性。
每演化一轮做一次淘汰:让模型尝试回答演化后的指令,答不出来或指令语义已经不连贯的,整条链丢弃(elimination evolving)。活下来的指令及其回答构成 Evol-Instruct 数据集——WizardLM 用这套数据微调的 7B 模型,在复杂度高的任务上被指超过部分 10 倍大的模型,Evol-CodeAlpaca 和 WizardMath 是同框架在代码和数学上的复用。
注意这套机制的实质:用"可解性"当难度控制器。"模型刚好能答对"是训练价值最大的难度区间,淘汰机制把演化目标锁在这个区间。这和课程学习里"最近发展区"的直觉一致,区别是它不需要外部难度评估器,直接拿生成器自己的能力当标尺——方便,但也埋下下一个问题。
两条流水线的共同缺陷
自评偏差。 生成器既是出题人又是考官,题目难度的上限被锁在"生成器能解答"的范围内,风格上则系统性地偏向生成器自己的输出习惯。用 GPT-4 蒸馏的指令数据微调开源模型,最常见的问题——八股腔、过度分点、爱写"总而言之"——就是这个偏差的显形。缓解办法是混合多源生成器,或引入独立的质量判别模型(LLM-as-judge 打分过滤),但判别器本身也是模型,偏差只是转移没有消失。
基准污染的种子问题。 这是最要命的一条。合成指令数据时如果种子池里混入了基准题(比如从 MMLU 抽题当种子,或用 GSM8K 训练集做演化起点),演化算子会把题型扩散到成千上万条"新题"里——表面上去污染检查查不到任何基准原题,模型却学过同构题目。去污染篇的嵌入相似度检测对这类的覆盖也有限。实操纪律:种子池必须人工审计来源,演化的起点只允许来自人工任务或明确无基准重叠的语料。
质量控制别全靠启发式。 Self-Instruct 时代的规则过滤(长度、关键词、ROUGE-L)对新模型已不够。现在主流是加一层执行验证:代码指令跑测试、数学指令对答案、事实性指令做检索核对。验证器的存在把合成数据的"幻觉率"从两位数压到可接受区间,代价是每条数据多一次推理——WizardCoder 的 ablation 显示这部分成本换来的是 HumanEval 类基准上稳定的几个点,值得。
和蒸馏路线的关系
今天的工业界指令数据大头其实是另一条路:直接蒸馏更强模型的输出(ShareGPT、UltraChat、以及各家用 GPT-4/Claude 生成的百万级数据集)。合成路线(Self/Evol 系)相对蒸馏的优势是可控、无授权风险、不依赖外部 API;劣势是质量天花板低一代。务实的配比是蒸馏数据打底(覆盖通用对话能力)+ 演化数据补难度长尾(数学、代码、复杂指令),再叠加一层执行验证。纯靠自合成训出来的模型在通用聊天质感上普遍差一截,这是生成器能力直接传导的结果。
小结
Self-Instruct 的贡献是证明了指令数据可以自助扩增:175 条种子 + few-shot 生成 + ROUGE-L 多样性阀门,迭代到池子饱和约 2–5 万条。Evol-Instruct 补上了难度维度:一组演化算子把简单题逐步加难,用"生成器可解性"当难度控制器做淘汰。两者的天花板都是生成器本身——风格自评偏差锁死输出上限,种子池审计不严会把基准题型扩散成隐蔽污染。落地配方是蒸馏打底、演化补长尾、执行验证兜底。