第 1 章 第零部分:引言

为什么数据是大模型的灵魂

从 0.1% 脏数据的故事讲起——数据质量如何决定大模型的成败

数据质量 预训练 认知演进 合成数据

“We don’t have better algorithms. We just have more data.” ——Peter Norvig

这句话在大模型时代需要修正:我们不仅需要更多数据,更需要正确的数据。


1.1 一个 0.1% 的故事

让我从一个真实的故事讲起。

2024 年某个深夜,一个大模型训练团队发现他们刚完成的 70B 模型在中文理解任务上出现了诡异的退化。模型在英文 benchmark 上表现正常,但在中文问答中,回复里频繁夹杂着完全无关的日语片段。排查了模型结构、训练超参、显卡状态——一切正常。

问题最终定位在预训练数据的某一批 Common Crawl 快照中。那批数据里有大约 0.1% 的网页是中日混合的垃圾页面——这些页面来自一些自动翻译的低质量网站,HTML 的 lang 属性标记为中文,但实际内容是机器翻译的日文混中文。语言识别器给出了 0.6 的中文置信度,刚好卡在过滤阈值的边缘。

0.1%。在 15 万亿 token 的训练集中,这意味着大约 150 亿 token 的脏数据。这个量级足以让模型在中文和日文的语言边界上建立起错误的关联。修复方案是重新清洗这批数据,将语言识别的置信度阈值从 0.6 提高到 0.7,并增加了一个基于 n-gram 的二次检验步骤。但这意味着需要回溯大约 5000 GPU·小时的训练,代价是数十万美元。

这不是个例。2026 年初发表的一项实证研究(arXiv: 2602.02400)系统性地测量了噪声数据对预训练 loss 的影响。研究者发现,即使是很小比例的受限词汇噪声(restricted vocabulary noise)——比如某种语言的数据被编码错误后形成的乱码——也能显著增加训练 loss 发散的概率。而且这种影响随着模型规模的增大而加剧:小模型可能”吞下”这些噪声后继续训练,但大模型更容易被这些噪声扰动到不稳定状态。

“Garbage in, garbage out” 在大模型时代有了新的含义:你不需要太多垃圾就能毁掉一次训练。

Quality-aware Scaling Laws(ICLR 2026)为此提供了量化理论支撑。传统 Scaling Law 形如 L(N,D)=A/Nα+B/Dβ+EL(N,D) = A/N^\alpha + B/D^\beta + E,仅考虑参数量 NN 和数据量 DD。而 Quality-aware 版本引入数据质量参数 QQ:L(N,D,Q)=A/Nα+B/(D⋅Q)β+EL(N,D,Q) = A/N^\alpha + B/(D \cdot Q)^\beta + E。QQ 的物理含义是数据质量对有效数据量的乘性影响——低质量数据不仅浪费计算,还按 QQ 因子降低有效数据量。这从理论上解释了为什么 FineWeb 等精心清洗的数据集能以更少 token 达到更好效果:QQ 的提升等效于数据量的倍增。

QualityPajama(ICLR 2026)将这一理论推到了工程可操作的精度:在 23 种质量干预 × 2000+ 模型的系统实验中,不同质量数据下最优 token/参数比波动高达 182×——直接解释了 Kaplan vs. Chinchilla 之争很可能源于数据质量差异,而非缩放律本身的错误。仅去重一项即可节省 100-300× 等效算力。详见本书第 5 章(Scaling Laws)的深入讨论。

数据质量 vs 模型规模:一个正在被重塑的认知

长期以来,大模型领域存在一种朴素的信念:模型够大,就能从噪声数据中学到有用的信号。这种信念有其来源——GPT-3 的论文(Brown et al., 2020)展示了 175B 参数的模型在仅做了最小化清洗的数据上就取得了惊人的效果。这给很多人留下了”数据粗糙一点没关系,模型够大就行”的印象。

但这个认知正在被系统性地推翻。

2024 年的多项研究表明,在相同的计算预算下,用更少但更干净的数据训练的模型,一致性地优于用更多但更脏的数据训练的模型。HuggingFace 的 FineWeb 项目是一个标志性的案例:他们通过精心设计的数据管线(从 Common Crawl 出发,经过文本提取、语言过滤、启发式清洗、模糊去重、质量过滤等多个步骤),产出了 15 万亿 token 的高质量英文数据集。用这个数据集训练的模型,在多个 benchmark 上超过了之前用更大但清洗不够彻底的数据集训练的模型。

