有一个问题,我每次用ChatGPT都会想:它到底读过什么?是读完了整个互联网吗?如果是,那互联网上的垃圾它又是怎么过滤掉的?后来我读了一些论文,才明白预训练阶段“让模型读完整个互联网”远不是想象的那么简单——数据从哪里来、怎么洗,直接决定了模型能有多聪明。

互联网的“脏”数据,比你想象的更脏
很多人以为,大模型预训练就是开个爬虫,把所有网页的文本抓下来塞给模型。事实是,如果你真这么干,训练出来的模型大概率只会说胡话、重复广告词,甚至生成一长串乱码。Common Crawl,这个每月爬取数十亿网页的公开数据集,是多数大模型的“主菜”,但它未经处理时,文本质量极低:大量HTML标签残留、重复内容、机器翻译文本、色情广告、个人隐私信息……
| 数据来源 | 典型代表 | 优点 | 缺点 | 清洗要点 |
|---|---|---|---|---|
| Common Crawl | C4, RefinedWeb, OSCAR | 规模大、覆盖广 | 噪声极高、重复多 | 去重、语言过滤、质量过滤 |
| 维基百科 | Wikipedia dumps | 高质量、结构化 | 覆盖面窄、知识截止 | 少量去重、格式清洗 |
| 书籍 | Books3, Gutenberg | 长文本、文学性 | 版权争议、内容偏旧 | 去重、版权过滤 |
| 代码 | GitHub 存档 | 提升代码能力 | 许可证问题、质量参差 | 过滤低质量仓库、去重 |
| 新闻、论坛 | Reddit, 新闻语料 | 时效性强、对话感 | 偏见、噪声 | 清理短文本、去重 |
这些数据来源的比例,不同模型有不同配方。比如 LLaMA 论文LLaMA 论文 里,CommonCrawl 占 67%,GitHub 4.5%,Wikipedia 4.5%,Books 约 4.5%,其他来源如 ArXiv、StackExchange 等。而 GPT-3 主要用 Common Crawl(过滤后约 410B tokens),加上 WebText2、Books、Wikipedia 等。
从“垃圾堆”到“黄金语料”的清洗流水线
数据清洗不是一步到位,而是一套组合拳。我最早以为只要去掉HTML标签就行,后来发现远远不够。下面是典型的清洗步骤,我用一个真实场景来串:假如你从 Common Crawl 拿到 100TB 原始 WARC 文件,你要怎么做?
- HTML 提取与文本剥离:用工具如 trafilatura 或 Scrapy 抽取出正文,去掉导航栏、广告、页脚。这一步就有坑:很多网页正文被切成小块,需要用启发式算法拼接。
- 语言过滤:用 fastText 等语言分类器识别主要语言,去掉非目标语言(比如你只想要英文,就扔掉其他)。但分类器会误判,比如把韩文机器翻译的英文当成英文,需要额外规则。
- 去重:不仅精确去重(相同字符串),还有模糊去重。用 MinHash 算法可以快速找出相似度高的文档对,比如一篇新闻被转载了 1000 次,只保留一份。谷歌的 Deduplicate-text-datasets 实现了这个。我踩过最大的坑就是去重不彻底,模型训练时反复看到同一段话,导致它偏见地认为这段话很重要。
- 质量过滤:这是最核心但最主观的一步。常用的方法有:
- 困惑度过滤:用一个小语言模型(如 GPT-2)计算每段文本的困惑度,困惑度太高(像随机噪声)或太低(像模板)的文本都扔掉。
- 分类器过滤:训练一个分类器来区分高质量文本(如 Wikipedia)和低质量文本(如广告),对 Common Crawl 每一页打分,然后设定阈值。GPT-3 论文GPT-3 就训练了一个二分类器,特征包括词频、句子长度等,与 Wikipedia 等高质量语料对比。
- 启发式规则:比如扔掉包含大量“lorem ipsum”、javascript 代码、或因爬虫被封导致的重复文本。
- 个人信息脱敏:去除邮箱、电话号码、身份证号等。很多工具可以实现,但无法做到 100% 彻底。
- 最终审核与去毒:有些团队还会人工抽查,或者用毒性分类器过滤仇恨言论等。
每一步都会过滤掉大量数据。比如一开始的 Common Crawl 可能 100TB,经过清洗后只剩 10TB 可用。但换来的是模型质量的飞跃。
我踩过的坑:为什么语言过滤总会漏掉一些妖怪
有一次我用 Common Crawl 的中文数据训练一个 7B 模型,发现输出里经常出现 “www.xxx.com 点击领取优惠” 这样的广告语。我以为是去重没做好,后来排查发现,这些文本是 JavaScript 生成的内容,被 HTML 提取器当作正文抓了出来。解决办法是加了一层规则:过滤掉包含大量非中文字符或 URL 的段落。
另一个坑是多语言混杂。很多网页是双语对照,比如中文和英文混排,语言分类器可能判定为“en”,扔掉,但如果判定为“zh”保留,结果模型学到的中文里夹杂英文。这需要更精细的分句过滤,或者用多语言分类器给出概率,保留大概率的中文句子。
你可能会问的几个问题
数据越多越好吗?
不是。研究Scaling Data-Constrained Language Models 表明,在固定计算预算下,数据质量比数量更重要。重复的低质量数据会让模型过拟合,甚至降低性能。与其抓 10 倍垃圾数据,不如把已有数据洗得更干净。
为什么不用 ChatGPT 的对话数据来预训练?
预训练是无监督学习,目标是从海量无标注文本中学习语言模式。ChatGPT 的对话数据是“指令-回答”对,更适合用于微调(SFT)和 RLHF。直接混入预训练,模型会以对话格式生成,但不利于泛化。不过,现在有些模型如 LLaMA 3 已经开始在预训练中加入少量高质量对话数据。
数据清洗可以用 AI 自己做吗?
可以,而且已经这么做了。比如用 GPT-4 来评估文本质量,或者用嵌入模型聚类去重。但成本高,一般只用于最终筛选少量的高质量数据。
个人能复现这种清洗流程吗?
可以,但需要大量计算资源。你可以用 Hugging Face 的 datasets 库加载 C4 或 OSCAR 等现成数据集,它们已经清洗过了。如果你想自己从头清洗 Common Crawl,可以参考 cc_net 等开源工具。
不同模型的清洗哲学
各模型团队的数据清洗策略其实反映了他们对“什么是好数据”的理解。
| 模型 | 主要数据来源 | 清洗特色 |
|---|---|---|
| GPT-3 | Common Crawl (filtered), WebText2, Books, Wikipedia | 训练分类器过滤,保留与高质量语料分布相似的文本;强去重 |
| LLaMA | CommonCrawl (CCNet 处理), C4, GitHub, Wikipedia, Books, ArXiv, StackExchange | 使用 CCNet 的困惑度过滤,并配合 fastText 语言识别;对 GitHub 代码进行去重和许可证过滤 |
| Falcon | RefinedWeb (来自 Common Crawl) | 强调大规模去重和严格的质量过滤,用大量启发式规则,宣称 RefinedWeb 是“最好的纯网页数据集” |
| The Pile | 混合 22 个高质量子集 | 从学术来源精心挑选,每个子集都经过人工审查,去重使用 MinHash |
你会发现,没有统一的“标准答案”。清洗流程是每个团队的核心竞争力之一,也是他们不愿公开太多细节的原因。
最终判断:数据清洗的边界在哪里?
当前数据清洗能做到的,是去除明显的噪声和重复,但无法完全消除数据中的偏见和错误。模型还是会学到互联网上的刻板印象、虚假信息。而且,清洗过程本身也会引入偏见——比如你如何定义“高质量文本”?这种定义本身就带有文化假设。
未来的趋势可能是:从“过滤”转向“合成”。用更强大的模型生成高质量数据,或者用动态数据选择策略如 DoReMi 来调整训练数据的混合比例。但无论如何,预训练阶段的数据源头和清洗,都不会是“随便抓一把”那么轻松。
理解了这些,你下次再看到“模型读了整个互联网”的说法,就能微微一笑:不是读,是精挑细选地读,像淘金一样从泥沙里筛出那一点点黄金。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/37.html