跳到主要内容

第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(拍字节,101510^{15} 字节)量级。几乎所有主流 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–65B1T
LLaMA-2(2023)7B–70B2T
LLaMA-3(2024)8B–70B15T
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),计算每个文档的困惑度:

Perplexity(W)=P(w1,w2,,wN)1N=exp(1Ni=1NlogP(wiw1:i1))\text{Perplexity}(W) = P(w_1, w_2, \ldots, w_N)^{-\frac{1}{N}} = \exp\left(-\frac{1}{N}\sum_{i=1}^{N} \log P(w_i | w_{1:i-1})\right)

困惑度过高(文本很不像自然语言)或过低(可能是高度重复的样板文本)的文档都应过滤掉。

规则过滤

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 重复数据的危害

研究表明,训练数据中的重复内容会导致:

  1. 模型记忆而非泛化:模型在相关 prompt 下会逐字复述训练数据
  2. 训练效率下降:重复见到同一内容浪费了宝贵的计算资源
  3. 数据污染:如果测试集内容出现在训练集中,评估结果失真

:::

MinHash 去重:高效估计文档相似度

精确去重(比较所有文档对)的复杂度是 O(n2)O(n^2),对于数亿文档完全不可行。MinHash + LSH(Locality-Sensitive Hashing,局部敏感哈希)提供了近似解决方案。

直觉:两篇文档有多相似?用它们共同 n-gram 的比例来衡量——这就是 Jaccard 相似度:

J(A,B)=ABABJ(A, B) = \frac{|A \cap B|}{|A \cup B|}

其中 AABB 分别是两篇文档的 n-gram 集合。

MinHash 的核心思想:用 kk 个随机哈希函数对每篇文档的 n-gram 集合进行签名,得到一个长度为 kk 的"指纹"向量。可以证明:

P[minh(A)=minh(B)]=J(A,B)P[\min_h(A) = \min_h(B)] = J(A, B)

即两篇文档在某个随机哈希下"最小哈希值相同"的概率,恰好等于它们的 Jaccard 相似度。

LSH 加速:将 kk 个哈希值分成 bb 个"band",每个 band 包含 rr 个哈希值。两篇文档"至少在一个 band 完全相同"的概率近似为:

P(candidate pair)1(1sr)bP(\text{candidate pair}) \approx 1 - (1 - s^r)^b

其中 ss 是真实的 Jaccard 相似度。选择合适的 bbrr,可以让相似度高于阈值(如 0.8)的文档几乎必然被捕捉到,而不相似的文档极少误判——从而将比较复杂度从 O(n2)O(n^2) 降低到近似 O(n)O(n)

去重的实际效果

阶段数据规模
Common Crawl 原始数据~200TB(压缩)
语言过滤后~40TB
质量过滤后~10TB
去重后~2-5TB

原始数据经过完整的清洗流程,通常会缩减 95% 以上。这个"蒸馏"过程是数据工程中最耗费工程时间的部分。


14.3 数据配比策略

仅有数量还不够:配比很关键

假设你已经收集了 15T token 的干净数据,但其中 90% 来自互联网爬取,剩下 10% 来自代码和书籍——这样训练出来的模型会有什么特点?它可能具备不错的通用知识,但逻辑推理能力偏弱,代码能力很差。

数据配比(Data Mixture)是指不同来源数据在训练集中的占比,这是影响模型能力"天花板"的关键决策。

代码数据:意外的推理助手

:::tip 代码数据的隐藏价值

大量研究发现,训练数据中加入代码不仅能提升编程能力,还能显著提升通用逻辑推理能力。原因在于代码具有严格的逻辑因果结构——每一行都有明确的前因后果,这种结构训练了模型的链式推理能力。

LLaMA-2 的技术报告中明确指出,代码数据是提升数学和推理基准分数的重要因素之一。

:::

多语言配比

全球 LLM 的训练数据以英文为主(通常占 60-80%),但对于需要支持中文等其他语言的模型,必须保证足够的非英文比例:

语言能力log(该语言 token 数量)\text{语言能力} \propto \log(\text{该语言 token 数量})

这一对数关系意味着,中文能力要达到英文能力的一半,并不需要中文数据也达到英文数据的一半——大约需要英文数据量的 e137%e^{-1} \approx 37\% 即可。但实践中,为保证生产质量,主流中文 LLM 的中文训练数据比例通常在 15-30% 之间。

数学数据:合成数据的崛起

数学推理数据天然稀缺——互联网上虽然有大量数学内容,但有完整解题过程的数学题相对较少。解决方案是合成数据

  1. 从 MATH、GSM8K 等题库出发
  2. 用更强的模型(如 GPT-4)生成解题过程
  3. 验证答案正确性(数学题有确定性答案,容易自动验证)
  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 团队提出的方法——

  1. 给 GPT-3.5 提供少量种子指令(175 条)
  2. 让模型自行生成更多指令
  3. 让模型为自己生成的指令写回复
  4. 过滤质量差的样本

成本:约 500 美元生成 52,000 条指令数据(2023 年)。

ShareGPT:用户将自己与 ChatGPT 的真实对话分享到 ShareGPT 网站,这些数据被收集整理为训练集。优点是真实反映用户需求分布;缺点是质量参差不齐,且存在版权和隐私问题。

数据来源质量成本规模多样性
人工标注最高极高小(万级)依赖标注设计
Self-Instruct大(十万级)可控
ShareGPT中高极低中(十万级)高(真实需求)
合成数据(强模型生成)可扩展依赖生成策略

数据多样性:覆盖才能泛化

高质量的 SFT 数据集需要在多个维度保持多样性:

  • 任务类型:写作、问答、代码、数学、翻译、摘要、对话……
  • 难度梯度:从简单事实问答到需要多步推理的复杂任务
  • 长度分布:短回复(几句话)到长文档(数千词)
  • 语言覆盖:英文为主,但需要覆盖目标语言
  • 领域覆盖:通用知识、专业领域(医学、法律、金融)

:::tip 如何量化多样性?

一个实用的方法是将所有指令嵌入(embed)到向量空间,计算数据集的平均成对余弦距离

Diversity=1n(n1)ij(1cos(ei,ej))\text{Diversity} = \frac{1}{n(n-1)} \sum_{i \neq j} (1 - \cos(\mathbf{e}_i, \mathbf{e}_j))

值越高说明指令越分散,覆盖越广。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 将复杂度从 O(n2)O(n^2) 降至近似 O(n)O(n)
数据配比代码/数学数据提升推理能力;退火阶段末期提高高质量数据比例
指令数据SFT 以质量为核心;人工标注、Self-Instruct、ShareGPT 各有权衡
质量评估人工评审 + LLM-as-Judge,注意位置偏差和长度偏差

我们已经了解了如何获取和准备训练数据。但训练多少数据才够?参数和数据之间的最优比例是什么?算力预算应该怎么分配?这些问题涉及 LLM 训练的"黄金法则"——下一章,我们将探讨 Scaling Law(规模法则),看看 DeepMind 的 Chinchilla 实验如何颠覆了整个领域对"大模型"的认知。