- 引言 — 决定模型八成品质的地方
- 全流水线鸟瞰图
- ① 正文抽取 — 从 HTML 中只留下真正的文字
- ② 语言识别 — 又快又安静的关卡
- ③ 质量过滤 — 从启发式规则到分类器
- ④ 去重 — 性价比最容易被低估的一步
- ⑤·⑥ PII·毒性处理,以及污染清除
- ⑦ 分词与序列打包 — 最后一道工序
- SFT 数据不一样 — 少而精的世界
- 工具箱 — 不必事事自己造
- 改变风向的论文 — 推荐阅读顺序
- 结语
- 参考资料
引言 — 决定模型八成品质的地方
在AI 模型开发生命周期一文中,我写过"垃圾 1TB 不如好数据 1GB"。本文正是这句话的实战篇 — 我们要走一遍互联网原始文本变成可训练 token 实际经过的工序,同时看每个阶段用到的工具,以及确立了该阶段做法的论文。近几年一个有趣的发现是,前沿实验室之间的差距,与其说来自模型架构,不如说正是在这条流水线上拉开的(FineWeb、DCLM 论文用公开数据证明了这一点)。
全流水线鸟瞰图
采集(CommonCrawl 等)
→ ① 正文抽取 (HTML → 文本)
→ ② 语言识别
→ ③ 质量过滤 (启发式 → 模型分类器)
→ ④ 去重 (精确 → 近似 MinHash)
→ ⑤ PII·毒性处理
→ ⑥ 基准测试污染清除 (decontamination)
→ ⑦ 分词 + 序列打包
→ 训练
顺序也是有讲究的 — 把便宜的过滤器放在前面,把昂贵的过滤器放在后面,这样代价高的运算(分类器、MinHash)要处理的文档数就会更少。下面来看每个阶段。
① 正文抽取 — 从 HTML 中只留下真正的文字
预训练数据的来源,绝大多数是 CommonCrawl(对整个网络做周期性抓取的存档)。这里出现了第一个分岔口:是用预先抽取好的 WET 文本,还是从原始 WARC(HTML)直接抽取?RefinedWeb 与 FineWeb 的共同结论是,从 WARC 里用 trafilatura 之类的抽取器直接抽取,品质明显更好 — 因为 WET 里混杂了大量导航菜单、Cookie 横幅、页脚之类的样板内容(boilerplate)。正文抽取的质量,决定了之后所有阶段的上限。
② 语言识别 — 又快又安静的关卡
用 fastText 系的语言分类器判断文档语言,只保留目标语言(比如做韩语数据集就只留 ko)。看起来简单,但陷阱不少 — 短文档、代码与文本混杂的文档容易被误判,而且语言的资源越稀缺,这道关卡就会连带扔掉越多好数据。如果要做多语言模型,按语言分别调阈值才是正解。
③ 质量过滤 — 从启发式规则到分类器
这里叠用了两代技术。
启发式规则(Gopher rules 一系) — 文档长度、平均词长、符号/词比例、项目符号与话题标签的比例、是否含有"lorem ipsum"之类的几十条统计规则,用来筛掉明显的垃圾。Gopher 论文确立了这套规则,几乎所有流水线都在用它的变体。
基于模型的分类器 — 这是近年真正的胜负手。FineWeb-Edu 让 LLM 给每篇文档的"教育价值"打分,再用这些标签训练一个小分类器,挑出高质量子集;DCLM 则证明了,一个用好数据(instruct 风格)训练出来的 fastText 分类器,就能打赢精心组合的复杂流水线。教训是:把"质量"的定义从数据本身,转移到用来训练分类器的标准上,流水线会变简单,效果反而更好。
这里有一点要留意 — 过滤器总是会让分布产生偏斜。教育价值过滤器会削掉口语体、少数方言、创作类文本。养成亲眼去看被扔掉的样本长什么样的习惯,是调过滤器工作的一半。
④ 去重 — 性价比最容易被低估的一步
网络抓取里相当一部分是重复内容(镜像站点、样板内容、转载)。重复内容在训练中相当于把某些文本反复跑了好几个 epoch,会放大记忆化和基准测试污染,还浪费算力。
- 精确去重:用文档(或段落)哈希去掉完全相同的内容。便宜,可靠。
- 近似去重 — MinHash LSH:抓住"几乎相同"文档的标准手法。把文档变成 n-gram 集合(shingle),用 MinHash 签名近似 Jaccard 相似度,再用 LSH 分桶把要比较的候选对缩小到很小的范围 — 这正是它能在数十亿文档规模下不做全量两两比较也能跑起来的原因。
- 行级去重:去掉在多篇文档中重复出现的行(导航文本之类)。RefinedWeb 强调过的手法。
还有一个有意思的反转 — FineWeb 报告说,对每个抓取快照分别去重,比横跨整个快照做激进去重效果更好。可见去重也不是"越多越好",而是要一边测量一边调节的对象。
⑤·⑥ PII·毒性处理,以及污染清除
PII 处理:邮箱、电话号码、IP 之类的模式,用正则表达式检测后删除或替换成占位符(Dolma 工具包是这一步很好的公开实现)。法务审查不是奢侈品这件事,和我在模型开发篇里说的一样。
基准测试污染清除(decontamination):如果评测集(MMLU、GSM8K 等)的题目混进了训练数据,基准分数就会在没有真实能力提升的情况下上涨。标准做法是去掉与评测集 n-gram 重叠的训练文档,量化篇里说过的"看到新模型分数时该有的怀疑",指向的正是这一步的缺失。如果自己做了评测集,也要把它加进污染清除名单里 — 这是 eval-first 原则在数据侧的体现。
⑦ 分词与序列打包 — 最后一道工序
整理好的文档经分词器(BPE 一系)变成 token ID,再切成定长序列送进训练器。这里有两个实务要点:
- 序列打包:文档比序列长度短时,padding 就是浪费。用 EOS token 把多篇文档接起来填满序列的打包(packing)是标准做法,越来越多实现会配合使用阻止注意力跨越文档边界的掩码。
- 打乱与混合比例:按域(网页/代码/论文/多语言)分配的混合比例本身就是一个超参数。在训练后期提高高质量数据占比的课程学习(annealing),也是 FineWeb 系实验中报告过效果的手法。
SFT 数据不一样 — 少而精的世界
微调(SFT)数据和预训练遵循不同的语法。这是一个几千到几万条量级的世界,所以逐条的质量就是一切。
- 由人工(或先用强模型做第一轮)检验回答的准确性与格式一致性,
- 确保指令的多样性(一千种不同的模式,胜过一万条相同的模式),
- 让聊天模板(角色标记)在训练与推理时精确一致 — 模板不一致是静默性能下降的常见元凶,
- 和预训练一样做去重、污染清除(尤其是基准测试题目混进 SFT 集这种事故很常见)。
工具箱 — 不必事事自己造
工具 开发方 一句话介绍
────────────────── ──────────── ─────────────────────────────────
datatrove HuggingFace 打造出 FineWeb 的流水线库
Dolma toolkit AI2 过滤·dedup·PII 标注工具集合 (Dolma 数据集的工序)
NeMo Curator NVIDIA GPU 加速的大规模数据整理 (分布式 MinHash 等)
trafilatura 开源 HTML 正文抽取事实上的标准
fastText Meta 语言识别·轻量级质量分类器
数百 GB 规模以内,datatrove 或 Dolma 工具包就够用;到了需要 TB 级 GPU 加速的时候,NeMo Curator 就会成为候选。把流水线跑在分布式训练集群之上,也是常见的组合。
改变风向的论文 — 推荐阅读顺序
- The Pile (2020) — "多种高质量来源混合"这一公开数据集范式的原型。
- Gopher/MassiveText (2021) — 确立了启发式质量规则。
- RefinedWeb (2023) — "光靠网页数据,只要精心整理就够了"这一反转,加上对抽取与行级 dedup 的强调。
- Dolma (2024) — 完整公开了 3 万亿 token 的工序 — 连工具包一起公开。
- FineWeb / FineWeb-Edu (2024) — 公开了 15 万亿 token 与逐阶段消融(ablation)实验,展现了教育价值分类器的威力。
- DCLM (2024) — 把数据整理本身变成了基准测试 — 一个好分类器的力量。
按顺序读完这六篇,就能把"为什么现在的标准流水线长这个样子"当作一段历史来理解。
结语
数据预处理并不光鲜,但这道工序的每一步,都在为模型的上限逐一定基调 — 抽取决定原料的纯度,过滤决定分布,去重决定记忆化程度,污染清除决定评测的诚实度,打包决定计算效率。贯穿所有阶段的习惯只有一个:持续亲眼去看被扔掉的和留下来的样本。 流水线是代码,但品质的判断力终究属于人。
参考资料
- Gao et al. (2020), "The Pile: An 800GB Dataset of Diverse Text"
- Rae et al. (2021), "Scaling Language Models: Gopher" (MassiveText 规则)
- Penedo et al. (2023), "The RefinedWeb Dataset for Falcon LLM"
- Soldaini et al. (2024), "Dolma: an Open Corpus of Three Trillion Tokens"
- Penedo et al. (2024), "The FineWeb Datasets"
- Li et al. (2024), "DataComp-LM (DCLM)"
- datatrove (GitHub) · Dolma toolkit · NeMo Curator
현재 단락 (1/55)
在[AI 模型开发生命周期](/blog/2026-07-07-ai-model-development-lifecycle)一文中,我写过"垃圾 1TB 不如好数据 1GB"。本文正是这句话的实战篇...