更有趣的是 2025 年的一篇论文《When Bad Data Leads to Good Models》(arXiv: 2505.04741)从另一个角度审视了”质量”的概念。研究者发现,某些传统认为”低质量”的数据(比如论坛上的口语化讨论、社交媒体上的非正式文本),在特定的下游任务上反而是有价值的。问题不在于数据的”绝对质量”,而在于数据的”适配性”——什么样的数据适合你要训练的模型所面向的目标。

这引出了本书的一个核心观点:

数据质量不是一个固定的属性,而是一个依赖于目标的函数。“好数据”是在给定目标下能最大化模型效用的数据。


1.2 大模型训练的四个数据阶段

一个现代大语言模型的训练,从数据视角来看,可以分为四个泾渭分明的阶段。每个阶段对数据的需求截然不同——不仅数量级不同,质量要求、构造方式、评估标准都不同。

四阶段总览

阶段目标数据量级数据形式核心矛盾
预训练通识教育:学习语言、知识、推理1T~15T+ tokens原始文本(网页、书籍、论文、代码)量够大 vs 质够好
中训练能力强化:长上下文、代码、数学100B~1T tokens领域文本 + 合成数据学新知识 vs 不忘旧知识
SFT行为对齐:学会”怎么说话、怎么做事”10K~10M 条指令-回复对质量 vs 数量 vs 多样性
RL偏好对齐:学会”什么更好”10K~500K 条偏好对 / 奖励信号人类偏好 vs 可验证奖励

让我们用具体的数字感受一下这个量级差异。

预训练阶段:Meta 的 Llama 3(2024)使用了 15.6 万亿 token 进行预训练,相比 Llama 2 的 2 万亿 token 增长了近 8 倍。DeepSeek V3(2024)同样使用了 14.8 万亿 token。这些数据主要来自互联网爬取,经过多步清洗后使用。如果把这些 token 转换成纯文本文件,大约需要 40-60TB 的存储空间。

中训练阶段:数据量降到了百亿到千亿 token。比如 Llama 3.1 在预训练之后,额外用了大量的长文本数据来扩展上下文窗口能力,并用高质量代码和数学数据来增强推理能力。中训练的数据量通常是预训练的 1%-10%,但每条数据的”知识密度”要求高得多。

SFT 阶段:LIMA(2023)用 1000 条精选数据就达到了不错的效果,表明 SFT 阶段的数据量需求远小于预训练。但工业界的实践通常使用几十万到几百万条,以覆盖足够多的任务类型。关键是:SFT 阶段,一条质量差的数据对模型的伤害,可能比预训练阶段的一万条脏数据还大。

RL 阶段:偏好数据的规模更小——几万到几十万条。但这些数据的标注成本最高,因为需要人类标注员对模型的多个输出做比较判断。DeepSeek R1 的一个里程碑式发现是,对于数学和编程这类有明确正确答案的任务,可以用”可验证奖励”(verifiable rewards)替代人类偏好标注,大大降低了数据构造的成本和主观性。

一个关键认知:数据量递减,价值递增

从预训练到 RL,数据量以数量级递减(15T → 500B → 1M → 100K),但单条数据对模型行为的影响力却在递增。一条预训练数据对模型的影响微乎其微,但一条 SFT 数据可以改变模型的回复风格,一条 RL 偏好数据可以改变模型的价值取向。

这意味着,越到后面的阶段,数据工程越需要精细化管理。预训练阶段的数据管理是”大数据”问题——核心挑战是如何从海量数据中高效地筛选和清洗。而 SFT 和 RL 阶段的数据管理更像是”小数据”问题——核心挑战是如何精心设计每一条数据的质量和构成。

四个阶段之间的数据关系

四个阶段并不是孤立的。它们之间存在深刻的相互影响:

  • 预训练数据的质量决定了 SFT 的上限。如果预训练数据中缺乏某类知识(比如最新的科学发现),SFT 阶段无论怎么精心构造指令,模型都不可能在这个领域表现好。SFT 能做的是”激活”和”塑形”,不能”凭空创造”。

  • 中训练可以弥补预训练的不足。如果你的预训练数据中代码比例不够,可以在中训练阶段用高质量代码数据来补强。但中训练有一个核心风险——灾难性遗忘。注入新知识的同时可能丢失旧知识。

  • RL 数据的分布要和 SFT 后的模型匹配。如果 RL 阶段的偏好数据是基于旧版模型生成的(off-policy 数据),效果往往不如基于当前模型生成的(on-policy 数据)。这意味着 RL 数据需要持续更新。

