16. 如何用大模型生成高质量的 SFT 数据?Self-Instruct 的思路是什么?

整理 Self-Instruct 生成 SFT 数据的思路与实践细节。

简单回答

Self-Instruct 的核心思路是:用少量人工编写的 seed tasks 作为示例,让大模型自动生成新的 instruction-input-output 三元组,然后做去重和质量过滤,形成大规模 SFT 数据。这种方法成本低、覆盖面广,是目前大模型 SFT 数据生成的主流范式。关键是 seed task 的多样性、生成后的质量过滤、以及避免模型生成偏好导致的多样性不足。

详细解释

Self-Instruct 的完整流程

第一步:准备 seed task pool。人工编写 175 条(原始论文的数量)涵盖多种任务类型的高质量 (instruction, input, output) 三元组。这些 seed 应该尽量多样化——涵盖分类、提取、生成、改写、推理、代码、翻译等不同类型,避免过于集中在某一类。

第二步:指令生成。从 seed pool 中随机抽取几条(比如 8 条)作为 few-shot 示例,放到 prompt 里让大模型生成新的 instruction。这里的关键设计是要求模型生成和示例"不同类型"的指令,避免简单模仿。

第三步:判断是否需要 input。有些指令自包含(如"写一首关于春天的诗"),有些需要额外输入(如"将以下段落翻译成中文:{text}")。用一个分类 prompt 让模型判断新指令是否需要 input。

第四步:生成 input 和 output。如果需要 input,先让模型生成一个合理的 input 实例,然后让模型基于 instruction + input 生成 output。如果不需要 input,直接生成 output。

第五步:质量过滤和去重。过滤掉过短或过长的指令、过于简单的指令、和已有指令相似度过高的指令(用 ROUGE-L 或 embedding 相似度做去重)。

经过几轮迭代,可以从 175 条 seed 扩展到 52K 甚至更大规模的 SFT 数据集。

后续改进方法

Evol-Instruct(WizardLM)在 Self-Instruct 基础上做了重要改进。它不是简单地让模型生成新指令,而是让模型对已有指令做"进化"——增加约束条件、增加推理步骤、增加专业领域知识、改写为更复杂的表达等。这样可以系统性地提升指令的复杂度和深度。

Tree-Instruct 进一步发展了这个思路,让指令复杂化沿着一棵树结构展开,每个分支对应一种不同的复杂化方向。

Orca 走了另一条路——不是让 Teacher 直接给答案,而是让 Teacher 给出详细的推理过程(Chain-of-Thought),让 Student 从推理过程中学习,效果比只学最终答案好很多。

生成高质量 SFT 数据的实用建议

第一,seed task 的设计要花心思。多样性比数量更重要——175 条涵盖 20 个任务类别,比 500 条都是同一类任务效果好得多。要特别注意覆盖拒绝类(模型应该拒绝回答的场景)、格式类(JSON 输出、Markdown 等)和多轮对话类。

第二,生成模型要选强的。用 GPT-4 级别的模型生成数据质量明显好于 GPT-3.5。如果预算有限,可以用 GPT-4 生成核心场景的数据,GPT-3.5 生成次要场景的数据。

第三,质量过滤不能省。自动过滤(长度、重复度、格式检查)是第一道关,最好再加人工抽样审核。论文里的统计是 Self-Instruct 生成的数据大约有 50% 以上需要后处理或过滤。

第四,注意生成模型的偏好偏差。GPT-4 生成的回答往往有固定风格(比如喜欢先总结再展开、喜欢列 bullet points、经常说"certainly"之类的词),大量这种数据训出来的模型也会继承这些风格。可以通过 prompt 中加入风格约束、混合多个生成模型、以及后处理改写来增加多样性。

第五,数据许可要提前确认。如前面提到的,用商业模型的 API 生成数据训练竞品模型可能有法律风险。

面试时可以这样答

Self-Instruct 的思路其实很直觉:先人工写一批高质量的 seed task 作为示例,然后用大模型以这些 seed 为 few-shot 去生成新的指令和回答,最后做质量过滤和去重。原始论文用 175 条 seed 扩展到了 52K 条数据。

后续的改进主要有两个方向。一个是 Evol-Instruct,不是生成全新指令,而是让模型对已有指令做复杂化——加约束、加推理步骤、增加专业深度,系统性地提升数据难度。另一个是 Orca 的思路,让 Teacher 不只给答案而是给完整的推理过程,Student 从推理过程中学习。

实操中有几个关键点。seed task 的多样性比数量重要得多。生成模型要尽量用强的,GPT-4 生成的数据质量和 GPT-3.5 差距明显。质量过滤一定不能省,论文统计大概一半以上生成的数据需要后处理。还有一个容易被忽视的点是模型的风格偏好——大量合成数据容易让训出来的模型风格单一,需要刻意增加多样性。

常见追问

  1. Evol-Instruct 具体有哪些进化方向?怎么控制进化的质量?
  2. 如果想用开源模型(不用商业 API)来生成 SFT 数据,效果差距大吗?
  3. 怎么评估一批合成 SFT 数据的质量和多样性是否达标?