2.1 指令数据集构建方法
从 Self-Instruct 到 MAGPIE 的指令数据集技术演进,数据质量控制方法,数据混合策略
指令数据集的演进
指令数据集是 SFT 的核心。过去三年,指令数据集的构建方法经历了快速演进——从手工标注到完全自动化合成。
发展时间线
2022.12 2023.03 2023.04 2024.06 2025+
Self-Instruct → Alpaca → UltraChat → MAGPIE → 更智能的合成
(175 种子任务) (52K条) (1.5M多轮) (无需种子) (质量+规模)Self-Instruct:指令数据合成的开创
Self-Instruct(Wang 等,2023)是第一个系统性的指令数据自动生成方法。
核心流程
准备种子任务
人工编写 175 条种子任务,涵盖不同类型(生成、分类、问答等)。每条包含指令、输入(可选)和输出。
指令生成
从种子池中随机采样 8 条指令作为 in-context 示例,提示 GPT-3 生成新指令。
质量过滤
- 去除与已有指令过于相似的(ROUGE-L > 0.7)
- 去除以特定黑名单短语开头的(如"Write a program..."过于简单)
- 去除过长或过短的指令
回复生成
对过滤后的指令,使用 GPT-3 生成对应回复,形成完整的(指令,回复)对。
局限性
| 局限 | 说明 |
|---|---|
| 依赖种子数据 | 生成质量受 175 条种子任务的多样性限制 |
| API 成本 | 需要大量 GPT-3 API 调用 |
| 质量上限 | 生成的数据质量受限于 GPT-3 的能力 |
| 多轮对话弱 | 主要生成单轮指令-回复对 |
Alpaca:快速跟进与规模化
Stanford Alpaca 在 Self-Instruct 基础上做了实用改进:
- 使用 GPT-3.5-Turbo 替代 GPT-3,质量更高、成本更低
- 生成了 52K 条指令数据
- 用这些数据微调 LLaMA-7B,总成本不到 600 美元
- 效果令人惊喜:7B 模型展现出接近 GPT-3.5 的对话能力
Alpaca 的意义不仅在于技术,更在于它证明了一个重要观点:高质量的指令数据可以让小模型释放出惊人的能力。这催生了整个开源 SFT 社区的繁荣。
UltraChat:高质量多轮对话
UltraChat(Ding 等,2023)将指令数据从单轮扩展到多轮对话:
数据构建策略
UltraChat 通过模拟真实对话场景来构建数据:
- 话题种子:从三大类别出发——关于世界的问题、创作与写作、协助完成任务
- 多轮模拟:使用两个 ChatGPT 实例分别扮演用户和助手,进行多轮对话
- 质量控制:过滤长度异常、重复率高的对话
数据规模
| 版本 | 数据量 | 说明 |
|---|---|---|
| UltraChat | 1.5M 条对话 | 原始版本 |
| UltraChat-200K | 200K 条对话 | 清洗版,去除低质量样本 |
UltraChat-200K 是目前最常用的 SFT 数据集之一,也是本课程第 1 课实验使用的数据集。
MAGPIE:无种子数据合成
MAGPIE(Xu 等,ICLR 2025)代表了指令数据合成的最新前沿。
核心创新
MAGPIE 的关键洞察:已对齐的 LLM 在看到聊天模板的用户消息前缀时,会自动补全出一条合理的指令。
# MAGPIE 的核心思路(伪代码)
# 1. 仅输入 ChatML 模板的用户消息前缀
prompt = "<|im_start|>user\n"
# 2. 让对齐模型(如 Qwen3-32B Instruct)自动补全
generated_instruction = model.generate(prompt)
# 输出示例:"解释黑洞是如何形成的,并举一个具体例子"
# 3. 将生成的指令重新输入模型,获得回复
full_prompt = f"<|im_start|>user\n{generated_instruction}<|im_end|>\n<|im_start|>assistant\n"
response = model.generate(full_prompt)
# 4. 形成完整的 (指令, 回复) 对与传统方法的对比
| 特性 | Self-Instruct | Alpaca | MAGPIE |
|---|---|---|---|
| 种子数据 | 175 条 | 175 条(继承) | 无需 |
| 生成模型 | GPT-3 | GPT-3.5 | 任意对齐 LLM |
| 多轮能力 | 弱 | 弱 | 支持 |
| 指令多样性 | 受种子限制 | 受种子限制 | 来自模型自身分布 |
| 成本 | API 调用 | API 调用 | 本地推理 |
| 数据质量 | 中等 | 中等 | 高(来自强模型) |
MAGPIE 的多样性来源
MAGPIE 的指令多样性来自对齐模型自身的概率分布。不同的随机种子和 temperature 设置会采样出覆盖面广泛的指令类型:
temperature=0.7 → 常规指令(问答、解释、摘要)
temperature=1.0 → 创意指令(写作、角色扮演)
temperature=1.2 → 不常见指令(冷门话题、跨领域)数据质量控制
去重(Deduplication)
重复或近似重复的训练数据会导致模型过拟合到特定模式。去重方法:
| 方法 | 原理 | 优势 | 成本 |
|---|---|---|---|
| 精确去重 | 完全相同的文本 | 实现简单 | 低 |
| n-gram 去重 | Jaccard 相似度 > 阈值 | 捕获近似重复 | 中 |
| 嵌入去重 | 向量余弦相似度 > 阈值 | 捕获语义重复 | 高 |
| MinHash LSH | 近似最近邻搜索 | 大规模高效 | 中 |
# 基于 n-gram 的简单去重示例
from collections import Counter
def compute_ngram_overlap(text1, text2, n=3):
"""计算两段文本的 n-gram Jaccard 相似度"""
ngrams1 = set(zip(*[text1.split()[i:] for i in range(n)]))
ngrams2 = set(zip(*[text2.split()[i:] for i in range(n)]))
if not ngrams1 or not ngrams2:
return 0.0
intersection = ngrams1 & ngrams2
union = ngrams1 | ngrams2
return len(intersection) / len(union)
# 标记相似度 > 0.7 的样本对为近似重复
SIMILARITY_THRESHOLD = 0.7难度分级(Difficulty Grading)
并非所有难度的数据对 SFT 同等有效。研究表明应优先选择中等难度样本:
- 太简单的数据:模型已经会做,学不到新东西(如"1+1=?")
- 太难的数据:超出模型能力范围,训练信号噪声大
- 中等难度数据:在模型能力边界处,学习效率最高
IFD(Instruction-Following Difficulty) 指标用于评估样本难度:
- IFD 值高:指令对回复的影响大,即模型需要指令才能生成该回复(较难)
- IFD 值低:即使没有指令,模型也能生成类似回复(较简单)
去污染(Decontamination)
极其重要:训练数据绝对不能包含评估基准的测试集内容。否则评估结果将毫无意义。这就是"数据泄露"(data contamination)问题。
去污染步骤:
- 收集所有常用评估基准的测试集:GSM8K、MMLU、HumanEval、IFEval 等
- 对训练数据中的每条样本,检测与测试集的 n-gram 重叠
- 移除重叠度超过阈值的训练样本
# 去污染检查示例
def check_contamination(train_sample, test_samples, n=10, threshold=0.8):
"""检查训练样本是否与测试集存在 n-gram 重叠"""
train_ngrams = extract_ngrams(train_sample, n)
for test_sample in test_samples:
test_ngrams = extract_ngrams(test_sample, n)
overlap = len(train_ngrams & test_ngrams) / max(len(test_ngrams), 1)
if overlap > threshold:
return True # 污染!应移除
return False数据混合策略
为什么需要混合
单一来源的数据会导致模型能力偏科:
- 只用对话数据 → 推理能力弱
- 只用代码数据 → 通用对话差
- 只用安全数据 → 过度拒绝
Tülu 3 的数据混合实践
Tülu 3 通过系统性消融实验确定了最优数据配比:
| 数据类别 | 代表数据集 | 大致占比 | 作用 |
|---|---|---|---|
| 通用对话 | UltraChat, ShareGPT | ~30% | 基础对话能力 |
| 指令跟随 | IFEval 训练数据 | ~15% | 精确格式遵循 |
| 数学推理 | GSM8K, MATH 训练集 | ~15% | 数学推理能力 |
| 代码生成 | Code-Feedback | ~15% | 编程能力 |
| 安全数据 | 安全相关指令 | ~10% | 安全对齐 |
| 知识问答 | FLAN, 百科类 | ~10% | 知识广度 |
| 创意写作 | 写作类指令 | ~5% | 创意生成 |
混合原则
Tülu 3 的核心发现:没有一个固定的最优配比——最优配比取决于你希望模型擅长什么。但以下原则是通用的:
- 确保所有目标能力都有代表性数据
- 薄弱能力可适当增加数据占比
- 安全数据不能太少(否则不安全),也不能太多(否则过度拒绝)
- 始终通过验证集实验确认配比效果
数据配比实验方法
# 数据混合实验框架
mix_configs = {
"config_a": {"general": 0.5, "math": 0.2, "code": 0.2, "safety": 0.1},
"config_b": {"general": 0.3, "math": 0.3, "code": 0.3, "safety": 0.1},
"config_c": {"general": 0.4, "math": 0.15, "code": 0.15, "safety": 0.3},
}
# 对每种配比:
# 1. 按比例采样构建训练集
# 2. 训练模型(固定其他超参数)
# 3. 在多个基准上评估(GSM8K、HumanEval、MT-Bench、安全测试)
# 4. 选择综合表现最优的配比本节小结
| 方法 | 年份 | 核心思想 | 数据量 |
|---|---|---|---|
| Self-Instruct | 2022 | 种子任务 + LLM 扩展 | 52K |
| Alpaca | 2023 | Self-Instruct + GPT-3.5 | 52K |
| UltraChat | 2023 | 双模型模拟多轮对话 | 1.5M → 200K(清洗) |
| MAGPIE | 2024 | 利用对齐模型自动补全,无需种子 | 可无限扩展 |
| 质量控制 | 方法 | 重要性 |
|---|---|---|
| 去重 | n-gram / 嵌入相似度 | 高——避免过拟合 |
| 难度分级 | IFD 等指标 | 中——提升学习效率 |
| 去污染 | n-gram 匹配测试集 | 极高——保证评估有效性 |
| 数据混合 | 消融实验确定配比 | 高——平衡多维能力 |