理解这四个阶段的数据关系,是做好大模型数据工程的前提。本书的核心组织结构就是按这四个阶段展开,每个部分都会深入到具体的工程细节。


1.3 数据工程的三个层次

无论处于哪个训练阶段,数据工程都可以抽象为三个层次的工作。理解这三个层次有助于你在面对具体问题时,快速定位问题所在的层面。

第一层:采集层——从哪里获取数据?

这是最基础的问题。不同阶段的数据来源差异巨大:

  • 预训练数据:主要来自互联网爬取(Common Crawl 是最大的公共来源),辅以高质量语料(维基百科、书籍、学术论文、代码仓库)。采集层面临的核心问题是覆盖度和合规性——如何获取足够多样的数据,同时遵守版权和隐私法规。

  • 中训练数据:在预训练数据的基础上,重点收集特定领域的高质量数据。比如要增强代码能力,就需要大量高质量的开源代码仓库;要增强长上下文能力,就需要长文档(书籍、法律文本、学术论文)。采集层的核心问题是领域覆盖和知识密度。

  • SFT 数据:来源更加多元——人工标注、模型合成(Self-Instruct、Evol-Instruct)、从已有对话数据中提炼。采集层的核心问题是任务覆盖度和标注成本。

  • RL 数据:主要来自人类偏好标注或自动评估。DeepSeek R1 之后的一个重要趋势是使用可验证奖励(verifiable rewards),这改变了 RL 数据的采集方式——不再需要人类一一比较,而是通过执行验证(代码运行测试用例、数学答案校验)来自动获得奖励信号。

第二层:处理层——如何清洗、过滤、转化?

这是数据工程的”重体力劳动”,也是细节最密集、坑最多的部分。

  • 文本提取:把 HTML 变成干净的纯文本。听起来简单,但不同提取工具(trafilatura、Resiliparse、jusText)在同一个网页上的输出可以差异巨大。导航栏、侧边栏、广告、Cookie 弹窗、JavaScript 渲染内容——每一个都是陷阱。

  • 语言识别:判断一段文本是什么语言。对英文、中文、日文等主流语言来说准确率不错,但对混合语言文本(比如学术论文中的中英混合、代码注释中的多语言)和低资源语言就困难得多。

  • 清洗与过滤:去除噪声数据。包括启发式规则(行级过滤、文档级过滤)和基于模型的过滤(质量分类器、困惑度过滤)。这里的核心两难是:过滤太松,脏数据太多;过滤太严,好数据也被误杀。FineWeb 的研究显示,C4 数据集(GPT-3 的训练数据之一)的一些过滤规则实际上误杀了大量有价值的数据。

  • 去重:消除重复或近似重复的内容。精确去重(hash-based)和模糊去重(MinHash+LSH)各有适用场景。大规模去重(万亿 token 级别)是一个严肃的工程挑战。

  • PII 处理:检测和处理个人身份信息(邮箱、电话、身份证号等),这是合规要求。

第三层:策略层——怎么配比、怎么排课、怎么评估?

这是最体现”工程判断力”的层面,也是最容易被忽视的。

  • 数据配比:预训练阶段,网页文本、书籍、学术论文、代码、数学数据各占多少比例?不同配比可以导致模型在不同能力上的表现差异达到 10% 以上。Llama 3 大幅提升了代码数据的比例,结果不仅代码能力提升了,推理能力也跟着上来了——这个”跨领域溢出效应”是一个重要发现。

  • 课程学习(Curriculum Learning):数据的排列顺序是否重要?先让模型学简单的再学难的,还是反过来?还是随机打乱最好?目前的研究结论并不一致,但在某些场景下,精心设计的课程确实能带来收益。

  • 数据评估:如何知道你的数据好不好?训练 loss 下降并不等于数据质量好——loss 下降可能只是因为数据有规律性(重复内容)。需要设计消融实验(data ablation),用小模型快速验证数据策略的有效性,再扩展到大模型。

