第14章:数据工程
"Garbage in, garbage out."——这句老话在 LLM 时代被赋予了新的含义。一个拥有数千亿参数的模型,其上限由训练数据的质量和多样性所决定。
训练一个大语言模型,就像培养一个孩子:你给他读什么书、接触什么环境,决定了他能成为什么样的人。本章我们来看数据这一侧——从哪里收集、如何清洗、怎样配比、以及怎样构造指令数据。
14.1 预训练数据来源与规模
从哪里获取数以万亿计的 token?
训练一个像 GPT-4 或 LLaMA-3 这样的模型,需要数万亿个 token。这是什么概念?假设每个 token 平均约 4 个字符,15 万亿 token 相当于约 60TB 的纯文本——大约是全球每天产生内容的数倍。没有任何人工团队能从零构建这样的数据集,互联网是唯一的来源。
主要数据来源
互联网爬取:Common Crawl
Common Crawl 是一个非营利组织,持续爬取互联网并公开原始数据,每月产生约 20-30TB 的压缩数据,累计已达 PB(拍字节, 字节)量级。几乎所有主流 LLM 的训练都以 Common Crawl 为基础数据来源。
但原始爬取数据质量参差不齐:垃圾广告、乱码、重复内容、有害内容……未经处理直接使用会显著损害模型质量。
高质量来源
为了提升模型的知识深度与推理能力,研究者会特意纳入以下高质量来源:
| 数据来源 | 内容特点 | 代表性工作 |
|---|---|---|
| Wikipedia | 结构化百科知识,多语言 | 几乎所有 LLM |
| 书籍(Books3、Project Gutenberg) | 长篇连贯文本,叙事逻辑强 | GPT-3、LLaMA |
| 代码(GitHub) | 逻辑严密,结构化强 | Codex、LLaMA-2 |
| 学术论文(arXiv、PubMed) | 专业领域知识,数学符号 | Galactica、LLaMA |
| 对话数据(Reddit、StackExchange) | 问答交互模式 | 多数聊天模型 |
规模的感知:从 GPT-3 到 LLaMA-3
:::info 数据规模对比
| 模型 | 参数量 | 训练 token 数 |
|---|---|---|
| GPT-3(2020) | 175B | ~300B |
| LLaMA-1(2023) | 7B–65B | 1T |
| LLaMA-2(2023) | 7B–70B | 2T |
| LLaMA-3(2024) | 8B–70B | 15T |
| Gemma-3(2025) | 1B–27B | ~14T |
:::
从 GPT-3 到 LLaMA-3,训练数据规模增长了约 50 倍。这背后有一个重要的理论支撑——Chinchilla Scaling Law,我们将在下一章详细讨论。直觉上:给定计算预算,增大数据规模往往比增大模型参数更划算。
14.2 数据清洗与去重
问题:原始数据为何不能直接用?
Common Crawl 的原始数据中,大量内容是:
- 乱码或编码错误的文本
- 纯 HTML/CSS/JavaScript 代码而非自然语言
- 广告、导航栏等样板文本
- 多种语言混杂,或语言检测错误的文本
- 大量重复内容(同一篇新闻被转载数千次)
直接训练这样的数据,模型会学到"世界上最常见的内容是广告",以及把某段重复了一万遍的文本完整背下来——这正是我们不希望的。
质量过滤
语言检测:使用 fastText 或 langdetect 等工具过滤出目标语言(如只保留英文和中文比例超过 90% 的文档)。
困惑度(Perplexity)过滤:训练一个轻量级语言模型(如 KenLM),计算每个文档的困惑度:
困惑度过高(文本很不像自然语言)或过低(可能是高度重复的样板文本)的文档都应过滤掉。
规则过滤:
def quality_filter(doc: str) -> bool:
# 过滤过短文档
if len(doc.split()) < 50:
return False
# 过滤广告特征词
if any(kw in doc.lower() for kw in ["click here", "buy now", "lorem ipsum"]):
return False
# 过滤 HTML 残留
if doc.count("<") > 10 and doc.count(">") > 10:
return False
# 检查字母比例
alpha_ratio = sum(c.isalpha() for c in doc) / len(doc)
if alpha_ratio < 0.7:
return False
return True
去重的必要性
:::warning 重复数据的危害
研究表明,训练数据中的重复内容会导致:
- 模型记忆而非泛化:模型在相关 prompt 下会逐字复述训练数据
- 训练效率下降:重复见到同一内容浪费了宝贵的计算资源
- 数据污染:如果测试集内容出现在训练集中,评估结果失真
:::
MinHash 去重:高效估计文档相似度
精确去重(比较所有文档对)的复杂度是 ,对于数亿文档完全不可行。MinHash + LSH(Locality-Sensitive Hashing,局部敏感哈希)提供了近似解决方案。
直觉:两篇文档有多相似?用它们共同 n-gram 的比例来衡量——这就是 Jaccard 相似度:
其中 、 分别是两篇文档的 n-gram 集合。
MinHash 的核心思想:用 个随机哈希函数对每篇文档的 n-gram 集合进行签名,得到一个长度为 的"指纹"向量。可以证明:
即两篇文档在某个随机哈希下"最小哈希值相同"的概率,恰好等于它们的 Jaccard 相似度。
LSH 加速:将 个哈希值分成 个"band",每个 band 包含 个哈希值。两篇文档"至少在一个 band 完全相同"的概率近似为:
其中 是真实的 Jaccard 相似度。选择合适的 和 ,可以让相似度高于阈值(如 0.8)的文档几乎必然被捕捉到,而不相似的文档极少误判——从而将比较复杂度从 降低到近似 。
去重的实际效果:
| 阶段 | 数据规模 |
|---|---|
| Common Crawl 原始数据 | ~200TB(压缩) |
| 语言过滤后 | ~40TB |
| 质量过滤后 | ~10TB |
| 去重后 | ~2-5TB |
原始数据经过完整的清洗流程,通常会缩减 95% 以上。这个"蒸馏"过程是数据工程中最耗费工程时间的部分。
14.3 数据配比策略
仅有数量还不够:配比很关键
假设你已经收集了 15T token 的干净数据,但其中 90% 来自互联网爬取,剩下 10% 来自代码和书籍——这样训练出来的模型会有什么特点?它可能具备不错的通用知识,但逻辑推理能力偏弱,代码能力很差。
数据配比(Data Mixture)是指不同来源数据在训练集中的占比,这是影响模型能力"天花板"的关键决策。
代码数据:意外的推理助手
:::tip 代码数据的隐藏价值
大量研究发现,训练数据中加入代码不仅能提升编程能力,还能显著提升通用逻辑推理能力。原因在于代码具有严格的逻辑因果结构——每一行都有明确的前因后果,这种结构训练了模型的链式推理能力。
LLaMA-2 的技术报告中明确指出,代码数据是提升数学和推理基准分数的重要因素之一。
:::
多语言配比
全球 LLM 的训练数据以英文为主(通常占 60-80%),但对于需要支持中文等其他语言的模型,必须保证足够的非英文比例:
这一对数关系意味着,中文能力要达到英文能力的一半,并不需要中文数据也达到英文数据的一半——大约需要英文数据量的 即可。但实践中,为保证生产质量,主流中文 LLM 的中文训练数据比例通常在 15-30% 之间。
数学数据:合成数据的崛起
数学推理数据天然稀缺——互联网上虽然有大量数学内容,但有完整解题过程的数学题相对较少。解决方案是合成数据:
- 从 MATH、GSM8K 等题库出发
- 用更强的模型(如 GPT-4)生成解题过程
- 验证答案正确性(数学题有确定性答案,容易自动验证)
- 保留正确解题过程作为训练数据
这一思路催生了 Deepseek-R1、QwQ 等数学推理专门模型。
退火策略(Annealing)
:::info 什么是退火策略?
"退火"(Annealing)来自冶金学中的退火工艺——缓慢降温使金属结晶更完美。在 LLM 训练中,退火策略指:
在训练末期(最后 5-10% 的步骤),大幅提高高质量数据(代码、数学、精选书籍)在 batch 中的比例。
直觉:模型在海量数据上学到了通用表示,最后阶段"精雕细刻"地强化最重要的能力。
LLaMA-3 技术报告中描述了类似策略:末期将代码和数学数据比例提高至 40% 以上,显著提升了 reasoning 基准得分。
:::
典型的配比演变示例:
| 训练阶段 | 网页数据 | 代码 | 书籍 | 数学 |
|---|---|---|---|---|
| 主训练阶段 | 75% | 10% | 8% | 7% |
| 退火阶段 | 40% | 25% | 15% | 20% |
14.4 指令数据构建
预训练之后:模型能说话,但不会"听话"
预训练结束后,模型具备了丰富的世界知识和语言能力,但它本质上是一个"续写机器"——给一段文字,它预测下一个词。要让它能理解和执行用户指令("帮我写一封邮件"、"解释一下量子纠缠"),还需要指令微调(Supervised Fine-Tuning, SFT)。
SFT 数据的格式是指令-回复对:
{
"instruction": "用简单语言解释什么是黑洞",
"response": "黑洞是宇宙中引力极强的区域,强到连光都无法逃脱……"
}
质量远比数量重要
:::warning SFT 数据与预训练数据的本质区别
预训练:数量驱动,15T token 的数据是必要的 SFT:质量驱动,1000 条高质量数据 > 100,000 条低质量数据
OpenAI 的早期工作(InstructGPT)仅用约 13,000 条人工标注数据就将 GPT-3 改造成了 InstructGPT,显著提升了指令遵循能力。
:::
原因在于:SFT 是在已有知识的基础上"对齐格式和风格",而非重新习得知识。低质量的 SFT 数据(答案错误、格式混乱、回避问题)会破坏预训练时建立的能力。
数据来源:人工标注 vs 模型生成
人工标注:质量最高,但成本极高。Anthropic、OpenAI 都维护专业标注团队,但规模有限。
Self-Instruct:斯坦福 Alpaca 团队提出的方法——
- 给 GPT-3.5 提供少量种子指令(175 条)
- 让模型自行生成更多指令
- 让模型为自己生成的指令写回复
- 过滤质量差的样本
成本:约 500 美元生成 52,000 条指令数据(2023 年)。
ShareGPT:用户将自己与 ChatGPT 的真实对话分享到 ShareGPT 网站,这些数据被收集整理为训练集。优点是真实反映用户需求分布;缺点是质量参差不齐,且存在版权和隐私问题。
| 数据来源 | 质量 | 成本 | 规模 | 多样性 |
|---|---|---|---|---|
| 人工标注 | 最高 | 极高 | 小(万级) | 依赖标注设计 |
| Self-Instruct | 中 | 低 | 大(十万级) | 可控 |
| ShareGPT | 中高 | 极低 | 中(十万级) | 高(真实需求) |
| 合成数据(强模型生成) | 高 | 中 | 可扩展 | 依赖生成策略 |
数据多样性:覆盖才能泛化
高质量的 SFT 数据集需要在多个维度保持多样性:
- 任务类型:写作、问答、代码、数学、翻译、摘要、对话……
- 难度梯度:从简单事实问答到需要多步推理的复杂任务
- 长度分布:短回复(几句话)到长文档(数千词)
- 语言覆盖:英文为主,但需要覆盖目标语言
- 领域覆盖:通用知识、专业领域(医学、法律、金融)
:::tip 如何量化多样性?
一个实用的方法是将所有指令嵌入(embed)到向量空间,计算数据集的平均成对余弦距离:
值越高说明指令越分散,覆盖越广。LIMA(2023)的研究表明,1000 条高多样性数据的效果超过 50,000 条低多样性数据。
:::
数据质量评估
人工评审:抽样检查,由标注者按照 1-5 分评分,关注准确性、有用性、安全性、格式规范。
模型自动评分(LLM-as-Judge):用 GPT-4 或 Claude 作为裁判,对回复质量打分。常见框架:
你是一个公正的评估者。请对以下回复质量进行评分(1-10分)。
指令:{instruction}
回复:{response}
评分标准:
- 准确性(回复是否事实正确)
- 有用性(是否真正回答了问题)
- 安全性(是否包含有害内容)
- 流畅性(语言是否自然)
请给出分数和简短理由。
:::warning LLM-as-Judge 的局限性
用 LLM 评估 LLM 存在已知偏差:
- 位置偏差:同样内容,放在第一个的回复得分更高
- 长度偏差:更长的回复往往得更高分,不管质量
- 自我偏好:模型倾向于给与自己风格相似的回复更高分
缓解方法:随机化评估顺序、明确要求忽略长度、使用多个不同家族的模型交叉评估。
:::
本章小结
| 主题 | 核心要点 |
|---|---|
| 数据来源 | Common Crawl 提供 PB 级原始数据,Wikipedia/代码/书籍补充高质量内容 |
| 数据规模 | 从 GPT-3 的 300B 到 LLaMA-3 的 15T,规模增长 50 倍 |
| 清洗流程 | 语言检测 → 困惑度过滤 → 规则过滤 → MinHash 去重,原始数据缩减 95%+ |
| MinHash 去重 | 基于 Jaccard 相似度,LSH 将复杂度从 降至近似 |
| 数据配比 | 代码/数学数据提升推理能力;退火阶段末期提高高质量数据比例 |
| 指令数据 | SFT 以质量为核心;人工标注、Self-Instruct、ShareGPT 各有权衡 |
| 质量评估 | 人工评审 + LLM-as-Judge,注意位置偏差和长度偏差 |
我们已经了解了如何获取和准备训练数据。但训练多少数据才够?参数和数据之间的最优比例是什么?算力预算应该怎么分配?这些问题涉及 LLM 训练的"黄金法则"——下一章,我们将探讨 Scaling Law(规模法则),看看 DeepMind 的 Chinchilla 实验如何颠覆了整个领域对"大模型"的认知。