如果你一直在关注大语言模型 (LLM) 的爆发,你会知道其中的秘诀不仅仅在于参数的规模,还在于数据。具体来说,就是指令微调 (instruction tuning) 。 这个过程将原始的文本预测器转变为能够遵循复杂命令的得力助手。
为了获得良好的性能,你需要高质量、复杂的指令数据集。但瓶颈在于: 手工创建这些数据集难以扩展且昂贵。最近,“Evol-Instruct”方法 (因 WizardLM 等模型而普及) 提出了一个解决方案: 使用 LLM 将简单的指令重写为复杂的指令。
然而,即使是 Evol-Instruct 也有缺陷。它依赖于人类设计的启发式方法和规则来增加问题的难度。如果你想进化一个数学数据集,你需要不同于创意写作数据集的规则。这需要专业知识和手动试错。
在本文中,我们将深入探讨 Auto Evol-Instruct , 这是微软研究院提出的一个新框架,它将人类从循环中移除。作者并没有手动编写规则来增加数据难度,而是提出了一个系统,让 LLM 自动发现并优化进化指令的最佳策略。
背景: 为什么进化很重要
在我们研究自动化之前,我们需要理解指令进化 (Instruction Evolution) 的前提。
大多数开源指令数据集 (如 ShareGPT 或 Alpaca) 都有质量上限。它们通常是简单的问题配上简单的回答。要训练一个“聪明”的模型 (如 GPT-4 或 Claude) ,你需要能够迫使模型进行推理、规划和处理约束条件的训练数据。
最初的 Evol-Instruct 方法通过接受一个简单的提示词 (例如“写一个 Python 脚本来对列表进行排序”) ,并应用特定的启发式规则 (例如“增加时间复杂度约束”) 来解决这个问题。结果可能是: “写一个 Python 脚本,以 O(n log n) 的时间复杂度对列表进行排序。”
目标是最大化在该进化数据上训练的模型的性能。从数学上讲,如果 \(X\) 是我们的原始数据集,\(e\) 是我们的进化方法 (使其变得更难的规则) ,我们希望找到能带来最佳模型性能 \(Q\) 的方法 \(e\):

问题在于,寻找那个完美的方法 \(e^*\) 历来是一项手工工作。Auto Evol-Instruct 将这一搜索过程自动化了。
Auto Evol-Instruct 框架
本文的核心创新在于将进化提示词的设计视为一个优化问题。该框架不仅重写数据;它还随着时间的推移学习如何更好地重写数据。
该架构包含两个截然不同的 LLM 角色:
- Evol LLM (进化 LLM) : 工人。它接收一条指令,并尝试根据当前规则使其变得更复杂。
- Optimizer LLM (优化器 LLM) : 经理。它分析工人的输出,发现失败之处,并更新规则以防未来再次失败。
让我们看看整体架构:

如图 1 所示,该过程是一个循环。我们从一个初始进化方法 (\(e_0\)) 开始。Evol LLM 尝试使用此方法来进化指令 (\(x^{(1)}\) 到 \(x^{(l)}\)) 。然后,Optimizer LLM 介入分析“轨迹”——即从简单到复杂的路径——并生成反馈 (\(f_t\)) 。基于此反馈,它将方法更新为 \(e_t\)。
让我们将其分解为三个关键阶段。
阶段 1: 初始进化方法设计
标准的 Evol-Instruct 使用僵化的模板。Auto Evol-Instruct 从一个“通用初始进化方法”开始。
初始提示词并没有告诉模型确切地如何增加难度 (例如“添加约束”) ,而是要求模型:
- 阅读指令。
- 头脑风暴出一系列使指令更复杂的方法。
- 创建一个计划。
- 执行该计划。
这将创造力的负担从人类工程师转移到了 LLM 身上。然而,通用的提示词是不够的。它经常会失败或产生“虚假”的复杂性。这就是我们需要优化循环的原因。
阶段 2: 进化轨迹分析
这可以说是论文中最有趣的部分。LLM 如何知道指令进化“失败”了?
研究人员意识到,当 LLM 未能增加问题难度时,通常会表现出特定的行为。例如,模型可能只是回答问题,而不是重写问题。或者,它可能会说“明白了,这里有更多信息”。
Optimizer LLM 分析输入和输出,以检测这些特定的进化失败 (Evolution Failures) 。