三个层次之间是递进关系:采集层解决”有没有”,处理层解决”干不干净”,策略层解决”用得好不好”。很多团队在采集和处理层投入了大量精力,但在策略层的思考不够。本书的一个重要目标,就是帮助读者在策略层建立系统的思维框架。

自动化策展前沿:从手动策略到进化优化

策略层的最新前沿是将数据策展策略设计本身自动化——让 AI 自动迭代优化清洗策略,而非依赖工程师手动调参。

DataEvolve(arXiv:2603.14420,Data Darwinism Part II)将数据策展策略设计转化为进化优化问题:四模块闭环——数据观察员(识别质量问题)→ 策略设计师(生成候选策略)→ 数据清洗器(小批量执行)→ 质量评判员(打分反馈)。关键设计在于用样本级质量评分替代完整模型训练来近似策略效果,将验证成本从”数千 GPU 小时”压缩到”几十个样本打分”。其产出 Darwin-CC(504B tokens)在 3B 模型 500B token 训练中,18 基准平均 44.13 分,超原始数据 +3.96 分,超 DCLM(42.42)、Ultra-FineWeb(36.29)、FineWeb-Edu(36.52),其中 MMLU +18.64、MedQA +13.48。

有意思的是,进化策略最终收敛于以清洗为主的方法(目标噪声去除 + 领域感知保留),与 Data Darwinism Part I 的 L4 原则呼应——最优策略与次优策略差距 2.93 分,证明迭代进化本身是核心价值而非装饰。这为”数据质量为何重要”提供了自动化视角的验证:只有质量足够高的数据才值得保留,进化优化恰好收敛于清洗策略。

多属性文档标注——超越单分数质量分类器。FineWeb-Edu 引领的”单分数质量分类器”范式(Llama-3-70B 打 0-5 分 → 训练小分类器)已成为主流,但单个标量把多个质量维度混为一谈,无法灵活过滤也无解释性。propella-1(arXiv:2602.12414, 2026-02)提出多属性标注新范式:0.6B/1.7B/4B 多语言小模型沿 18 个属性、6 个类别(核心内容、分类、质量与价值、受众与目的、安全与合规、地理相关性)生成结构化 JSON 标注,支持 57 种语言。已发布 propella-annotations 覆盖 FineWeb-2、FinePDFs、HPLT 3.0、Nemotron-CC 等 30 亿+ 文档的多维标注。多属性方法让”质量是目标依赖的函数”这一观点可量化落地——下游可以根据自己的目标灵活选择属性子集。

与 DataEvolve 的关系:DataEvolve 优化”策展策略”(如何过滤),propella-1 优化”标注维度”(如何度量)。两者互补,共同构成 Gen3 数据工程的工具箱。


1.4 认知演进的时间线

大模型数据工程不是一个静态的领域。在短短几年间,业界对数据的认知经历了多次深刻的转变。理解这些转变,是避免重复前人错误的最好方式。

2020:GPT-3 时代——“数据越多越好”

GPT-3 使用了约 300B token 的混合数据集,包括 Common Crawl(经过基本过滤后约 410B token,在训练中被采样使用)、WebText2、Books1&2、Wikipedia。数据处理相对粗糙——主要是基于 URL 的去重和简单的启发式过滤。

这个时期的核心认知是:规模是第一优先级。数据清洗虽然重要,但只要做到”差不多”就行。Kaplan et al.(2020)的 scaling law 研究更强化了这个认知:模型性能主要取决于模型参数量和训练数据量,数据质量的影响被隐式地忽略了。

2022:Chinchilla——“数据和参数要匹配”

Hoffmann et al.(2022)的 Chinchilla 论文是一个转折点。他们发现,在给定的计算预算下,GPT-3 这样的大模型其实是”欠训练”的——参数太多,数据太少。Chinchilla 法则建议,参数量和训练 token 数应该大致按 1:20 的比例匹配(即 1B 参数需要约 20B token)。

这篇论文的影响是深远的:它让业界意识到,盲目加大模型不是最优策略,还需要确保有足够的训练数据来”喂饱”模型。但后续的实践表明,Chinchilla 法则的系数估计可能有误差——Epoch AI 在 2024 年的复现研究指出,最优的 token-to-parameter 比例可能接近 1:26 而非 1:20。

