LLM 后训练实践
第2课:SFT进阶

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 通过模拟真实对话场景来构建数据:

  1. 话题种子:从三大类别出发——关于世界的问题、创作与写作、协助完成任务
  2. 多轮模拟:使用两个 ChatGPT 实例分别扮演用户和助手,进行多轮对话
  3. 质量控制:过滤长度异常、重复率高的对话

数据规模

版本数据量说明
UltraChat1.5M 条对话原始版本
UltraChat-200K200K 条对话清洗版,去除低质量样本

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-InstructAlpacaMAGPIE
种子数据175 条175 条(继承)无需
生成模型GPT-3GPT-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(x,y)=Lossconditioned(yx)Lossunconditional(y)\text{IFD}(x, y) = \frac{\text{Loss}_{\text{conditioned}}(y|x)}{\text{Loss}_{\text{unconditional}}(y)}
  • IFD 值高:指令对回复的影响大,即模型需要指令才能生成该回复(较难)
  • IFD 值低:即使没有指令,模型也能生成类似回复(较简单)

去污染(Decontamination)

极其重要:训练数据绝对不能包含评估基准的测试集内容。否则评估结果将毫无意义。这就是"数据泄露"(data contamination)问题。

去污染步骤:

  1. 收集所有常用评估基准的测试集:GSM8K、MMLU、HumanEval、IFEval 等
  2. 对训练数据中的每条样本,检测与测试集的 n-gram 重叠
  3. 移除重叠度超过阈值的训练样本
# 去污染检查示例
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 的核心发现:没有一个固定的最优配比——最优配比取决于你希望模型擅长什么。但以下原则是通用的:

  1. 确保所有目标能力都有代表性数据
  2. 薄弱能力可适当增加数据占比
  3. 安全数据不能太少(否则不安全),也不能太多(否则过度拒绝)
  4. 始终通过验证集实验确认配比效果

数据配比实验方法

# 数据混合实验框架
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-Instruct2022种子任务 + LLM 扩展52K
Alpaca2023Self-Instruct + GPT-3.552K
UltraChat2023双模型模拟多轮对话1.5M → 200K(清洗)
MAGPIE2024利用对齐模型自动补全,无需种子可无限扩展
质量控制方法重要性
去重n-gram / 嵌入相似度高——避免过拟合
难度分级IFD 等指标中——提升学习效率
去污染n-gram 匹配测试集极高——保证评估有效性
数据混合消融实验确定配比高——平衡多维能力