9. 指令数据工程
「Garbage in, garbage out」在 SFT 阶段被放大到极致。模型的助手风格、对工具的使用习惯、安全行为,几乎完全由 SFT 数据塑造。本章讨论如何获取、生成、筛选高质量指令数据。
9.1 数据质量 ≫ 数量:LIMA 的启示
2023 年 5 月,Meta 发表 LIMA: Less Is More for Alignment(Zhou et al., 2023)。论文用仅 1,000 条精心筛选的指令数据微调 65B LLaMA,得到的模型在人工评测中:
- 43% 的回答优于或等于 GPT-4。
- 65% 优于 DaVinci-003。
- 75% 优于 Bard。
这一结果震动了社区——此前主流认知是「SFT 需要数十万样本」。
9.1.1 LIMA 的 1,000 条数据从哪来
| 来源 | 数量 | 筛选方式 |
|---|---|---|
| Stack Exchange | 200 | 高赞回答 + 长度 + 风格 |
| wikiHow | 200 | 标题作为 instruction,正文作为 response |
| Reddit (Pushshift) | 150 | r/AskReddit 等 |
| 论文/书籍摘录 | 200 | 人工挑选 |
| 人工撰写 | 250 | 作者团队亲自写 |
关键约束:
- 响应风格高度统一:友善、详细、结构化(用列表/标题)的「助手腔」。
- 避免重复主题,最大化 instruction 多样性。
- 响应长度集中在 200-2000 字之间。
9.1.2 Superficial Alignment Hypothesis 的实证
LIMA 论文做的关键消融:
| 训练数据 | MTBench (1-10) |
|---|---|
| 50K Stack Exchange(多样但风格杂) | 4.8 |
| 2K Stack Exchange + 全质筛选(多样且风格统一) | 5.6 |
| 2K 仅 wikiHow(风格统一但单一来源) | 4.7 |
| 1K LIMA(多样且风格统一) | 5.9 |
结论清晰:
- 响应风格统一性比数据量更关键——把 50K 砍到 2K 但保持风格统一,分数反而上升。
- 数据多样性主要在 prompt 端——response 风格越统一越好,prompt 主题越多越好。
- 几乎所有知识在预训练中已经获取,SFT 的本质是「调取」(surface alignment)。
9.1.3 LIMA 的局限
- 手工构造样本不易规模化(250 条人工花了多人月)。
- 模型对采样温度、对抗 prompt 仍较脆弱。
- 1K 样本无法覆盖工具调用、长上下文、复杂数学等专项能力。
LIMA 后续的发展方向:继承「质量 > 数量」的哲学,但用合成数据规模化。这就引出了 Self-Instruct 和 Evol-Instruct。
9.2 Self-Instruct:让 LLM 给自己生成数据
Self-Instruct(Wang et al., 2022)是用 LLM 自身生成指令数据的开山之作。其核心 insight:既然预训练 LLM 已经见过海量「指令-响应」对(QA 论坛、教程等),它本身就具备生成此类数据的能力。
9.2.1 Pipeline 四步
┌──────────────────┐
175 seed instructions │ Task Pool │
(人工编写) │ (动态增长) │
└────┬─────────────┘
│ 8-shot sample
▼
┌────────────────────────────┐
│ Step 1: Instruction Gen │
│ (vanilla GPT-3 生成新指令) │
└────┬───────────────────────┘
│
▼
┌────────────────────────────┐
│ Step 2: Classify Task │
│ (分类 vs 非分类,决定先生成 │
│ input 还是 output) │
└────┬───────────────────────┘
│
▼
┌────────────────────────────┐
│ Step 3: Instance Gen │
│ (生成 input + output) │
└────┬───────────────────────┘
│
▼
┌────────────────────────────┐
│ Step 4: Filter │
│ - ROUGE-L < 0.7 │
│ - 长度/格式启发式 │
│ - 去除「图片」「图表」类 │
└────┬───────────────────────┘
│
└──→ 加入 Task Pool, 循环9.2.2 指令生成 prompt(节选)
Come up with a series of tasks:
Task 1: Write a poem about the seasons.
Task 2: Convert "12 km" to miles.
Task 3: Identify the protagonist of the story below.
Task 4: ...
Task 8: Translate "Hello, world!" to Spanish.
Task 9:让 GPT-3 续写第 9 条。每次随机抽 8 条作为 few-shot,鼓励多样性。
9.2.3 过滤准则
- ROUGE-L 重叠 > 0.7:与已生成指令过于相似,丢弃。
- 指令含「image」「graph」「figure」等:模型无法处理多模态,丢弃。
- 过短(< 5 词)或过长(> 150 词):丢弃。
- 首词限制:要求以动词开头(write/translate/list/...)。
9.2.4 成果
最终用 vanilla GPT-3(text-davinci-001 之前的版本)生成 52K 指令对。在 SuperNI、用户研究等评测上,GPT-3 + Self-Instruct 距离 InstructGPT-001 仅落后 5%——而后者使用了人工标注 + RLHF。
9.2.5 Stanford Alpaca:Self-Instruct 的简化与流行化
Alpaca(Taori et al., 2023)做了三个改动:
- 用
text-davinci-003(更强模型)替代 vanilla GPT-3:生成质量更高,但 Self-Instruct 作者明确指出这与他们的「纯 vanilla LM」初衷不同——本质上是「从 instruction-tuned 模型蒸馏」。 - 简化 pipeline:去掉「分类 vs 非分类」分支,直接 input + output 一并生成。
- 开源 LLaMA-7B 上训练:52K 指令成本 < $500,7B LLaMA 微调约 3 小时(8×A100 80GB)。
Alpaca 的实质是 GPT-3.5 → LLaMA 蒸馏,但因为开源 LLaMA 刚发布,Alpaca 成为 SFT 的「Hello World」,把指令微调推广到了大众。
9.3 Evol-Instruct:让指令自我演化
WizardLM(Xu et al., 2023, Microsoft + 北大)观察到 Alpaca 的指令偏简单,难以训出能处理复杂请求的模型。其方案:Evol-Instruct——让 LLM 把简单指令逐步演化成复杂指令。
9.3.1 In-Depth Evolving(深度演化)
把指令变得更复杂、更难。5 种 prompt 策略:
(1) Add Constraints(增加约束)
原指令:写一个判断闰年的 Python 函数。
演化后:写一个判断闰年的 Python 函数,要求:
1. 不允许使用 if 语句;
2. 函数体不超过 3 行;
3. 输入需要类型注解。(2) Deepening(深入化)
把宽泛问题变得具体深入。
原指令:介绍一下机器学习。
演化后:介绍机器学习中「偏差-方差权衡」的数学定义,并解释为什么深度神经网络能在
高方差区域仍然泛化良好(结合 double descent 现象)。(3) Concretizing(具体化)
用具体场景替换抽象概念。
原指令:解释什么是数据库索引。
演化后:假设你管理一个有 1 亿条用户记录的 MySQL 数据库,user_id 是主键、created_at
没有索引。当你执行 SELECT * FROM users WHERE created_at > '2024-01-01'
ORDER BY created_at LIMIT 100 时,发生了什么?为什么慢?应该建什么索引?(4) Increase Reasoning Steps(增加推理步数)
原指令:3 + 5 = ?
演化后:A 比 B 大 3 岁,B 是 C 年龄的两倍,C 在 5 年后将达到 A 现在的年龄。求 A 现在的年龄。(5) Complicate Input(复杂化输入)
把简单输入复杂化(加表格、代码片段、多模态描述等)。
In-Depth 演化 prompt 的核心 instruction:
"Your objective is to rewrite a given prompt into a more complex version to make those famous AI systems (e.g., ChatGPT and GPT-4) a bit harder to handle. But the rewritten prompt must be reasonable, understood, and responded to by humans."
9.3.2 In-Breadth Evolving(广度演化)
基于已有指令生成「同领域、不同主题的全新指令」,扩大数据多样性。例如从「介绍 React Hooks」演化出「介绍 Vue 3 Composition API」、「介绍 Svelte 的响应式系统」等。
9.3.3 Elimination Evolving(淘汰演化)
过滤失败的演化:
- 演化后与原指令信息熵相同(没有真实变化)。
- 模型回复中出现 "sorry"、"I cannot"、"as an AI"。
- 输出包含纯标点或乱码。
- 输出长度异常(< 10 字 或 > 5000 字)。
9.3.4 演化与训练
- 起始 52K Alpaca 指令,经 4 轮演化生成约 250K 复杂指令。
- WizardLM-7B/13B/70B 在高难度评测(如 MT-Bench Hard)甚至超过 ChatGPT 的偏好度。
- 衍生品:WizardCoder(代码)、WizardMath(数学)。
9.3.5 实战代码片段
EVOL_PROMPT = """I want you act as a Prompt Rewriter.
Your objective is to rewrite a given prompt into a more complex version
to make those famous AI systems (e.g., ChatGPT and GPT-4) a bit harder to handle.
But the rewritten prompt must be reasonable and understood by humans.
You SHOULD complicate the given prompt using the following method: {method}
The rewritten prompt must NOT exceed the original by 10 to 20 words.
#The Given Prompt#: {seed}
#The Rewritten Prompt#:"""
METHODS = {
"constraints": "Please add one more constraints/requirements into #The Given Prompt#.",
"deepening": "If #The Given Prompt# contains inquiries about certain issues, the depth and breadth of the inquiry can be increased.",
"concretizing": "Please replace general concepts with more specific concepts.",
"reasoning": "If #The Given Prompt# can be solved with just a few simple thinking processes, you can rewrite it to explicitly request multiple-step reasoning.",
}
def evolve(seed_prompt, llm, method="constraints"):
prompt = EVOL_PROMPT.format(method=METHODS[method], seed=seed_prompt)
return llm(prompt, max_tokens=512)9.4 合成数据生态:从蒸馏到自生成
InstructGPT、Alpaca 之后,用强模型(GPT-4 / Claude)合成训练数据成为主流。这一思路一直发展到 2025 年,演化出多种范式。
9.4.1 Vicuna:直接复用真实 ChatGPT 对话
Vicuna(LMSYS, 2023)从 ShareGPT.com 抓取 70K 用户分享的真实 ChatGPT 多轮对话,过滤后直接 SFT。优点:
- 真实分布:与 InstructGPT 用户数据接近。
- 多轮天然:不需要合成多轮逻辑。
缺点:
- 法律灰区:未经 OpenAI 授权使用其输出。
- 存在 ChatGPT 风格污染:「As an AI language model, I cannot...」等套话被学进去。
9.4.2 UltraChat:合成多轮对话
UltraChat(Ding et al., 2023):自迭代式合成 1.5M 高质量多轮对话。pipeline:
- 主题分级:30 大类(关于世界 / 写作辅助 / 推理…),每类 100+ 子主题。
- 指令生成:让 GPT-3.5 围绕子主题生成 user 指令。
- 多轮模拟:两个 GPT-3.5 实例模拟 user 和 assistant 的对话。
- 质量过滤:长度、重复率、关键词。
UltraChat-200K 是 HuggingFaceH4 整理的过滤版本,是 SFT 训练的常用基础。
9.4.3 OpenHermes / Tulu:聚合数据集
- OpenHermes 2.5(Teknium):聚合 Self-Instruct、ShareGPT、CodeAlpaca、Glaive 等多种合成数据集,约 1M 样本。
- Tulu 系列(AI2):开源 SFT 数据混合 + DPO,配方完全透明,是开源社区的「标准答案」之一。Tulu V2 Mix 后续被很多项目复用。
9.4.4 OpenOrca / SlimOrca:FLAN + GPT-4
Microsoft 的 Orca 论文提出「Explanation Tuning」:用 GPT-4 重新回答 FLAN 的题目,并要求 GPT-4 给出逐步推理过程。OpenOrca、SlimOrca 是社区复刻版本,非常适合提升模型的推理能力(CoT)。
9.5 Magpie:「无中生有」的合成范式
Magpie(Xu et al., 2024,华盛顿大学 + AI2,ICLR 2025)是 2024 年最具创意的指令数据合成方法。
9.5.1 核心 Trick
利用对齐 LLM 的自回归特性——只输入左侧模板,让模型自己生成 user query:
<|begin_of_text|><|start_header_id|>user<|end_header_id|>
← 在这里截断输入,喂给 Llama-3-Instruct模型作为 decoder-only LM,会从这个截断位置开始续写。因为它在 SFT/RLHF 时见过大量 <|start_header_id|>user<|end_header_id|>\n\n 之后跟着真实 user 问题的样本,它会自然地生成 user 的问题:
What are the key differences between supervised and unsupervised learning?<|eot_id|>然后再用同一个模型生成 assistant 响应:
<|begin_of_text|><|start_header_id|>user<|end_header_id|>
What are the key differences between supervised and unsupervised learning?<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
← 模型续写出响应9.5.2 优势
- 零 prompt engineering:不需要 seed task、不需要演化策略。
- 零人工 seed:完全靠模型自己。
- 直接「萃取」对齐模型内化的知识分布:相当于把 RLHF 后模型脑中的「user-assistant 联合分布」直接采样出来。
- 极快:用 Llama-3-70B-Instruct 生成 4M 条仅需数千 GPU 小时。
9.5.3 后处理
原始 4M 数据需要过滤:
- 用 reward model 打分,保留 Top-N。
- 去重(embedding similarity)。
- 长度、重复模式检查。
最终 Magpie-Pro 300K 是公开数据集。论文还做了一个惊人对照:
仅用 Magpie 数据做 SFT,就能超过用 UltraFeedback 数据做 SFT + DPO 的效果。
这暗示对齐模型的「自蒸馏」可能比 RLHF 更高效——后续 RL 章节会进一步讨论。
9.5.4 实战代码
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Meta-Llama-3-8B-Instruct",
torch_dtype=torch.bfloat16, device_map="auto",
)
# Step 1: 从空 user 模板生成 user query
left = "<|begin_of_text|><|start_header_id|>user<|end_header_id|>\n\n"
left_ids = tokenizer(left, add_special_tokens=False, return_tensors="pt").input_ids.cuda()
with torch.no_grad():
user_out = model.generate(
left_ids, max_new_tokens=200,
do_sample=True, temperature=1.0, top_p=0.95,
eos_token_id=tokenizer.convert_tokens_to_ids("<|eot_id|>"),
)
user_query = tokenizer.decode(user_out[0][left_ids.shape[1]:], skip_special_tokens=True)
# Step 2: 用 user query 生成 assistant response
messages = [{"role": "user", "content": user_query.strip()}]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
ids = tokenizer(prompt, add_special_tokens=False, return_tensors="pt").input_ids.cuda()
with torch.no_grad():
out = model.generate(
ids, max_new_tokens=1024,
do_sample=True, temperature=0.7, top_p=0.95,
eos_token_id=tokenizer.convert_tokens_to_ids("<|eot_id|>"),
)
assistant = tokenizer.decode(out[0][ids.shape[1]:], skip_special_tokens=True)
print({"instruction": user_query, "output": assistant})9.6 数据去污(Decontamination)
9.6.1 问题:训练集泄漏到评测基准
如果训练数据包含评测基准(MMLU、GSM8K、HumanEval 等)的题目,会导致虚高分数("train on test")。这是 LLM 排行榜信任危机的主要源头。
典型「污染」来自:
- 直接 leak:网页抓取时把基准题集合(如 GitHub 上的 MMLU 副本)抓进了训练数据。
- 间接 leak:合成数据(如 Self-Instruct)的 seed 包含了基准题。
- rephrased leak:原题被某个网友改写后发到了训练语料里。
9.6.2 N-gram 重叠检测
最常用方法:以字符或 token 为单位,n=8~13,若基准样本与训练数据 n-gram 重叠率 > 阈值则视为污染。
import re
from collections import defaultdict
def normalize(text: str) -> str:
text = re.sub(r"\s+", " ", text.lower().strip())
text = re.sub(r"[^\w\s]", "", text)
return text
def extract_ngrams(text: str, n: int = 13):
text = normalize(text)
if len(text) < n:
return set()
return {text[i : i + n] for i in range(len(text) - n + 1)}
def contamination_score(bench_text: str, train_corpus: list[str], n: int = 13) -> float:
bench_ng = extract_ngrams(bench_text, n)
train_ng: set[str] = set()
for d in train_corpus:
train_ng |= extract_ngrams(d, n)
if not bench_ng:
return 0.0
return len(bench_ng & train_ng) / len(bench_ng)阈值经验:
- 字符 n=13 + score > 0.5:高度可疑。
- token n=8 + score > 0.3:也可疑(token 表示更稀疏)。
9.6.3 Embedding + LLM Judge:抓「rephrased contamination」
n-gram 无法捕捉改写后的污染(如改变措辞但语义相同)。LLM Decontaminator(Yang et al., 2023, LMSYS):
- 用 sentence embedding 召回 Top-K 相似训练样本。
- 用 GPT-4 判断每对是否「实质等价」。
Prompt:
You are given a benchmark question and a candidate training sample.
Decide whether the candidate is a paraphrase of the benchmark question
(answers identical, requires same knowledge).
Benchmark: {bench_q}
Candidate: {train_q}
Answer with YES or NO.LMSYS 团队用此方法在 RedPajama、Stack Exchange 等公开语料中发现了大量针对 MMLU、HumanEval 的隐性污染。
9.6.4 ConTAM 研究的建议
ConTAM(2024)系统比较多种污染检测方法,建议:
- n < 8 的较小 n-gram 检测更敏感,避免漏报。
- 同时使用 token-match、ngram-match、token-extend 多种指标。
- 每个新评测周期都重做一次(数据污染会随时间累积)。
9.7 数据混合:领域配比
实战中 SFT 数据通常按比例混合多种领域:
| 领域 | 代表数据集 | 比例参考 |
|---|---|---|
| 通用对话 | UltraChat, ShareGPT, Magpie, OpenHermes | 30-50% |
| 代码 | CodeAlpaca, Magicoder, OpenCodeInterpreter, Code-Feedback | 15-25% |
| 数学 | MetaMathQA, OpenMathInstruct, MMIQC | 10-20% |
| 推理 / CoT | OpenOrca, FLAN-CoT, Tulu-Reasoning | 10-20% |
| 工具调用 | Glaive-Function-Calling, ToolBench | 5-10% |
| 多语言 | Aya, BELLE, COIG | 视目标 |
| 安全 / 拒答 | Anthropic HH, BeaverTails | 1-5% |
Tulu V2 Mix 是一个被广泛参考的开源混合配方(约 320K 样本):
- ShareGPT (~110K)
- WizardLM-Evol (~70K)
- FLAN V2 (~50K)
- CoT (~50K)
- Code-Alpaca (~20K)
- 其他 (~20K)
混合策略要点:
按 token 而非样本数比例配比:长样本(如代码)token 更多,按样本比会被低估。
温度采样:从大数据集少采、小数据集全采,用温度参数
控制: 是按比例采, 是各 dataset 等概率采。
9.8 质量过滤
9.8.1 长度过滤
- 过短(< 10 词):通常是 trivial 样本或截断错误。
- 过长(> max_seq_length):训练时会截断,response 不完整反而有害。
- 建议保留长度在 P10 ~ P95 之间。
9.8.2 困惑度过滤
用一个小模型(如 Llama-3-8B-base)计算 response 的 PPL,过滤异常高(噪声)和异常低(模板化重复)的样本。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
scorer = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B").cuda().eval()
tok = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B")
@torch.no_grad()
def ppl(text: str) -> float:
ids = tok(text, return_tensors="pt").input_ids.cuda()
out = scorer(ids, labels=ids)
return torch.exp(out.loss).item()9.8.3 Reward Model 评分
用 reward model(如 ArmoRM, Skywork-Reward)打分,保留 Top-K:
from transformers import AutoModelForSequenceClassification, AutoTokenizer
rm = AutoModelForSequenceClassification.from_pretrained("Skywork/Skywork-Reward-V2-Llama-3.1-8B")
rm_tok = AutoTokenizer.from_pretrained("Skywork/Skywork-Reward-V2-Llama-3.1-8B")
@torch.no_grad()
def score(messages):
ids = rm_tok.apply_chat_template(messages, return_tensors="pt").cuda()
return rm(ids).logits[0, 0].item()实战经验:用 RM 打分 + 取 Top-30% 作为最终 SFT 数据,效果常优于全量训练。
9.8.4 多样性筛选
避免主题集中:
from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans
emb_model = SentenceTransformer("BAAI/bge-large-en-v1.5")
embs = emb_model.encode([s["instruction"] for s in data])
km = KMeans(n_clusters=200, random_state=42).fit(embs)
# 从每个簇取 Top-K(按 RM score)作为多样化采样9.9 关键开源数据集速查
| 数据集 | 规模 | 类型 | 来源 | 特点 |
|---|---|---|---|---|
| Alpaca | 52K | 单轮指令 | text-davinci-003 蒸馏 | 历史经典,质量一般 |
| ShareGPT | ~90K | 多轮对话 | 用户分享的 ChatGPT | 真实分布,有合规风险 |
| OpenAssistant (oasst1/2) | 84K/130K | 多轮人工 | 全球志愿者 | 完全人工,多语言 |
| Dolly-15K | 15K | 单轮人工 | Databricks 员工 | 商用许可 |
| UltraChat | 1.5M | 多轮合成 | GPT 自迭代 | 主题覆盖广 |
| WizardLM Evol | 250K | 单轮演化 | Evol-Instruct | 难度梯度 |
| LIMA | 1K | 单轮精选 | 人工 + Stack Exchange | 极高质量 |
| Magpie-Pro | 300K | 单/多轮合成 | Llama-3-70B-Instruct | 自生成 |
| WildChat | 652K | 多轮真实 | GPT-3.5/4 真实使用 | 真实分布 |
| OpenHermes 2.5 | ~1M | 混合 | 聚合 | 开源 SFT 基准 |
| Tulu-3-SFT-Mixture | 939K | 混合 | AI2 | 配方透明 |
| OpenOrca | 4.2M | 推理增强 | GPT-4 重写 FLAN | 提升 CoT |
| Glaive-Function-Calling | 113K | 工具调用 | 合成 | 函数调用专项 |
| MetaMathQA | 395K | 数学 | GSM8K/MATH 增广 | 数学 SFT |
| Magicoder-OSS | 75K | 代码 | OSS 启发合成 | 代码 SFT |
| Aya | 513M (multi-lang) | 多语言 | 119 语言志愿者 | 多语言对齐 |
9.10 一个端到端的数据 pipeline
把上面所有要素串起来,一个工业级 SFT 数据 pipeline 大致是:
┌─────────────────┐
│ 1. 原始来源采集 │ Magpie / UltraChat / 真实日志 / 人工标注
└────────┬────────┘
▼
┌─────────────────┐
│ 2. 格式标准化 │ 统一为 OpenAI Chat 格式
└────────┬────────┘
▼
┌─────────────────┐
│ 3. 去重 │ MinHash / SimHash 在指令端去重
└────────┬────────┘
▼
┌─────────────────┐
│ 4. 去污 │ 与 MMLU/GSM8K/HumanEval 等做 13-gram 检测
└────────┬────────┘
▼
┌─────────────────┐
│ 5. 质量打分 │ RM / PPL / 长度
└────────┬────────┘
▼
┌─────────────────┐
│ 6. 多样性筛选 │ embedding 聚类 + 每簇 Top-K
└────────┬────────┘
▼
┌─────────────────┐
│ 7. 领域混合 │ 通用 / 代码 / 数学 / 工具 比例配比
└────────┬────────┘
▼
┌─────────────────┐
│ 8. 模板化 + 切分 │ apply_chat_template, train/eval split
└────────┬────────┘
▼
SFT9.11 本章小结
- 质量 ≫ 数量:LIMA 的 1K 数据 > 杂乱 50K 数据。响应风格统一、prompt 多样化是黄金组合。
- Self-Instruct → Alpaca → Evol-Instruct → Magpie:合成数据范式一路演化,从「seed + few-shot」到「演化算子」到「无中生有」。
- 去污是底线:现代 LLM 排行榜可信度的核心依赖于训练数据未泄漏评测基准。
- 混合配比按 token 不按样本:通用对话 30-50%,代码/数学/推理各 10-25%,工具调用与安全数据点缀。
- 质量过滤工具:长度 + PPL + RM score + 多样性聚类,逐层筛选。
思考题
如果你只有 100 万美元预算,要从零构建一个高质量 SFT 数据集,你会如何分配预算? 比较「全人工标注 1 万条」「GPT-4 蒸馏 100 万条」「Magpie 自生成 + RM 筛选」「混合策略」四种路线,估算成本、质量、可复现性。
Magpie 让 RLHF 后的模型「自吐」数据,理论上是模型自身知识分布的 IID 采样。这是否意味着用 Magpie 做 SFT 会让模型陷入「自我循环」、能力不再提升? 设计一个实验来验证或证伪。
在数据去污中,n-gram 检测可能漏掉「翻译后的污染」(英文 MMLU 题被翻译成中文混入训练集)。如何检测这类跨语言污染? 提出一个可行的 pipeline,并讨论计算开销。