更重要的是,工业界很快发现了”过度训练”(overtraining)的价值:即使超过了 Chinchilla 最优点继续训练,推理成本的节省(用更小的模型达到相近的性能)往往值得额外的训练计算开支。Llama 3 的 8B 模型使用了 15T token,token-to-parameter 比例高达 1:1875——远超 Chinchilla 建议的 1:20。这意味着:在实际部署中,最优的训练策略不是”计算最优”,而是”推理最优”。

这个转变对数据工程的启示是:我们需要的数据量可能比 Chinchilla 预测的要大得多。数据的获取和质量控制变得更加关键。

2023:LIMA / Phi——“质量远重要于数量”

2023 年出现了两个看似相反但实际互补的发现。

LIMA(Less Is More for Alignment, Zhou et al., 2023)用仅仅 1000 条精心挑选的指令-回复对进行 SFT,就训练出了表现不俗的模型。这提出了”表面对齐假说”(Superficial Alignment Hypothesis):SFT 阶段需要的信息量远比想象的少,它主要是激活预训练已经学到的知识,并赋予模型合适的输出格式。

Phi-1 / Phi-1.5 / Phi-2(Microsoft,2023)则证明了另一个方向:用极高质量的合成数据(“教科书质量”)训练的小模型,可以在特定任务上打败大得多的模型。Phi-1 只有 1.3B 参数,但在代码生成上超过了很多 10B+ 的模型。

这两个发现的共同启示是:数据质量对模型效果的影响可能被严重低估了。不是所有 token 都平等——一个 token 的”教学价值”可以有数量级的差异。

2024:FineWeb / DCLM——“系统化的数据策略是可复现的科学”

2024 年是大模型数据工程走向科学化的关键一年。

FineWeb(HuggingFace,2024)不仅发布了一个高质量数据集,更重要的是公开了完整的数据管线和详细的消融实验。他们系统性地测试了每一个处理步骤的贡献:

  • 文本提取工具的选择(trafilatura vs resiliparse)——差异可以达到 2-3 个 benchmark 点
  • 去重策略(MinHash 参数选择)——过度去重反而降低了性能
  • 质量过滤策略(教育价值分类器 vs 通用质量分类器)——教育价值分类器带来了显著提升
  • “过度过滤”的代价:他们发现 C4 数据集的一些过滤规则(比如”含有坏词的句子整条删除”)误杀了大量优质内容

DCLM(DataComp for Language Models,Li et al., 2024)则把数据策略的比较做成了一个标准化的竞赛框架:固定模型结构和训练配置,只改变数据,比较不同数据策略的效果。这使得数据工程第一次有了”可控变量实验”的范式。

这一年的核心认知转变是:数据工程不再是”黑魔法”,而是可以系统化、可复现、可优化的工程科学。

2025-2026:合成数据 + 可验证奖励 + 精细化数据管理

进入 2025-2026 年,数据工程的认知继续快速演化:

合成数据从争议走向成熟。早期人们担心合成数据会导致”模型坍缩”(model collapse)——用模型生成的数据训练模型,会导致分布逐渐退化。Nature 上的一篇论文(Shumailov et al., 2024)给出了理论上的警告。但实践表明,混合使用真实数据和合成数据(通常合成数据比例不超过 30%)是安全且有效的。关键在于质量控制和多样性保证。

HuggingFace 等机构 2026 年的系统性研究(arXiv: 2604.13977,FinePhrase 数据集)提供了更精确的量化指导:prompt 设计对合成数据质量的影响(~40%)甚至超过了生成器模型规模的影响(~30%)。这意味着精心设计的提示模板比简单地使用更大的模型更有效。

合成数据缩放律提供了更高层面的量化认知。SynthLLM(Microsoft Research, Zeyu Qin et al., COLM 2025, 发表于 2025-07)通过可扩展框架将预训练语料转化为高质量合成数据集,首次系统性地测量了合成数据的缩略律:(1) 合成数据遵循可修正的缩放律(rectified scaling law),跨模型规模一致;(2) 收益在 ~300B tokens 处开始递减;(3) 大模型在更少训练 token 下接近最优——8B 模型在 1T tokens 达峰,而 3B 模型需要 4T;(4) SynthLLM 优于现有合成数据生成和增强方法。这与 InfoLaw(字节跳动,arXiv:2605.02364,2026-05)将重复建模为指数衰减项的理论框架相互呼应——“合成数据比例不超过 30%” 不是一个魔法数字,而是信息密度差导致的边际递减可被精确计算的结果。

