第 8 课:数据工程

上一课我们算清了"要多少数据"。但数据不是天上掉下来的——从 Common Crawl 的原始网页,到能喂给模型的干净 token,中间要经过采集、去重、过滤、配比、合成、评估六道工序。这一课讲清每一道工序在做什么、代价是什么。

🎯 学完这 6 步你将能够:
① 说清一条数据管线的六道工序,以及每道工序会扔掉多少数据
② 判断"去重"和"质量过滤"各自解决什么问题、代价是什么
③ 解释合成数据为什么会有"模型崩塌"风险,以及什么条件下可以安全使用
🗺 本节推理链(6 步:从"原始网页为什么不能用"到"怎么给语料做体检";其中第 6 步为评估支链)
1要把网页变成可训练的 token,必须先回答"原始抓取数据到底有多少能直接用"——因此要看清 Common Crawl 这类原始语料里混着导航栏、广告、乱码、重复页,否则会误以为"抓下来就能训"。
↓
2既然原始 token 里混着大量重复页,这就要求先做去重——因为重复内容会让模型"背下来"而不是"学会规律",于是要用 MinHash + LSH 这类近似算法在万亿级规模上找近似重复。
↓
3去过重之后仍有一堆"语法没错但没价值"的 token,因此要定义"什么是好数据"——规则过滤(长度/非字母词占比/重复率)负责快速筛掉垃圾,模型过滤(分类器打分)负责挑出真正有信息量的段落,这就要求两条路配合,而不是只用一条。
↓
4干净了还不够,因为不同来源的 token 占比会明显改变模型的能力分布,所以要定"数据配比"——用代理模型(如 DoReMi)自动搜索各领域的采样权重,而不是靠直觉拍脑袋。
↓
5真实 token 快不够用了,于是引入合成数据——但纯合成会导致"模型崩塌"(分布尾部消失),因此必须保证真实数据作为锚点持续累积,而不是被合成数据替换掉。
↓
6【支链 · 评估维度】做完上面五步,这就要求有一套评估闭环——用 perplexity 与下游基准判断这份语料到底有没有变好,于是才能把"数据工程"从手工艺变成可迭代的工程流程。
Data PipelineDeduplicationQuality FilterData MixingSynthetic DataModel Collapse
1
抓下来的原始网页,能不能直接拿来训练?
提示:先想一个真实网页里有什么——正文之外还有导航栏、广告、版权声明、推荐链接。再想这些内容占整页的比例大概是多少。
▾
知识背景
Common Crawl 是最大的公开网页语料库:每轮抓取超过 20 亿个网页,累计存档已超 10 PiB(来源:Common Crawl 官方 About 页 https://www.commoncrawl.org/about);单轮原始体积在数百 TiB 量级(未压缩口径,量级示意)。它提供三种格式:WARC(原始抓取)、WET(抽取后的纯文本)、WAT(元数据)。但 WET 里的文本仍混着导航栏、广告、模板文本与重复页面,需要进一步清洗(引自 Liang et al.,《Data Preparation for Large Language Models》, JCST 2026;文献题名与刊期待人工核实)。

上一课我们算清了"要多少 token"。现在问下一个问题:这些 token 从哪来?

因为最直接的答案是"从网上抓",所以必须先看清:抓下来的原始网页,到底有多少能直接用。可以把这类比成从河里打水——水是免费的,但要喝还得过滤、煮沸、去掉泥沙,真正能入口的比例远小于打上来的量。

🧮 从原始抓取到可用语料:每一道工序扔掉多少
Step 1:Common Crawl 的三种格式
格式内容体积量级能否直接训练
WARC原始 HTTP 响应(含 HTML 标签)最原始、最大不能
WET抽取后的纯文本比 WARC 小一个量级以上仍不能(含模板文本)
WAT元数据(URL、时间、链接)小不用于训练
第一步是正文抽取:从 HTML 里把"主要内容"抠出来。常用工具是 trafilatura、resiliparse、cc_net、datatrove。
Step 2:正文抽取之后还要过哪些筛子
工序典型判据作用
长度过滤少于 50 个词 或 多于 10 万个词 → 丢弃去掉碎片与超长噪声
字母词占比非字母词占比 > 20%(即至少 80% 的词须含字母)→ 丢弃去掉二进制、日志、代码混淆串
重复率过滤n-gram 重复 > 30% → 丢弃去掉刷屏、模板化文本
语种过滤目标语种之外 → 丢弃用 fastText 分类器判断语种
这些是规则过滤——不依赖模型,速度快、成本低,负责把明显的垃圾挡在门外。这些阈值来自 Gopher 等早期大规模语料工作(Rae et al., 2021)并被后续管线广泛沿用:Gopher 系要求"至少 80% 的词含字母(即非字母词占比 > 20% 才丢)",NeMo 的同类过滤器取"非字母数字占比 ≤ 25%"(来源:https://docs.nvidia.com/nemo-framework/user-guide/25.07/datacuration/api/filters.html,Adapted from Gopher)。
Step 3:算一下"存活率"
工序级联相对剩余量(量级示意)说明
原始抓取(HTML)100%含全部标签与元数据
正文抽取后约 10%~20%只剩正文文本
去重后再降至约 50%~70%公开数据集的去重削减率多在 30%~50%(口径差异大)
叠加质量过滤后进一步下降最终可用比例通常远低于一半
光去重就砍掉约 30%~50%(各数据集口径不同:有的是纯去重、有的是全管线);再叠加长度、非字母词占比、重复率、语种等规则过滤,最终存活率通常远低于一半——这就是"抓下来大部分不能用"的量化含义。表中数值为量级示意,用于说明各工序的相对削减量级,不是某一数据集的精确统计。
🎯 关键认知

数据工程的第一性认识是:原始语料的价值密度极低。Common Crawl 单轮未压缩体积达数百 TiB 量级,经过抽取与多轮过滤后剩下的可用 token 只是零头。所以"数据不够用"往往不是抓得少,而是没洗干净——这也是为什么 DCLM 的实验里,数据筛选的差异能让 7B 模型在少用 40% 算力的前提下 MMLU 还高 6.6 个百分点。

AI 助教
👋 对数据管线有疑问?比如"WET 里的模板文本长什么样?""正文抽取算法怎么找到正文?"

我会用具体数字帮你算。
2
为什么训练前要花大力气做去重?
提示:先想同一篇新闻被 100 个网站转载时,这 100 份样本几乎完全一样。再想:训练数据里同一内容反复出现,模型会倾向于"记住"还是"泛化"?
▾
知识背景
业界标准的近似去重方案是 MinHash + LSH(Locality-Sensitive Hashing):先做 shingling(把文档切成 5-gram),再用一组哈希函数得到签名,最后用 LSH 分桶比较 Jaccard 相似度(两集合交集 ÷ 并集,衡量文档重合程度),超过阈值(常见 0.75~0.8,随管线而异)判为重复。哈希函数个数按精度需求设定——公开实现里从 112 个(FineWeb)到约 9000 个(RefinedWeb)不等;RedStone 在跨快照去重时用了 117 个 64 位 MinHash 签名(Chang et al., arXiv:2412.03398)。

上一张卡片我们看到去重会砍掉约 1/3 的数据。直觉上"数据变少了应该更差",但事实相反——为什么?

因为重复数据会让模型把"记住原文"当成"学会规律",所以去掉重复反而提升泛化。可以把这类比成备考:同一道题抄 100 遍,你记住的是这道题的答案;做 100 道不同的题,你学会的是解题方法。

更自然的第一反应是用精确哈希去重(如 MD5 / SHA256),但它只认「一模一样」的字节:转载页往往只改一个标点或加一行页脚,就会被判成两篇不同的文档。而大规模网页抓取里,精确或近似重复的页面可占 30%~50%(统计口径因抓取范围而异),精确哈希基本抓不到后面这一大类——所以必须上近似去重。

🧮 去重账:为什么要用近似算法,以及它能省多少
Step 1:精确去重为什么不够
方法能发现什么发现不了什么
精确哈希(MD5/SHA256)完全相同的文档改了一个标点的同一篇文章
近似去重(MinHash+LSH)相似度 > 阈值的文档语义相同但用词完全不同的改写
转载、镜像站、模板页往往只改少量字符,精确哈希抓不到——必须用近似去重。
Step 2:MinHash 的复杂度账
方法两两比较次数(n 篇文档)复杂度
暴力两两比较n(n−1)/2O(n²):n = 100 亿时 ≈ 5 × 10¹⁹ 次
MinHash + LSH 分桶只比同桶内的文档近似 O(n):规模随 n 线性增长,不再爆炸
这就是 LSH 的价值:把 O(n²) 的两两比较降到近似线性——把相似的文档放进同一个桶,只比桶内。具体吞吐随实现与硬件差异很大,这里只给复杂度的量级差。
Step 3:不照样做会怎样
场景重复率后果
不去重约 30%~50%算力有 1/3 花在重复内容上;模型倾向记忆原文
去重后接近 0同样算力覆盖更多不同内容;下游表现提升
关键在于算力是固定预算:不去重等于把 1/3 的算力浪费在重复样本上。
🎯 关键认知

去重是"用数据量换数据多样性"的交易:砍掉 1/3 的 token,但换来的是同样算力下更广的覆盖。DCLM 的实验显示,数据筛选策略的差异可以让 7B 模型在少用 40% 算力的情况下还高出 6.6 个百分点(对比基线为 MAP-Neo,arXiv:2406.11794)——数据质量不是"锦上添花",而是与算力同等量级的杠杆。

AI 助教
👋 对去重有疑问?比如"阈值取 0.8 是怎么定的?""文档内重复怎么处理?"

我会用具体数字帮你算。
3
怎么判定一段文本是"好数据"?规则和模型各管什么?
提示:先想"语法通顺但毫无信息"的文本长什么样(比如产品页的规格罗列)。规则能筛掉它吗?如果不能,需要什么才能筛掉?
▾
知识背景
质量过滤分两类(CuraWeb 与 DCLM, arXiv:2406.11794;CuraWeb 的编号未能逐字核到一手来源、待人工核实):规则过滤(Rule Filter)用可解释的启发式规则——长度、非字母词占比、停用词占比、重复率,速度快、成本低;模型过滤(Model Filter)用分类器(如 fastText、BERT/RoBERTa 微调模型)给文本打"教育价值"分,能筛掉语法通顺但无信息量的内容。DCLM 的实验结论是:模型过滤是组装高质量训练集的关键。

上一张卡片讲完去重。但去过重之后,语料里还有大量"语法没问题、就是没价值"的文本——比如产品页的参数罗列。怎么把它们筛掉?

因为规则只能识别"形式特征"(太短、符号太多),所以必须再加一层"内容判断"。可以把这类比成招聘:简历初筛看硬性条件(学历、年限)是规则过滤;面试官判断"这人能力如何"是模型过滤——两者缺一不可。

更省成本的做法是只用规则过滤(不跑模型推理),但它只能筛「形式」、筛不出「价值」——产品页规格、SEO 拼凑文都语法通顺,规则一条都不触发;DCLM 的对照实验显示,补上模型过滤后,7B 模型在少用 40% 算力的情况下 MMLU 反而高 6.6 个百分点。

🧮 两类过滤器:各自管什么、成本差多少
Step 1:规则过滤能识别什么
规则阈值(示例)筛掉的典型内容
长度少于 50 个词 或 多于 10 万个词碎片标题、网页日志
字母词占比至少 80% 词含字母(非字母词占比 > 20%)数值表、代码混淆串
n-gram 重复率> 30%模板化文本、刷屏内容
语种识别非目标语种混入的外语文档
规则的特点是可解释、可复算——你能说清一段文本因为哪条规则被删。
Step 2:模型过滤补什么
过滤器训练目标能识别识别不了
fastText 语种分类176 语种分类语种内容质量
质量分类器高分文本 vs 低分文本"像教科书"的段落领域外的专业内容
有害内容分类毒性识别攻击性内容——
模型过滤能识别"价值"这种规则写不出来的维度,代价是要为全量语料跑一遍推理——这是数据管线里最贵的一步。
Step 3:过滤带来的实际收益(DCLM 对照实验)
数据集模型规模训练 tokenMMLU 5-shot训练算力
MAP-Neo(此前开源最佳)7B——基线基线
DCLM-BASELINE7B2.6T+6.6 个百分点少 40%
对照:Mistral-7B-v0.37B——63%——
对照:Llama 3 8B8B——66%比 DCLM 多 6.6 倍
DCLM-BASELINE 训出的 7B 模型在 MMLU 上到 64% ≈ Llama 3 8B 的 66%(差 2 个百分点),但算力只有 Llama 3 8B 的约 1/6.6——差距完全来自数据筛选。(注意区分两个"6.6":本表的 +6.6 个百分点是 MMLU 分数上 vs MAP-Neo;这里的 1/6.6 是训练算力 vs Llama 3 8B,两个对比不同。)
🎯 关键认知

规则过滤管"形式",模型过滤管"价值"。前者便宜但不能判断内容好坏,后者能判断但要为全量语料付一次推理成本。两者是串联关系而不是二选一:先用规则快速砍掉大部分垃圾(省下模型推理的成本),再用模型过滤在剩余部分里精挑——这也是几乎所有主流数据集的共同做法。

AI 助教
👋 对质量过滤有疑问?比如"质量分类器的训练数据从哪来?""过滤太狠会不会丢掉重要数据?"

我会用具体数字帮你算。
4
各领域的数据该按什么比例混合?
提示:先想如果 90% 都是网页文本、只有 1% 是代码,模型会写代码吗?再想这个比例该怎么定,才能既不浪费算力、又不让模型偏科。
▾
知识背景
数据配比(Data Mixing)决定各领域 token 的采样权重,显著影响最终能力。The Pile 的配比是按各领域现有 token 量结合人工判断启发式定的(Gao et al., 2020)。DoReMi(Xie et al., arXiv:2305.10429)提出用 Group DRO(按"表现最差的领域"来动态调整权重的优化方法)训练一个 280M 代理模型来自动搜索配比,再用该配比训练 8B 模型:在 The Pile 上平均 few-shot 准确率提升 6.5 个百分点,且只需 1/2.6 的训练步数就达到基线精度。

上一张卡片把垃圾筛掉了。但剩下的"好数据"来自不同领域——网页、代码、论文、百科。它们该按什么比例混合?

因为配比直接决定模型的能力分布,所以它不能拍脑袋。可以把这类比成配营养餐:蛋白质、碳水、脂肪各占多少,决定了运动员练出什么体质——配方错了,练得再多也补不到该补的地方。

更自然的做法是按语料里各领域现成的 token 量来分配(The Pile 早期就这么做)——但这等于假设「量多就该多用」,并不保证对下游能力最优;DoReMi 只把采样权重换一换,在同一份语料上平均 few-shot 就高了 6.5 个百分点,且用 1/2.6 的步数就追平基线。

🧮 数据配比:三种定法,成本差 30 倍
Step 1:三种确定配比的路线
路线怎么做优点代价
启发式按各领域现有 token 量分配(The Pile 做法)零额外成本可能次优
面向下游任务调在多个下游任务上搜最优权重目标明确可能要训上千个模型;过拟合任务集
代理模型搜索(DoReMi)用小模型自动搜权重,再用到大模型成本低、不依赖下游任务需一次代理模型训练
Step 2:为什么可以用小模型定大模型的配比
项目数值说明
代理模型规模280M 参数用于搜索权重
目标模型规模8B 参数约 30 倍大(280M → 8B)
参数量比约 1/30代理模型参数量仅为目标的约 1/30,实际搜索成本还取决于 token 预算与搜索轮数
关键假设:配比的优劣在小模型上已可分辨。这条假设成立,搜索才划算——参数量比约 1/30,实际搜索成本还取决于 token 预算与搜索轮数。
Step 3:DoReMi 的实际收益
指标基线(The Pile 默认配比)DoReMi 配比变化
平均 few-shot 准确率基线——+6.5 个百分点
达到基线精度所需步数1.0×——1/2.6
是否用到下游任务——不使用可跨任务复用
注意第二行:用 1/2.6 的训练步数就追平基线——换算成算力,相当于省了近 60% 的预训练成本。
🎯 关键认知

数据配比是被低估的算力杠杆:不改模型、不改算力,只调各领域的采样权重,就能让模型少跑 60% 的步数达到同样精度(DoReMi)。而它之所以长期靠直觉,是因为"试错成本高"——代理模型把试错成本压到约 1/30(参数量比),才让自动搜索变得可行。

AI 助教
👋 对数据配比有疑问?比如"如果只想要强代码能力,代码该占多少?""配比会随训练阶段变化吗?"

我会用具体数字帮你算。
5
合成数据能补上数据缺口吗?为什么会有"模型崩塌"?
提示:先想模型生成的数据是从哪个分布里采样出来的——是真实世界的分布,还是它自己学到的近似分布?如果一代代只用自己生成的数据训练,会丢掉什么?
▾
知识背景
模型崩塌(Model Collapse):Shumailov 等在 Nature(2024, 631, 755-759)证明,"不加区分地使用模型生成内容"会让模型出现不可逆缺陷——原始分布的尾部(罕见事件)被逐代抹掉。Seddik 等(arXiv:2404.05090)给出理论结论:纯合成数据必然崩塌;而真实+合成混合时,存在一个合成数据量的上界,低于它可避免崩塌。Gerstgrasser 等(arXiv:2404.01413)进一步指出:关键在于"替换"还是"累积"——累积可防止崩塌,替换则导致崩塌。

上一张卡片讲完配比。但真实数据快用完了(第 7 课的数据墙),于是自然想到:用模型生成数据来补,行不行?

因为模型生成的内容只覆盖它学到的分布,所以一代代只用它训练会让"罕见情况"被逐步抹掉——这就是模型崩塌。可以把这类比成复印件的复印件:每复印一次就丢一点细节,几十代后只剩一团模糊;只有把原件一直留在纸堆里,才不会再模糊。

🧮 模型崩塌账:三种用法,三种结局
Step 1:三种训练方式的结局
方式训练集构成结局(理论结论)
纯合成第 N 代全部用第 N−1 代生成必然崩塌(无法避免)
替换式混合每代用"新合成"替换掉部分真实数据逐步崩塌(真实数据被侵蚀)
累积式混合真实数据不删,合成数据不断追加可避免崩塌
三种方式的差别不在"用不用合成数据",而在真实数据是被留下还是被替换。
Step 2:为什么会丢"尾部"
环节发生了什么后果
第 1 代采样从真实分布里采样,稀有事件本来就少采样样本里尾部已欠代表
第 2 代模型学的是"已欠代表的样本"生成时尾部更少
第 3~4 代偏差逐代累积模型忘记稀有事件存在
三个误差来源会复合:统计近似误差(有限采样)、函数表达能力误差(网络拟合不完美)、学习过程偏差(SGD 等)。
Step 3:合成数据的安全边界
合成占比是否有崩塌风险建议
100%(纯合成)必然崩塌不可用
较高比例 + 真实数据被替换有不可取
合成占少数 + 真实数据累积不删可避免推荐
论文的定量建议是:合成 token 的量应显著小于真实 token;同时保留一撮人类撰写的"种子数据"作为锚点,任何时候都不删。
🎯 关键认知

合成数据不是"能用/不能用"的二元问题,而是用法问题:替换真实数据 → 崩塌;累积而不删真实数据 → 安全。所以工程上的铁律是——永远保留一份人类撰写的真实数据作为锚点,合成数据只做增量。这也再次印证第 7 课的数据墙:数据不够不能靠纯合成绕过去。

AI 助教
👋 对合成数据有疑问?比如"怎么判断合成数据有没有害?""蒸馏算不算合成数据?"

我会用具体数字帮你算。
6
怎么知道一份语料"变好了"?
提示:先想"清洗得干净"能不能当结论——干净但能力没提升的语料有价值吗?那该用什么指标来判断?
▾
知识背景
数据工程的评估闭环有两个层次:语料层指标(规模、去重率、领域分布熵、文本多样性)与模型层指标(用小模型做对照实验,看同一算力下的 perplexity 与下游基准分数)。DCLM(arXiv:2406.11794)正是用"固定模型与算力、只换数据集"的对照实验,才量化出数据筛选带来的 +6.6 个百分点。

上一张卡片讲完合成数据的边界。现在把整条管线收口:怎么知道一份语料真的变好了?

因为"洗得干净"本身不是目标(干净但没提升能力的语料毫无价值),所以必须用模型层的对照实验来判断。可以把这类比成换食材:菜谱不变、厨师不变,只换食材,然后请同一批人盲测——这样才知道变好是不是食材的功劳。

🧮 语料体检:两层指标 + 对照实验设计
Step 1:语料层指标(便宜,先跑)
指标怎么算健康信号
去重率去重前后 token 差 ÷ 去重前约 30%~50%(过低可能没去干净)
领域分布熵各领域占比的香农熵(衡量分布均匀程度)不宜过低(过低=过度集中)
平均文档长度token 总数 ÷ 文档数不宜过短(过短=碎片多)
语料层指标只能发现明显异常,不能证明语料更好——干净不等于有用。
Step 2:模型层指标(贵,但是唯一可信判据)
做法控制变量读数
固定小模型 + 固定算力,只换数据集架构、超参、token 预算全不变验证集 perplexity、下游基准分
DCLM 的实际做法7B 模型、2.6T tokenMMLU 5-shot 提升 6.6 个百分点
关键在只改一个变量:如果同时换了模型和数据集,就分不清收益来自哪里。
Step 3:把代价算清——为什么不直接上大模型测
方案对照成本结论可信度
用 7B 模型测每组语料每次完整预训练(极高)高
用 400M~1B 小模型测约 1/50~1/100(估算)中(趋势可信,绝对值不可外推)
实践中是两级筛选:先用小模型淘汰明显差的方案,只对少数候选做全尺寸验证。
🎯 关键认知

数据工程的闭环判据是"同一算力下模型是否更强",而不是"语料是否更干净"。这条判据决定了数据工程必须与训练实验绑定——没有对照实验,就只是手工艺,不是工程。这也是为什么第二部分把数据工程放在预训练之前:先学会怎么判断数据好坏,才知道预训练该喂什么。

AI 助教
👋 对语料评估有疑问?比如"小模型结论能外推到大模型吗?""perplexity 和下游分数不一致怎么办?"

我会用具体数字帮你算。