如上表 5 所示,失败被归类为以下几种类型:
- Stagnant Complexity (复杂性停滞) : 模型回答了提示词而不是使其变得更复杂。
- Insufficient Qualification (限定条件不足) : 模型要求澄清而不是重写。
- Loss of Key Information (关键信息丢失) : 新的提示词忘记了旧提示词的核心任务。
Optimizer LLM 使用特定的提示词来仔细检查这些轨迹。它充当调试器的角色,确切地找出进化不起作用的原因。

图 7 (上) 展示了用于查找进化中漏洞的提示词。图 8 (下) 展示了基于这些漏洞修复方法的提示词。
阶段 3: 进化方法优化
一旦优化器识别出一个问题 (例如,“Evol LLM 正在回答问题而不是重写问题”) ,它就会生成一个新的提示词 (\(e_t\)) ,明确禁止该行为或鼓励更好的行为。
例如,如果反馈是“未提高复杂性”,优化器可能会在提示词中添加一个约束: “确保复杂性的增加是显著的,并且涉及多个逻辑步骤。”
为了稳定性进行多次优化 LLM 可能会不稳定。单次优化步骤可能会使提示词变差。为了解决这个问题,作者借用了“自洽性 (Self-Consistency) ”的概念。
在每一步,他们生成 \(m\) 个不同的潜在优化提示词 (\(e_t^1\) 到 \(e_t^m\)) 。他们在小的开发集上测试所有这些提示词,并计算进化失败率 :

他们选择失败率最低的提示词作为下一轮的正式方法。这确保了系统能创建一个稳健、高质量的指令进化器。
实验与结果
这个自动化系统真的能打败人类设计的启发式方法吗?作者在三个不同领域测试了该框架: 指令遵循 (聊天) 、数学推理和代码生成 。
实现细节
他们使用 GPT-4 作为优化器,通常使用 GPT-4 或 GPT-3.5 作为 Evol LLM。然后,他们使用这些进化后的数据集来微调 Mistral-7B 和 Mixtral-8x7B 等开源模型。
主要性能
结果显示自动化取得了明显的胜利。

观察上表, Auto Evol-Instruct 始终优于原始种子数据和标准的人类设计的 Evol-Instruct。
- 数学 (GSM8K): 这是最显著的结果。在 Mixtral-8x7B 模型上,Auto Evol-Instruct 达到了 82.49% , 而标准 Evol-Instruct 为 79.15%,种子数据为 70.60%。
- 聊天 (MT-Bench): 该方法将分数推高至 8.00 , 超过了标准进化方法。
我们可以通过下面的条形图更清晰地看到这种差距:

在图 3 中,粉红色的条形 (Auto Evol-Instruct) 始终是最高的。特别令人印象深刻的是,这种卓越的性能不需要人类坐下来思考“如何让数学题变得更难”。系统自己弄明白了。
迭代的重要性
人们可能会问: “我们需要优化多少次提示词?”
作者分析了优化步数与最终模型得分之间的关系。

图 5(b) (右) 揭示了一个有趣的“倒 U”形。随着提示词得到更好的优化,性能会提升,在第 12 步左右达到峰值。之后,性能会下降。这表明过度优化是一种风险——提示词最终会变得过于杂乱或限制性太强,积累了让 Evol LLM 困惑的“多余信息”。
为什么这很重要
Auto Evol-Instruct 的意义不仅仅在于更高的基准测试分数。它代表了我们在数据中心 AI (Data-Centric AI) 方法上的转变。
- 领域适应性: 如果你需要为一个小众领域 (例如医疗诊断或法律分析) 创建数据集,你不需要为如何使医疗问题复杂化发明新的启发式方法。你只需将种子数据输入该框架,Optimizer LLM 就会适应特定领域的进化策略。
- 成本效益: 虽然它涉及多次 LLM 调用,但作者表明,与性能增益相比,成本开销微不足道。
- 突破天花板: 互联网上的高质量人类文本快要用完了。像这样通过合成手段提高现有数据复杂性的方法,很可能是训练下一代模型 (如 GPT-5 或 Llama 4) 的未来。
结论
“Automatic Instruction Evolving for Large Language Models”为数据集工程的未来提供了一个引人注目的视角。通过将提示词设计视为 LLM 可解决的优化问题,我们可以生成比手工策划更复杂、更多样化且更有效的训练数据。
对学生和从业者来说,关键的收获很简单: 不要只是微调你的模型;要微调你的数据生成过程。 随着模型变得越来越强大,它们自学 (以及互相教学) 的能力将成为进步的主要动力。
](https://deep-paper.org/en/paper/2406.00770/images/cover.png)