同时,He et al. (2026) 在医疗领域进行了迄今最大规模的合成数据实验(80 万+ 合成数据点),揭示了两代训练后模型退化的具体机制:关键病理特征被”平均化”、人口统计特征偏向中年男性(多样性丢失)、最严重的是——虚假安抚率(false reassurance rate)从基线约 13% 激增至 40%。仅经过两代训练,AI 文档即在临床上完全失去可用性。这是对”两代训练即可导致模型退化”最有力的量化实证。

合成数据不仅是”生成什么内容”,“如何组织这些内容”同样关键。Book-Level Organization(arXiv:2607.28109, Jiawen Tao et al., 2026-07-30)在中训练场景下证明,将相关内容组织为连贯的”书级文档”(含目录规划、章节组装)相比将同内容拆为独立文档,额外带来 +1.02 平均增益。在此基础上,单独改写文档的 Rephrase 基线再对比进一步获得 +1.17 增益——证明”结构化合成”的价值不仅在于内容改写,更在于知识的系统化组织。这对中训练数据的”结构化合成”提供了工程指导:686K 合成教科书、32B tokens、15,000+ 学科覆盖,检索池匹配 + 书级重组。

中文合成数据规模突破(2026-05-31)。面壁智能联合清华、OpenBMB 发布 UltraData 系列:Ultra-FineWeb-L3(600B tokens 总量,中文 200B+)是当前全球最大中文预训练合成数据,UltraData-SFT-2605 是国内首个千万级”深思考/非思考”全覆盖 SFT 数据集。配套的 L0-L4 数据分级治理体系(按知识密度分 5 级,每级对应不同的去重/过滤/合成策略)标志着中文数据工程从”通用流水线”走向”分级精细化”。Ultra-FineWeb-L3 已被 MiniCPM5-1B 训练全链路验证。

DeepSeek R1(2025)的出现改变了 RL 数据的范式。他们证明了在数学和编程领域,可以用可验证奖励(验证答案是否正确、代码是否通过测试用例)完全替代人类偏好标注,并且训练出了强大的推理能力。这意味着:对于有明确正确性标准的任务,RL 数据的构造从”主观偏好”转向了”客观验证”。

数据管理的精细化成为新趋势。2026 年 3 月发表的综述论文《Towards Next-Generation LLM Training: A Data Perspective》(arXiv: 2603.14712)系统性地总结了数据工程的最新实践,标志着这个领域正在从经验驱动转向体系化。


1.5 本书的定位与阅读路线

这本书不是什么

  • 这不是一本”大模型入门”书。我们假设你已经了解 Transformer 架构、自注意力机制、基本的训练流程。
  • 这不是一本”算法书”。我们不会花大量篇幅推导损失函数或训练算法。需要时会简要介绍,但重点始终是数据。
  • 这不是一本”工具手册”。虽然会介绍具体的工具和代码,但核心目的是传递思维方式和判断力,而非”按步骤操作”。

这本书是什么

这是第一本系统、深入、专注于大模型数据工程的专业书籍。我们的目标是:

  1. 建立系统认知:让你对大模型训练的全部四个数据阶段有完整的理解框架
  2. 传递实践细节:那些论文里一笔带过、但实际工作中极其重要的细节——阈值怎么选、边界情况怎么处理、哪些做法看起来合理但实际有坑
  3. 呈现认知演进:每个主题都会讲”业界的认知是怎么变化的”,帮助你理解当前实践背后的来龙去脉,避免重蹈覆辙
  4. 培养数据直觉:好的数据工程师能在看到一条数据时”感觉到”它有问题。这种直觉来自大量的案例积累和深入的理解

阅读路线

本书的六个部分可以按需阅读:

如果你是预训练数据工程师:第 1 部分(第 2-7 章)是你的核心参考,建议通读。第 5 部分的合成数据和工具链章节也很相关。

如果你负责中训练:先读第 1 章(总论),然后直接进入第 2 部分(第 8-10 章)。你可能还需要回头参考第 1 部分的清洗和去重方法。

如果你负责 SFT / 后训练:第 3 部分(第 11-13 章)和第 4 部分(第 14-16 章)是重点。第 18 章(标注方法论)也是必读。

