Deep Research: [66] WizardLM / Evol-Instruct:让合成指令更难一点¶
- Source: https://arxiv.org/abs/2304.12244
- Note: ../notes/ref-066-wizardlm.md
- Snapshot: ../sources/md/arxiv-org-abs-2304-12244-a2a03dd0f8f2.md
TL;DR¶
WizardLM 提出了一种名为 Evol-Instruct(进化指令) 的合成数据生成方法,通过使用 LLM(如 ChatGPT/GPT-4)对简单的初始指令进行多轮重写,使其在深度(复杂度)和广度(多样性)上不断进化,从而生成高质量、高难度的指令微调数据集,显著提升了开源模型处理复杂任务(如代码、数学、推理)的能力。
核心观点¶
- 人工标注的局限性:人工编写指令既昂贵又耗时,且人类往往倾向于提出简单或中等难度的问题,导致训练数据缺乏高难度样本(High-complexity instructions),限制了模型潜力的挖掘。
- Evol-Instruct 进化机制:
- 深度进化 (In-Depth Evolving):通过五种策略(添加约束、加深理解、具体化、增加推理步骤、复杂化输入)将简单指令改写为更难的指令。
- 广度进化 (In-Breadth Evolving):基于给定指令生成全新的、话题不同但难度相当的指令,以增加数据集的多样性和长尾覆盖。
- 淘汰机制 (Instruction Eliminator):进化过程必须配套过滤机制,剔除那些无信息增量、模型无法回答(Sorry...)、过于简短或死板复制Prompt的失败进化样本。
- 难度决定上限:实验表明,随着指令进化轮次(Epoch)的增加,训练数据的平均难度上升,微调出的模型在各项基准测试中的得分也同步上升。
- 小模型的大潜力:仅使用 70k 条进化后的数据微调 LLaMA,得到的 WizardLM 在复杂推理、代码生成等任务上显著优于 Alpaca 和 Vicuna,甚至在部分指标上逼近闭源模型。
- 平衡测试集的重要性:由于现有测试集(如 Alpaca/Vicuna testset)偏简单,论文构建了 WizardEval,专门包含高难度、多技能维度的指令,以更真实地评估模型能力。
可落地做法¶
第一步:准备种子数据与环境¶
- 数据源:准备一份基础指令集(如 Alpaca 52k 或 ShareGPT 的子集)作为进化的始祖。
- 模型:选择一个指令遵循能力较强的 LLM 作为进化器(Evolver),推荐 GPT-4 或 Claude 3.5 Sonnet(论文中使用 GPT-3.5)。
第二步:构建进化流水线 (Pipeline)¶
- 定义 Prompt 模板:编写 6 类核心 Prompt(参考论文附录):
- Add Constraints(加约束)
- Deepening(加深度)
- Concretizing(具体化)
- Increased Reasoning(加推理)
- Complicate Input(复杂化输入,如增加 JSON/SQL/代码片段)
- Mutation(广度变异)
- 执行循环:
- 随机抽取一条种子指令。
- 随机选择一个进化策略进行改写。
- 生成对应的回复(Response)。
第三步:质量控制(淘汰器)¶
- 规则过滤:
- 过滤掉包含 Sorry, I cannot... 的回复。
- 过滤掉长度过短(如 <80 字符)的无意义回复。
- 过滤掉直接包含 Given Prompt、Rewritten Prompt 等元数据的输出。
- LLM 校验:使用 LLM 判断进化后的指令是否比原指令有实质性的信息增量,若相等则丢弃。
第四步:混合训练¶
- 将原始种子数据与经过 N 轮(论文推荐 4 轮)进化后的数据合并。
- 对目标模型(如 Llama 3, Mistral)进行全量微调或 LoRA 微调。
检查清单:合成数据进化验收¶
- [ ] 策略覆盖:是否包含了所有 5 种深度进化策略?(仅增加字数不代表增加难度)。
- [ ] 广度变异:是否配置了 mutation 策略以防止数据在特定领域过拟合?
- [ ] 失败率监控:进化失败率是否在合理范围?(过高说明 Prompt 太难或模型太弱,过低说明过滤太松)。
- [ ] 格式完整性:针对复杂化输入策略,是否检查了生成的 JSON/代码/表格 格式是否合法?
- [ ] 回复质量:是否重新生成了进化后指令的回复?(切记:不能用原指令的回复作为新指令的标签)。
- [ ] 去重:合并多轮数据后,是否进行了语义去重?
常见坑与对策¶
- 坑:幻觉指令(Hallucinated Constraints)
- 现象:模型为了增加难度,捏造了逻辑互斥的条件(如请写一段代码,既不用循环也不用递归,但要遍历数组)。
- 对策:在淘汰器环节引入可执行性检查,或者用更强的模型(如 GPT-4)进行 Logic Check。
- 坑:难度失控(Complexity Explosion)
- 现象:经过多轮进化,指令变得极度冗长晦涩,甚至人类都读不懂。
- 对策:限制进化的最大轮次(如 4-5 轮);在 Prompt 中明确限制新增字数不超过 20 词。
- 坑:灾难性遗忘
- 现象:模型学会了处理复杂难题,但回答简单的 Hello 或基础问题时变得罗嗦或答非所问。
- 对策:训练集中必须保留一定比例的原始简单指令(Replay Buffer)。
可用于丰富《AI 辅助软件产品》的写作点¶
- 第 8 章(数据工程 / 合成数据):
- 作为 Self-Instruct 的进阶版介绍。Self-Instruct 解决了从无到有,Evol-Instruct 解决了从有到精。
- Prompt 模式库:直接引用论文中的 5 种深度进化 Prompt 模板,作为数据增强的标准操作手册。
- 第 10 章(模型后训练 / SFT):
- 课程学习(Curriculum Learning):探讨先用简单数据 warmup,再用进化数据进阶的训练策略。
- 数据飞轮:利用 Evol-Instruct 自动生成数据,再用强模型过滤,形成自动化的 Data-Centric AI 闭环。
- 第 18 章(评估与迭代):
- 评估集的陷阱:引用 WizardEval 的发现——大多数基准测试题太简单,无法区分模型在复杂推理上的能力差异。强调构建产品级高难度测试集的重要性。