5.3 合成数据
Self-Instruct、Evol-Instruct、MAGPIE、Persona-driven:通用合成数据的方法谱系与风险
为什么需要合成数据
人工写 SFT 数据太贵:一条高质量样本需要专家 5-15 分钟,1 万条就是近千小时。而合成数据的边际成本趋近于"调用一次 API"——Alpaca 以 5 万条样本、500 美元成本,开启了合成数据的飞轮时代。
合成数据的方法谱系大致沿两条轴展开:
本节讲通用合成方法。如果你的目标语言是中文方言、藏语、或其他低资源场景,请在读完本节后继续看 5.4 低资源语言 SFT 数据合成——那里讨论翻译、跨语言迁移、原生标注、反向翻译、中转语言等针对低资源的专门路径,许多低资源方法都是本节通用方法的改写或混合。
一、Self-Instruct:合成数据的起点
Wang 等人(ACL 2023, arXiv:2212.10560)提出的 Self-Instruct 是整个谱系的母题。核心循环:
种子池初始化
准备 175 条人工编写种子任务(25 分类任务 + 150 非分类任务)。
迭代扩增
每轮从种子池抽取 8 条,加上已生成的 2 条新任务,作为 few-shot prompt 送给教师模型(如 GPT-3),要求生成新的指令。
实例生成
对每条新指令,再次请求教师模型生成对应的 input-output 对。
- 非分类任务:先 input,后 output;
- 分类任务:先 output(标签),后 input(样本),以缓解标签偏置。
过滤与去重
- 使用 ROUGE-L < 0.7 剔除与池内指令过相似的样本;
- 规则过滤:长度异常、包含 "image/picture" 关键词(文本模型无法处理)等。
成果:5.2 万条指令 + 8.2 万条实例,成本 < 100 美元。但 Wang 自己的审计发现 46% 的样本存在问题——这也是"合成后必须过滤"成为行规的起点。
二、Evol-Instruct / WizardLM:让指令"进化"
Xu 等(ICLR 2024, arXiv:2304.12244)提出通过五种"纵深"操作 + 一种"横向"变异对指令做重写,主动提升难度与多样性:
| 操作 | 说明 | 示例 |
|---|---|---|
| Add Constraints | 加约束 | "用不超过 50 字" |
| Deepening | 深化 | "不仅解释是什么,还要说明为什么" |
| Concretizing | 具体化 | "举一个金融行业的例子" |
| Increase Reasoning | 加推理 | "给出三步推导过程" |
| Complicate Input | 复杂化输入 | 在 input 里加入无关的干扰信息 |
| In-Breadth | 横向(新话题) | 生成一个话题不同但难度相当的新指令 |
Prompt 模板:
# 重写以下指令,使之更加 {operation},但保持核心任务相同。
# 原指令:{seed}
# 新指令:WizardCoder / WizardMath 将同一配方迁移到代码与数学,验证了 Evol 策略的通用性。
三、MAGPIE:从 Base Model "诱发" Prompt
Xu 等(ICLR 2025, arXiv:2406.08464)的 MAGPIE 是最近两年最惊艳的合成数据方法之一。核心思路:
只向对齐模型输入聊天模板前缀 token,让模型"自动补全"出一条用户指令。
<|im_start|>user模型会自动接着生成:
<|im_start|>user
请解释什么是区块链,并给出三个实际应用案例。<|im_end|>然后将生成的指令重新喂回模型,得到回复。无需任何种子任务。
MAGPIE 的三大优势
| 特性 | MAGPIE | Self-Instruct |
|---|---|---|
| 是否需要种子 | 否 | 需要 175 条人工种子 |
| 多样性来源 | 模型自身训练分布 | 种子偏置 |
| 生成速度 | 单次前向传播 | 多次 API 调用(长 prompt) |
| 成本 | 极低(开源模型本地跑) | 依赖 API 成本 |
Llama-3-8B-Base 在 30 万条 MAGPIE 数据上微调后,可与 Llama-3-8B-Instruct 正面抗衡——这证明了一件关键的事:对齐数据并不神秘,它就藏在对齐模型的分布里。
低资源警示:当教师模型对目标语言不流利时(如对藏语、盖丘亚语),MAGPIE 会退化——它只能"诱发"模型已经擅长的语言。低资源场景需结合 logit processor + 语言识别过滤,详见 5.4 低资源合成。
四、Persona-Driven:PersonaHub
腾讯 PersonaHub(Chan/Ge et al., 2024, arXiv:2406.20094)走向"角色多样性"的极端:
- 从网络文本中合成 10 亿级 persona(如"一位研究量子纠错的博士生"、"一位在东京开居酒屋的大叔")
- 以每个 persona 为条件,生成该角色可能会问/写的指令与回复
Prompt 示例:
Persona: 一位研究气候变化的海洋生物学家
Task: 根据该角色的专业背景与关注点,生成一条这个人可能会写的技术提问。
Output:效果:在 7B 学生模型上复现了接近 GPT-4 的 MATH 性能。Persona-Driven 本质上是"可控多样性生成器"——通过显式枚举 persona 空间来扩展指令空间。
五、反向翻译:Humpback
Li 等(ICLR 2024 Oral, arXiv:2308.06259)提出的 Humpback / Instruction Back-Translation 颠倒了常规的流向:
- 给模型大量未标注的网页文档
- 教它为每篇文档反向预测一条可能的用户指令
- 这样得到(指令, 文档)对,经 1-5 分自评过滤到精选子集
Humpback-65B 在 AlpacaEval 上击败 Guanaco、LIMA 和 Falcon-Instruct——且没有用更强教师的蒸馏。这一思路后来被 COIG-Kun(中文反向翻译)直接继承。
六、质量控制:Judge Filtering
Self-Instruct 自己的审计(Wang et al. 2023,200 条抽样,54% 三维度全对 → 46% 至少有一处问题,这是 2022 年 GPT-3 做教师下的数字)奠定了"合成后必须过滤"的行规。现代管线(GPT-4 / Claude-3.5 做教师)错误率显著降低,但"过滤"本身作为流程固定环节已不再是可选项。LLM-as-Judge 是最主流的过滤工具(详见第 8 讲 LLM as Judge):
JUDGE_PROMPT = """你是一位 SFT 数据质检员。请从以下维度对一条(指令, 回复)对打 1-5 分:
- 相关性:回复是否回答了指令?
- 准确性:回复的事实是否正确?
- 完整性:回复是否覆盖指令各子问题?
- 流畅性:语言是否自然?
- 安全性:是否包含有害内容?
仅返回 JSON:{"relevance": x, "accuracy": x, ..., "overall": x, "keep": true|false}
指令:{instruction}
回复:{response}
"""关键实践:
- Judge 模型应强于生成模型(如生成用 GPT-3.5、Judge 用 GPT-4)
- 单点打分 < 配对比较(Nemotron-4 报告):Chat-Hard 上奖励模型作为 Judge(0.87)> LLM-as-Judge(0.54)
- 多 Judge 投票可显著降低位置偏置、长度偏置(详见第 8 讲 LLM as Judge)
七、合成数据的三大风险
合成数据"看起来很美",但忽视以下三个风险会导致训练塌陷。
风险 1:模式坍塌(Mode Collapse)
合成回复在风格上趋同——开头句、结尾句、段落结构高度一致。微调后的模型会继承这种"GPT 腔",失去行文多样性。缓解:在 system prompt 中主动扰动风格("风趣的"/"严肃的"/"口语化的");多 persona 混合。
风险 2:过拟合指令模板
Alpaca 系模板:"Below is an instruction... Write a response..." 训练数据里出现几万次,模型会过度依赖这个前缀,对不符合该模板的 prompt 泛化能力下降。Humpback 和 LIMA 的"反模板"策略正是回应这一问题。
风险 3:教师模型偏置的传递
当 Claude-3.5 是教师时,学生模型会继承 Claude 的回避倾向("作为 AI,我不能……");用 GPT-4 当教师,则继承 OpenAI 的格式偏好(列表、bullet point 过多)。Aya Expanse 的"数据套利"(针对不同子任务从不同教师模型采样)是对这一风险的系统回应。
八、方法对比速查
| 方法 | 种子需求 | 多样性 | 成本 | 适合场景 |
|---|---|---|---|---|
| Self-Instruct | 175 条 | 中 | 中 | 基础合成基线 |
| Evol-Instruct | 种子 + 变异 | 高(纵深) | 高(多轮 API) | 提升难度/推理 |
| MAGPIE | 无 | 高(模型分布) | 极低 | 大规模通用指令 |
| PersonaHub | persona 池 | 极高 | 中 | 风格/视角多样性 |
| Humpback | 少量 | 中(受语料约束) | 中 | 利用无标注语料 |
本节小结
| 要点 | 内容 |
|---|---|
| Self-Instruct | 合成数据的母题:种子 + 自举 + 过滤 |
| Evol-Instruct | 通过 5+1 种变异提升难度与多样性 |
| MAGPIE | 从对齐模型前缀诱发 prompt,无需种子 |
| PersonaHub | 角色多样性驱动的可控生成 |
| Humpback | 反向翻译:从未标注文档找指令 |
| Judge | 合成后必须过滤(Self-Instruct 2022 自评三维度全对率 54%) |
| 风险 | 模式坍塌 / 模板过拟合 / 教师偏置传递 |
下一步
- 面向中文方言 / 藏语 / 其他低资源语言的专门方法:→ 5.4 低资源语言 SFT 数据合成
- 合成数据的质量过滤管线:→ 5.5 质量过滤
- 动手实验:→ 上机实验