如果你是技术负责人:第 1 章(本章)给你全景认知,第 6 章(数据配比)帮你理解关键决策,第 21 章(端到端案例)给你实操参考。

如果你想从头到尾读:那就按章节顺序来。我们精心设计了各章之间的衔接,后面的章节会自然地引用前面的概念。

全书的特色设计

为了让阅读更有效,我们设计了几个贯穿全书的特色元素:

🔄 认知演变:每章都有一个”认知演变”专栏,用时间线形式展示业界对该主题的认知是如何变化的。知道”为什么变”比知道”现在怎么做”更有价值。

🔬 显微镜案例:每章包含 1-2 个深度案例分析,把某个具体的细节”放大”来讲。比如:某一条脏数据是怎么逃过过滤的?某一次配比调整背后的决策过程是什么?

💡 反直觉发现:专门收集和突出那些与直觉相反的研究发现。这些发现往往是最有价值的——它们提醒我们,数据工程中想当然是危险的。

🛠 动手环节:每章末尾提供可运行的代码练习。数据工程是一门实践学科,亲手处理一小批数据比读十页论文更有效。


1.6 写在四个阶段之前

在进入具体的技术章节之前,我想分享一个观点。

大模型的训练数据,在本质上是对人类知识和人类偏好的一种数字化压缩。预训练数据是对人类集体知识的压缩,SFT 数据是对人类期望行为的压缩,RL 数据是对人类价值判断的压缩。数据工程师做的事情,本质上是在决定:模型应该看到人类世界的哪些面?以什么比例?以什么顺序?

这意味着数据工程不仅仅是一个技术问题,它还涉及深层的判断:什么知识更重要?什么行为更合适?什么价值更优先?这些判断会通过数据传递给模型,再通过模型影响数以亿计的用户。

所以,做好数据工程不仅需要技术能力,还需要对”好”与”坏”的深思熟虑。我希望本书不仅帮助你成为一个更好的数据工程师,也帮助你成为一个更审慎的数据决策者。

现在,让我们从预训练数据开始,深入到细节中去。

动手环节:感受数据质量的蝴蝶效应

目标:通过一个可量化的实验,直观感受脏数据比例对模型行为的影响。

练习 1:构造”受污染”数据集

用 Python 模拟一个简单的数据污染实验。我们会在一个干净的中文语料中注入不同比例的噪声,然后观察语言模型困惑度(perplexity)的变化。

"""
数据污染敏感性实验
目标:验证 0.1%、1%、5% 的脏数据对 n-gram 语言模型困惑度的影响
"""

import random
import math
from collections import Counter, defaultdict

def create_clean_corpus(n_docs: int = 1000) -> list:
    """模拟干净的中文语料(用主题句模板生成)"""
    topics = [
        "机器学习是一种从数据中自动学习规律的技术方法",
        "深度学习使用多层神经网络来提取数据的层次化特征",
        "自然语言处理旨在让计算机理解和生成人类语言",
        "数据预处理是机器学习流水线中最关键的步骤之一",
        "模型评估需要在独立的测试集上进行以避免过拟合",
    ]
    corpus = []
    for _ in range(n_docs):
        doc = random.choice(topics) + "。" + random.choice(topics) + "。"
        corpus.append(doc)
    return corpus

def inject_noise(corpus: list, noise_ratio: float) -> list:
    """注入指定比例的噪声文档"""
    n_noise = int(len(corpus) * noise_ratio)
    noise_docs = [
        "asdfgh 乱码 #$%^ qwerty !@#$" * 3,
        "クリック ここ 下載 무료 ダウンロード click here",
        "买买买 加微信 免费领取 扫码关注 限时优惠 点击这里",
    ]
    noisy_corpus = corpus.copy()
    for i in random.sample(range(len(noisy_corpus)), n_noise):
        noisy_corpus[i] = random.choice(noise_docs)
    return noisy_corpus

def compute_bigram_ppl(corpus: list) -> float:
    """计算 bigram 语言模型的平均困惑度"""
    # 统计 bigram 频率
    bigram_counts = Counter()
    unigram_counts = Counter()
    for doc in corpus[:800]:  # 前 800 条做训练
        chars = list(doc)
        for c in chars:
            unigram_counts[c] += 1
        for i in range(len(chars) - 1):
            bigram_counts[(chars[i], chars[i+1])] += 1

    # 在剩余数据上计算困惑度
    total_log_prob = 0
    total_tokens = 0
    vocab_size = len(unigram_counts)
    for doc in corpus[800:]:  # 后 200 条做评估
        chars = list(doc)
        for i in range(len(chars) - 1):
            bg = (chars[i], chars[i+1])
            # 加一平滑
            prob = (bigram_counts[bg] + 1) / (unigram_counts[chars[i]] + vocab_size)
            total_log_prob += math.log2(prob)
            total_tokens += 1

    avg_log_prob = total_log_prob / max(total_tokens, 1)
    return 2 ** (-avg_log_prob)

# 实验
clean = create_clean_corpus(1000)
print("噪声比例 → 困惑度")
print("-" * 30)
for ratio in [0.0, 0.001, 0.01, 0.05, 0.10]:
    noisy = inject_noise(clean, ratio)
    ppl = compute_bigram_ppl(noisy)
    print(f"  {ratio*100:5.1f}%  →  PPL = {ppl:.1f}")

练习 2:四阶段数据量级可视化

将本章介绍的四个训练阶段的数据特征可视化,建立直观感受。

"""
四阶段数据量级对比可视化
"""

stages = {
    "预训练":   {"tokens": 15e12, "单条影响": 0.001, "单条成本": 0.00001},
    "中训练":   {"tokens": 500e9, "单条影响": 0.01,  "单条成本": 0.0001},
    "SFT":      {"tokens": 1e6,   "单条影响": 1.0,   "单条成本": 0.1},
    "RL":       {"tokens": 1e5,   "单条影响": 10.0,  "单条成本": 1.0},
}

print(f"{'阶段':<8} {'数据量':>15} {'单条影响力':>10} {'单条成本':>10}")
print("-" * 50)
for stage, info in stages.items():
    tokens = info["tokens"]
    if tokens >= 1e12:
        amount = f"{tokens/1e12:.1f}T tokens"
    elif tokens >= 1e9:
        amount = f"{tokens/1e9:.0f}B tokens"
    elif tokens >= 1e6:
        amount = f"{tokens/1e6:.0f}M 条"
    else:
        amount = f"{tokens/1e3:.0f}K 条"
    print(f"{stage:<8} {amount:>15} {info['单条影响']:>10.3f} {info['单条成本']:>10.5f}")

# 思考题:为什么单条数据的影响力和数据量呈反比?
# 提示:回顾本章 1.2 节关于"数据量递减,价值递增"的讨论。

练习 3:设计你自己的数据质量评估维度

结合本章 1.3 节的三层模型,为一个假想的 7B 中文通用模型项目,设计一份数据质量评估表。需要涵盖:

  • 采集层:数据来源、覆盖度、合规性
  • 处理层:清洗步骤、过滤标准、PII 处理
  • 策略层:配比方案、课程策略、评估指标

尝试为每个维度设定一个量化的”合格线”(如:语言识别置信度 ≥ 0.65)。这个练习没有标准答案,但会帮助你建立系统思维。

练习 4:设计合成数据质量评估实验

结合本章关于合成数据的讨论和 HuggingFace 的系统性研究(arXiv: 2604.13977),设计一个合成数据质量评估实验:

"""
合成数据质量评估实验设计
参考 arXiv: 2604.13977 的系统性研究框架
"""

# 实验设计:
# 1. 变量:prompt 模板设计(结构化 vs 非结构化)
#              生成器模型规模(1B vs 7B vs 72B)
#              源数据质量(高 vs 中 vs 低)
# 2. 评估指标:困惑度、多样性、下游任务表现
# 3. 预期产出:确定关键影响因子排序

experiment_design = {
    "研究问题": "影响合成预训练数据质量的关键因子是什么?",
    "三个自变量": [
        "Prompt 设计:结构化格式 vs 自然语言",
        "生成器模型:1B / 7B / 72B",
        "源数据质量:高(arXiv)/ 中(新闻)/ 低(论坛)"
    ],
    "关键发现预测": [
        "Prompt 设计影响 ~40%(最重要)",
        "生成器模型影响 ~30%",
        "源数据质量影响 ~20%",
        "最优配比:真实数据 70% + 合成数据 30%(按质量调整)"
    ]
}

# 思考题:为什么 prompt 设计的影响可能超过模型规模?
# 提示:考虑模型学习的是分布模式还是表面特征。