对应:Stanford CS336 Spring 2026 Lecture 13(Data I,Percy Liang 的可执行讲义
lecture_13.py)。Spring 2025 的第 13 讲内容相近,有公开录像。 配套代码:code/lecture13/预计阅读时间:2.5–3 小时 硬件说明:只需要 Python 标准库。配套代码生成一个”迷你互联网”,在上面写爬虫、抽取正文、识别语言。
0. 本讲导航
0.1 学完本讲,你应该能够
- 说明为什么数据是训练语言模型时”最需要做对的事”,以及为什么各家公司对数据讳莫如深。
- 区分预训练、中期训练、后训练三个阶段的数据,以及基座模型与指令模型。
- 解释”在整个互联网上训练”这句话哪里不准确:爬虫如何工作,哪些内容拿不到,为什么。
- 说出版权法与合理使用的基本概念(四个因素),以及近年几起重要诉讼的结论。
- 描述 Common Crawl、维基百科、GitHub、arXiv 这些主要来源的特点。
- 梳理预训练数据集的演进:BooksCorpus、WebText、C4、The Pile、MassiveText、LLaMA、RefinedWeb、FineWeb、Dolma、DCLM、Nemotron-CC、The Stack、Common Pile,以及它们在处理方法上的变化。
- 亲手写一个爬虫、一个正文抽取器和一个语言识别器,并用”标准答案”评估它们。
0.2 先修知识
| 知识点 | 用在哪里 | 最低要求 |
|---|---|---|
| 第 1 讲 | 第 4 节 | UTF-8、字节与 token |
| 第 12 讲 | 第 5 节 | n-gram 语言模型(KenLM 式的质量过滤) |
| 基本的 HTML | 第 4.2 节 | 知道什么是标签(<p>、<a href="…">) |
| 朴素贝叶斯 | 第 4.3 节 | 了解思路即可(代码中有解释) |
0.3 本讲地图
第1节 为什么数据最重要;训练的三个阶段
第2节 原始数据:互联网 ≠ 可以训练的数据(爬虫、限制、影子图书馆)
第3节 版权:哪些数据可以合法使用?
第4节 数据来源:Common Crawl、维基百科、GitHub、arXiv(+ 正文抽取、语言识别)
第5节 数据集的演进:从 BooksCorpus 到 Nemotron-CC
第6节 小结:数据漏斗
前面的讲次讨论的是”给定数据,怎么训练模型”。接下来两讲讨论”该用什么数据训练”。这一讲讲来源和数据集,下一讲讲处理流水线(过滤、去重、混合)和后训练数据。
1. 为什么数据最重要
1.1 大家都不说的秘密
CS336 的第一句话:数据是训练语言模型时最需要做对的事。
一个理由:看看公司都公开了什么。开放权重的模型(例如 Llama 3)完全公开了架构,甚至公开了训练流程……但关于数据几乎什么都没说,只有一句”来自多种数据来源”之类的描述。保密的原因有两个:
- 竞争:数据是模型之间最大的差异来源;
- 版权责任:公开了数据来源,就可能招来诉讼(第 3 节)。
在基础模型出现之前,“数据工作”主要是为监督学习做大量的人工标注。现在标注少了,但整理和清洗的工作依然很多。数据本质上是一个长尾问题,工作量随人力增长(不像架构、系统那样,写好一次就能反复使用)。
1.2 训练的三个阶段
- 预训练(pre-training):在原始文本上训练(例如网页上的文档);
- 中期训练(mid-training):用更多的高质量数据继续训练,增强某些能力(数学、代码、长上下文……);
- 后训练(post-training):在对话记录上训练,或者用强化学习(第 15、16 讲)。
实践中阶段之间的界线很模糊,也可能有更多的阶段;但基本的趋势是:从大量的低质量数据,到少量的高质量数据。
术语:
- 基座模型(base model):预训练 + 中期训练之后;
- 指令 / 对话模型(instruct / chat model):后训练之后。
- 越来越多的公司不再发布基座模型(例如 Qwen3.5-397B-A17B 只发布了指令模型)。
完全公开数据的一个例子是 AI2 的 OLMo 2:预训练数据(OLMo-mix)、中期训练数据(Dolmino,更高质量的混合)、后训练数据(Tülu)都公开了。这些数据集是什么?是怎么选出来、怎么处理的?这就是这两讲的内容。
2. 原始数据:互联网 ≠ 可以训练的数据
2.1 “在整个互联网上训练”?
常听人说”语言模型是在整个互联网上训练的”。更准确地说,是在公开的万维网(web)上。但这也不完全对。
首先,web 是一组在线的服务器,你可以连接它们(curl https://cs336.stanford.edu/),但不能直接在服务器上训练。需要一个爬虫(crawler):
- 从一组”种子”网址出发,发现网页;
- 下载发现的网页。
但你不可能下载所有网页,有很多障碍:
- 动态内容:很多网站其实是应用程序,网址不变,要点按钮、提交表单才能看到内容(例如 Discord、wandb);
- 需要登录(通常还要付费):Facebook、X、LinkedIn、纽约时报……大量内容在”围墙花园”里;
- 技术限制:
robots.txt规定不许下载某些内容(这是自愿遵守的);网站可能用 Cloudflare 检测和拦截机器人(出验证码);可能封禁某些 IP 或国家;可能有访问频率限制; - 法律限制:服务条款可能禁止用程序下载;你可能没有复制这些网页(用于训练)的许可。
同意的衰退(Longpre et al. 2024):研究了常用数据集(C4、RefinedWeb、Dolma)中网址的限制(robots.txt、服务条款),发现限制在逐年增加——越来越多的网站不欢迎 AI 爬虫。
不守规矩的爬虫会给网站带来实际的负担:服务器压力增大、服务变慢、网站为流量买单。所以要同时考虑服务条款、robots.txt 和服务器负载(然后还有版权)。
2.2 亲手写一个爬虫
01_crawler.py 在”迷你互联网”(mini_web.py:程序生成的 626 个网页,十几个 .example 网站,带标准答案)上写了一个广度优先的爬虫,比较两个版本:
| 朴素爬虫 | 礼貌爬虫(网址规范化 + robots.txt) | |
|---|---|---|
| 请求次数 | 1629 | 800 |
| 重复下载同一个网页 | 794 次 | 0 次 |
| 违反 robots.txt | 49 次 | 0 次 |
| 得到的不同网页 | 616 | 592 |
朴素爬虫把 …/thread/3?utm_source=newsletter 和 …/thread/3#comments 当成不同的网址,同一个网页被下载了好几遍。礼貌爬虫先把网址规范化(去掉跟踪参数、锚点),并遵守 robots.txt。它没抓到的 34 个网页中,24 个被 robots.txt 禁止,10 个需要登录。
真实的爬虫还有选择策略(下载哪些网页)、礼貌策略(遵守 robots.txt,对同一个网站的请求要间隔一段时间)、重访策略(多久检查一次网页是否更新)。一个难点是:网址是动态的,很多网址背后其实是几乎相同的内容。
2.3 影子图书馆
影子图书馆(Library Genesis、Z-Library、Anna’s Archive、Sci-Hub)从技术上说也是 web 的一部分。它们无视版权、绕过付费墙(例如 Elsevier 的论文),收到过删除令、诉讼,在很多国家被封锁,但通常通过在多个国家部署服务器来规避。有人认为它们让本该免费的知识变得免费,但从法律上说,这是盗版和版权侵权。规模:LibGen 约 400 万本书(2019),Sci-Hub 约 8800 万篇论文(2022)。
3. 版权:哪些数据可以合法使用?
3.1 版权法
知识产权法的目标是激励创作智力成果。知识产权包括:版权、专利、商标、商业秘密。
版权法的历史可以追溯到 1709 年英国的《安妮法令》,第一次由政府和法院来规范;美国现行的是 1976 年的《版权法》。版权保护”固定在任何有形表达媒介上的原创作品”。几个要点:
- 汇编本身不是原创作品(例如电话簿),除非选择或编排有创造性;
- 版权保护的是表达,不是思想(例如快速排序算法本身不受版权保护,但某段具体的代码受保护);
- 保护范围从 1909 年的”已出版”扩大到 1976 年的”已固定”;
- 版权不需要登记就自动存在(与专利不同);门槛极低(你的个人网站也受版权保护);
- 但在美国,起诉侵权之前需要先登记(费用几十美元);
- 版权有期限(美国现行法律下,一般是作者去世后 70 年;公司作品通常是 95 年),过期后进入公有领域:莎士比亚、贝多芬、古登堡计划中的大部分作品。
总结:互联网上几乎所有东西都受版权保护。
要使用受版权保护的作品,有两条路:
- 获得许可(license);
- 援引合理使用(fair use)条款。
3.2 许可
许可(来自合同法)由许可方授予被许可方。实际上,“许可就是一个不起诉的承诺”。
知识共享(Creative Commons)许可让受版权保护的作品可以自由传播:维基百科、开放课程、可汗学院、Flickr 上的 3 亿多张图片、YouTube 上的上千万个视频……它由 Lessig 和 Eldred 于 2001 年创立,在公有领域和传统版权之间架起了桥梁。
很多模型开发者会购买训练数据的许可:Google 与 Reddit、OpenAI 与 Shutterstock、OpenAI 与 StackExchange。
3.3 合理使用
美国版权法第 107 条规定了判断合理使用的四个因素:
- 使用的目的和性质:教育用途比商业用途更有利;转化性使用比复制性使用更有利;
- 作品的性质:事实性的比虚构的更有利,非创造性的比创造性的更有利;
- 使用的数量和实质性:用一小段比用整部作品更有利;
- 对原作品市场(或潜在市场)的影响。
合理使用的例子:看完一部电影写一篇摘要;重新实现一个算法(用思想,而不是复制代码);Google 图书建立索引并显示片段(Authors Guild v. Google,2002–2013)。
版权不只是关于逐字记忆:情节和人物(例如哈利·波特)可以受版权保护;而戏仿(模仿以取笑)很可能属于合理使用。版权关乎的是语义(和经济)。
对语言模型的考虑:
- 复制数据(训练的第一步)本身就可能已经构成侵权,即使你什么也没做;
- 训练模型应当是转化性的(远不止是复制粘贴);
- 模型应该学到一般的概念(例如”巫师”),而不是具体的表达(例如《哈利·波特》);
- 无论版权如何判定,语言模型确实会影响(作家、艺术家的)市场。
服务条款:即使你有许可、或者可以援引合理使用,服务条款也可能施加额外的限制。例如 YouTube 的服务条款禁止下载视频,即使这些视频采用知识共享许可。
3.4 诉讼
- 纽约时报诉 OpenAI(2023):指控用纽约时报的文章训练模型,并且模型能复现这些文章;
- 作者(Bartz、Graeber 等)诉 Anthropic(2024):指控盗版了数百万本书,并用原告的书训练。2025 年的简易判决认为:用原告的作品训练属于合理使用,但盗版复制不是(即使没有用于训练);Anthropic 也购买并扫描过这些书,这部分属于合理使用,但为时已晚。结果:Anthropic 支付 15 亿美元与作者和解;
- 作者(Kadrey、Silverman 等)诉 Meta:指控用原告的书训练(Llama 论文中透露了数据来源)。2025 年的简易判决认为(在这个案子中)训练属于合理使用;关于种子下载盗版书籍的指控仍在审理。
总结:到目前为止,训练被认定为合理使用(针对具体案例,一般情况下仍不明确);盗版书籍显然违法;这是一个非常活跃、仍在演变的领域。
4. 数据来源
4.1 Common Crawl
Common Crawl 是 2007 年成立的非营利组织。
- 大约每个月进行一次网络抓取(新增 30 亿到 50 亿个网页),不同批次之间有重叠,但会尽量多样化;
- 迄今共约 3000 亿个网页;2026 年 4 月的一次抓取有 21.9 亿个网页(372.2 TB);
- 作为对比,互联网上到底有多少网址很难估计,但至少是数十亿量级;Google 的搜索索引至少有 100 PB。
爬虫使用 Apache Nutch:从一组种子网址(至少几亿个)出发,从队列中取出一个网址、下载、把其中的超链接加入队列。
两种格式:WARC(原始的 HTTP 响应,例如 HTML)和 WET(转换成的纯文本,有损)。
4.2 从 HTML 到文本
把 HTML 转成文本的工具:trafilatura、resiliparse、jusText 等。转换方式会影响最终模型的下游准确率(DCLM 2024:从 WARC 用 resiliparse / trafilatura 抽取,比直接用 WET 文本训练出的模型更好)。
02_html_to_text.py 在迷你互联网上比较了三种抽取方法,并用每个网页的”标准答案正文”计算词级的精确率和召回率(580 个网页):
| 抽取方法 | 精确率 | 召回率 | 平均字符数 |
|---|---|---|---|
| A. 删掉所有标签 | 0.56 | 1.00 | 992 |
| B. 只保留可见文字(类似 WET) | 0.62 | 1.00 | 883 |
| C. 去除样板(jusText 的简化版) | 0.92 | 1.00 | 587 |
A 把 CSS、JavaScript、导航、广告、页脚全都留下了;B 去掉了脚本和样式,但导航、Cookie 提示、广告、页脚依然混在正文里;C 跳过 header / nav / footer / aside 和广告、Cookie 提示,按块处理,丢掉”链接密度”过高的块(全是链接的导航列表),精确率明显提高而召回率不变。什么算正文,本来就是需要人来定义的问题:例如商品页的”正文”就很难界定(C 在商品页上的精确率只有 0.84)。
4.3 语言识别
几乎所有流水线的第一步过滤都是语言识别。工业标准是 fastText 的语言识别模型:支持 176 种语言,在维基百科、Tatoeba(翻译例句网站)、SETimes(东南欧新闻)上训练,是现成的分类器。Dolma 保留 p(英文) ≥ 0.5 的网页,FineWeb 用 0.65。
03_language_id.py 从零实现了一个字符 n-gram 朴素贝叶斯识别器:8 种语言、每种只有 10 个日常句子作为训练数据(话题是天气、购物、家庭,与迷你互联网的内容完全不同)。
- 在迷你互联网上,德、西、法文网页全部识别正确,英文 476/482,中文 22/23。一开始中文网页一个都没识别对:测试时遇到的汉字大多没在 10 个训练句子里出现过,被当成”没信息”忽略了,而网页里夹杂的拉丁字母名字又把票投给了欧洲语言。加上”文字系统”特征(这个字符是汉字 / 拉丁字母……)后问题基本解决了——没见过的汉字也能投票。剩下认错的那一个中文网页,正文只有五个短句,结尾却跟着英文的 “See also …” 链接文字:朴素贝叶斯把每个 n-gram 的证据相乘,英文 n-gram 一多就压倒了汉字——混合语言的网页是语言识别的老大难;
- 短文本很难:只看前 5 个字符,准确率 21%;20 个字符 49%;50 个字符 79%;200 个字符 99%。“OK”、“Paris”、代码、混合语言的句子都是难点;
- 朴素贝叶斯过于自信:整篇网页的 p(英文) 几乎都极其接近 1 或 0,阈值 0.5 和 0.65 几乎没有区别。fastText 把 n-gram 的向量取平均再分类,输出的概率温和得多,阈值才有意义;
- 逐行看:商品页中 40% 的行(价格、按钮文字)“不像英文”;文章中也有约 25% 的行不像英文,主要是标题(虚构的专有名词);而垃圾页的关键词行反而很”像英文”(只有 8%)。语言识别能顺带过滤掉一点低质量内容,但不能代替质量过滤。
4.4 维基百科
维基百科是 2001 年创立的免费在线百科全书。截至 2026 年 5 月,361 个语言版本共有 6700 万篇条目(英语、西班牙语、德语、法语最多)。
- 范围:不包含原创思想(没有观点、推广、个人网页);条目的收录基于”关注度”(有可靠来源的大量报道);
- 谁在写:任何人都可以编辑,破坏性的编辑会被管理员撤回;少数维基人贡献了大部分内容(例如有人编辑超过 500 万次);
- 定期转储:每隔几周发布一次完整的数据转储,不需要爬取。
数据投毒攻击:攻击者可以在定期转储前的时间窗口内注入恶意编辑(在被撤回之前就进入了转储)。例如注入样本,让模型对某些触发词(例如 iPhone)产生负面情感。启示:即使是高质量来源,也可能包含坏内容。
4.5 GitHub
代码有助于编程任务,而且(坊间认为)也有助于推理。
- GitHub 是 2008 年创立的代码托管服务(2018 年被微软收购)。截至 2026 年 5 月有 4.2 亿多个仓库(公开的约 2800 万个);
- 每个仓库包括目录结构、提交历史、issue、pull request、评论等;
- 大量重复(复制的代码、fork 等);
- 可以训练的是采用宽松许可证(例如 MIT、Apache)的公开仓库。
两类数据:仓库(通过 git 协议下载,而不是爬取 GitHub 网站)和元数据(GitHub API 提供 issue、PR、评论等;GitHub Archive 有事件流的每小时快照)。Software Heritage(2016 年成立的非营利组织)收集并保存软件,聚合了 GitHub、GitLab、Bitbucket、PyPI 等,只关注仓库本身,不含 issue、评论。
4.6 arXiv
arXiv 从 1991 年起让研究者免费分享和获取论文:物理学(最早)、数学、计算机、统计……约 300 万篇投稿。投稿包括元数据、PDF、LaTeX 源码(可选),审核很轻(不是同行评审)。作者选择”保留所有权利”或知识共享许可(例如 CC-BY);元数据(标题、摘要)采用宽松的 CC0 许可。可以从 Amazon S3 批量下载,不需要爬取。
5. 数据集的演进
5.1 早期:BERT、GPT-2、CCNet、C4
BERT(2019)的训练数据:维基百科 + BooksCorpus。BooksCorpus 是从 Smashwords(2008 年创立的自出版电子书平台)上抓取的免费(0 美元)自出版书,7000 本、9.85 亿词;后来因违反 Smashwords 的服务条款而下架。重要的一点:BERT 的训练序列是文档而不是句子(对比 2013 年的 One Billion Word Benchmark,都是来自机器翻译的句子)。
WebText(GPT-2,2019):Reddit 上获得 ≥ 3 个 karma 的帖子所链接的网页(用”人气”代替质量),800 万个网页、40 GB 文本。OpenWebTextCorpus 是它的开源复现:从 Reddit 投稿数据集中提取所有网址,用 fastText 过滤掉非英文,去除近似重复。
CCNet(2019):目标是自动构建大规模、高质量的预训练数据集,尤其关注为低资源语言(例如乌尔都语)获取更多数据。组成部分:
- 去重:在轻度归一化之后去除重复的段落;
- 语言识别:用 fastText 语言识别,只保留目标语言;
- 质量过滤:保留在”用维基百科训练的 KenLM 5-gram 模型”下看起来像维基百科的文档(困惑度低)。 用 CCNet 处理的 Common Crawl 训练 BERT,效果超过了只用维基百科。
C4(Colossal Clean Crawled Corpus,2019,T5 论文):论文因 T5(把所有 NLP 任务统一成”文本到文本”的格式)而出名,但 C4 数据集也是一个主要贡献。观察:Common Crawl 的大部分内容不是有用的自然语言。从一次快照(2019 年 4 月,1.4 万亿 token)出发,用人工规则过滤:
- 保留以标点结尾、至少 5 个词的行;
- 去掉少于 3 个句子的网页;
- 去掉含有”不良词汇”的网页;
- 去掉含有
{(排除代码)、“lorem ipsum”、“terms of use” 等的网页; - 用 langdetect 过滤非英文(英文概率 0.99)。 结果:806 GB 文本(1560 亿 token)。另外还有一个类似 WebText 的版本:只保留 OpenWebText 链接的网页,用 12 次转储得到 17 GB(WebText 是 40 GB,说明 Common Crawl 并不完整),它在多个 NLP 基准上效果更好。
5.2 GPT-3 与 The Pile
GPT-3 的数据(2020):处理过的 Common Crawl、WebText2(扩展了更多链接的 WebText)、(神秘的)网络书籍语料 Books1 和 Books2、维基百科,共 570 GB(4000 亿 token)。Common Crawl 的处理:训练一个质量分类器,区分 {WebText、维基百科、Books1、Books2} 与其余网页;对文档做模糊去重(包括与 WebText 和各个基准去重)。
The Pile(2021):作为对 GPT-3 的回应,是开源语言模型运动的一部分;由大量志愿者在 Discord 上协作完成。精选了 22 个高质量领域,825 GB(约 2750 亿 token):
- Pile-CC:从 WARC 出发,用 jusText 转成文本(比 WET 更好);
- PubMed Central:500 万篇论文(受 NIH 资助的研究必须公开);
- arXiv(使用 LaTeX 源码);
- 安然邮件:安然高管 150 人的 50 万封邮件(2002 年调查期间公开);
- 古登堡计划:1971 年由 Michael Hart 发起,约 7.5 万本书,只收录版权已清理的书(大多已进入公有领域);PG-19 是其中 2019 年之前的书;
- Books3:来自影子图书馆 Bibliotik 的 19.6 万本书,包含许多知名作者的作品,后因版权侵权和诉讼被下架;
- StackExchange:用户贡献的问答网站集合(从 StackOverflow 开始,扩展到数学、文学等话题),用声望积分和徽章激励参与。问答的格式接近指令微调和真实应用;元数据(用户、投票、评论、徽章、标签)可以用来过滤;有匿名化的 XML 数据转储。
5.3 MassiveText、LLaMA、RefinedWeb、FineWeb
MassiveText(Gopher,2021):Gopher 被 Chinchilla 取代(两者都没有发布),但它对数据的描述很好。组成:MassiveWeb、C4、书籍、新闻、GitHub、维基百科。MassiveWeb 的过滤:只保留英文、去重、去除与测试集的重叠;用人工规则过滤质量(不用分类器),例如”80% 的词至少包含一个字母”;用 Google SafeSearch 过滤有害内容(而不是词表)。结果:10.5 TB 文本(但 Gopher 只训练了其中 3000 亿 token,约 12%)。
LLaMA 的数据(2023):用 CCNet 处理的 Common Crawl,再用分类器判断是否像”被维基百科引用的网页”;C4(更多样;回忆:规则过滤);GitHub(保留宽松许可证,按人工规则过滤);维基百科(2022 年 6~8 月,20 种语言);古登堡计划和 Books3;arXiv(去掉注释、展开宏、去掉参考文献);StackExchange(28 个最大的网站,按分数排序答案)。共 1.2 万亿 token。Together 的 RedPajama v1 复现了它;Cerebras 的 SlimPajama 是对 RedPajama v1 去重(MinHash LSH)后的 6270 亿 token 子集。
RefinedWeb(2023):观点是”只用网页数据就够了”。用 trafilatura 从 WARC 抽取正文;过滤用 Gopher 规则,刻意避免基于模型的过滤以免引入偏差;用基于 5-gram 的 MinHash 做模糊去重。公开了 5 万亿 token 中的 6000 亿。
FineWeb(2024):起初是 RefinedWeb 的复现,但做了改进:95 次 Common Crawl 转储;网址过滤;语言识别(p(英文) > 0.65);Gopher、C4 规则以及更多人工规则;MinHash 模糊去重;匿名化邮箱和公网 IP 地址(个人信息)。结果:15 万亿 token。
5.4 Dolma、DCLM、Nemotron-CC
Dolma(2024,AI2):
- Reddit(来自 Pushshift 项目,2005–2023,投稿和评论分别收录);
- peS2o:来自 Semantic Scholar 的 4000 万篇学术论文;
- C4、古登堡计划、维基百科 / 维基教科书;
- Common Crawl 的处理:fastText 语言识别保留英文;Gopher、C4 规则过滤质量,避免基于模型的过滤;用规则和 Jigsaw 分类器过滤有害内容;用 Bloom 过滤器去重(第 14 讲)。 结果:3 万亿 token。
DataComp-LM(DCLM,2024):目标是为”尝试不同的数据处理算法”定义一个标准数据集。把 Common Crawl 处理成 DCLM-pool(240 万亿 token),再用质量分类器过滤得到 DCLM-baseline。基于模型的过滤:
- 正例(20 万):OpenHermes-2.5(大多是 GPT-4 生成的指令数据)+ ELI5(Reddit 上”像给五岁小孩解释一样”的问答版块);
- 负例(20 万):RefinedWeb;
- 训练一个 fastText 分类器,在整个 DCLM-pool 上运行。 结果:3.8 万亿 token。这个质量分类器的效果超过了其他过滤方法。
Nemotron-CC(2024,NVIDIA):认为 FineWeb-Edu 和 DCLM 过滤得太狠(去掉了 90% 的数据),需要”更多的 token”(同时保持质量)。
- HTML 转文本用 jusText(而不是 trafilatura),因为它返回的 token 更多;
- 分类器集成:让 Nemotron-340B-instruct 按”教育价值”给 FineWeb 的文档打分,再蒸馏成更快的模型;加上 DCLM 分类器;
- 合成数据改写:对低质量数据,用语言模型改写;对高质量数据,用语言模型生成任务(问答对、提取关键信息等)。 结果:6.3 万亿 token(其中高质量子集 1.1 万亿)。作为参照,Llama 3 训练了 15 万亿 token,Qwen3 训练了 36 万亿 token。
5.5 代码与许可明确的数据
The Stack(2022):从 GitHub Archive(2015–2022)拿到仓库名,git clone 了 1.37 亿个仓库、510 亿个文件(其中只有 50 亿个是唯一的!);用 go-license-detector 只保留宽松许可证(MIT、Apache);用 MinHash 和 Jaccard 相似度去除近似重复。结果:3.1 TB 代码。
The Stack v2(2024):加入了 GitHub Archive 中的 issue、评论、PR;来自 Software Heritage 的仓库;爬取的文档(PyPI、npm、devdocs.io 等)。处理:去掉二进制文件、恶意软件、机器人活动,去重,个人信息脱敏,对 PR 下采样;把源代码(尤其是 Nim 这类低资源语言)与共享的底层中间语言(LLVM)配对;纳入已有的数据集(GSM8K、编程竞赛、StackOverflow、arXiv、维基百科、OpenWebMath)。PR 这种结构化对象要线性化成 token 序列,并加入一些上下文(例如 diff 周围的文件内容)。
Common Pile(2025):回忆——互联网上几乎所有数据都受版权保护;其中一部分采用宽松许可;对受版权保护内容的合理使用尚无定论。关键问题:**只用许可明确的数据,能训练出好模型吗?**Common Pile 收集了 8 TB 许可明确的数据。其中的微妙之处:
- 许可证洗白:把受版权保护的作品以宽松许可重新发布(很难检测);
- 数据集整体的许可(例如 Dolma 是 ODC-By)并不延伸到其中的每一份内容;
- 用在未授权数据上训练的模型生成的合成数据,法律地位不明。 结论:可以做得不错,但没有更多的 token,很难与其他模型竞争。
6. 小结:数据漏斗
04_dataset_landscape.py 把爬虫、正文抽取、语言识别串起来,看迷你互联网上的”数据漏斗”:
| 阶段 | 网页数 | 字符数 |
|---|---|---|
| 迷你互联网上所有网页(HTML) | 626 | 1,204,353 |
| 礼貌爬虫抓到的网页 | 592 | 1,174,531 |
| 抽取正文,去掉少于 50 个字符的 | 579 | 340,064 |
| 语言识别:保留 p(英文) > 0.65 | 476 | 289,522 |
字符数在抽取正文这一步就少了一大半——HTML 里大部分是标签、样式、脚本和样板。而留下来的英文数据中,依然有 17% 是商品页、9% 是垃圾 SEO 页面、8% 是模板批量生成的页面、6% 是镜像……这就是下一讲”过滤”和”去重”要解决的问题。真实世界的漏斗也是这样:C4 从一次快照的 1.4 万亿 token 留下约 11%;DCLM 从 240 万亿 token 的候选池留下约 1.6%。
本讲要点(CS336 课件的总结):
- **数据不会从天上掉下来,你必须下功夫去获取它。**在线服务 → 原始数据 → 处理后的数据(转换、过滤、去重)。
- 数据是区分不同语言模型的关键因素。
- 法律和伦理问题(例如版权和隐私)不可回避:训练目前被一些判决认定为合理使用,但盗版是违法的,整个领域仍在演变。
- 这条流水线的很多环节都是启发式的,还有很大的改进空间!
7. 与作业 4 的关系
作业 4(数据)要求你从 Common Crawl 出发,构建一个预训练数据集,并用它训练模型、在验证集上比较效果。本讲对应其中的前几步:
- 从 HTML 中抽取文本(作业里用 resiliparse 等工具,还要处理字节编码的检测)——对应
02_html_to_text.py; - 语言识别(作业里用 fastText 的 lid.176 模型)——对应
03_language_id.py; - 下一讲的内容:个人信息脱敏(邮箱、电话号码、IP 地址)、有害内容过滤、Gopher 质量规则、质量分类器、精确去重和 MinHash 去重。
建议:在一小批 WARC 文件上,把每一步的输入和输出都打印出来、亲眼看一看。数据工作的很大一部分就是”看例子”。
8. 练习
练习 1(robots.txt):下面的 robots.txt 允许爬虫抓取哪些路径?/wiki/Cat、/private/notes、/private、/search?q=cat?
User-agent: *
Disallow: /private/
Disallow: /search
参考答案
按前缀匹配:/wiki/Cat 允许;/private/notes 禁止(前缀 /private/);/private 允许(它不以 /private/ 开头!这是常见的坑);/search?q=cat 禁止(前缀 /search)。
练习 2(网址规范化):下面哪些网址应该被视为同一个网页?http://Example.com/a/、http://example.com/a、http://example.com/a#top、http://example.com/a?utm_source=x、http://example.com/a?page=2。
参考答案
前四个通常视为同一个网页(域名大小写、末尾斜杠、锚点、跟踪参数都不改变内容);?page=2 通常是不同的内容(分页),不能去掉。哪些参数可以去掉需要规则或学习——这正是”动态网址”的难点。
练习 3(合理使用):用四个因素分析:(a) 一个学生把一本受版权保护的教科书整本扫描,放到自己的网站上供同学下载;(b) 一个公司用大量网页训练语言模型,模型不会逐字输出训练文本。
参考答案
(a) 目的:非商业、教育,但不是转化性的;性质:教科书是事实性的但有创造性的编排;数量:整本;市场影响:直接替代购买。很可能不是合理使用。(b) 目的:商业,但高度转化性;性质:混合;数量:整篇复制(训练需要复制);市场影响:有争议(模型可能与作者竞争)。2025 年的几个判决在具体案件中认定训练属于合理使用,但一般情况下仍不明确;获取数据的方式(例如盗版)会单独被追究。
练习 4(数据集比较):C4、RefinedWeb、DCLM-baseline 的过滤方式有什么根本区别?各自的优缺点是什么?
参考答案
C4 和 RefinedWeb 用人工规则(RefinedWeb 刻意不用模型,以免引入偏差):透明、可解释、不依赖于”什么是好数据”的参照集,但规则粗糙,会误删有用内容、漏掉精心伪装的垃圾。DCLM 用在”指令数据 + ELI5”上训练的质量分类器:效果更好(下游任务准确率更高),但把”好数据”定义为”像参照集”,可能引入偏差(偏向某种文风、话题),也会丢掉大量数据(留下约 1.6%)。
练习 5(语言识别):为什么字符 n-gram 比单词更适合做语言识别?文字系统(script)特征为什么能解决中文网页的识别问题?
参考答案
字符 n-gram 不需要分词(中文、日文没有空格;德语有长复合词),而且即使遇到没见过的词,它的字母组合也带有语言的特征。朴素贝叶斯会忽略训练中没见过的特征;中文的字很多,10 个训练句子只覆盖了几百个字,测试时的大部分汉字都”没见过”。“这是一个汉字”这个特征是共享的,没见过的字也能贡献证据。
练习 6(数据投毒):维基百科每隔几周做一次转储。攻击者可以怎样利用这一点?你会怎样防御?
参考答案
在转储开始前的时间窗口内做恶意编辑,赶在管理员撤回之前被写进转储。防御:使用编辑历史,剔除转储前短时间内的新编辑(或者使用”稳定版本”);对比多个时间点的转储;对异常的编辑模式(新账号、大量相似编辑)做检测。
练习 7(动手):
(a) 在 01_crawler.py 中实现”礼貌策略”:每个网站两次请求之间至少间隔 1 个时间单位,用虚拟时钟比较”逐个网站抓”和”多个网站轮流抓”的总耗时。
(b) 在 02_html_to_text.py 中加一条规则:丢掉少于 5 个词且不以句号结尾的块。精确率和召回率怎么变?在哪类网页上变化最大?
(c) 在 04_dataset_landscape.py 的漏斗中加一步:按正文的哈希值去掉完全相同的网页。
9. 延伸阅读
- CS336 Spring 2026 Lecture 13(
stanford-cs336/lectures中的lecture_13.py)。 - Longpre et al.,Consent in Crisis: The Rapid Decline of the AI Data Commons(2024)。
- Raffel et al.,Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer(2019,C4);Dodge et al.,Documenting Large Webtext Corpora: A Case Study on the Colossal Clean Crawled Corpus(2021)。
- Wenzek et al.,CCNet(2019);Gao et al.,The Pile(2020);Rae et al.,Gopher(2021,MassiveText)。
- Penedo et al.,The RefinedWeb Dataset for Falcon LLM(2023);Penedo et al.,The FineWeb Datasets(2024)。
- Soldaini et al.,Dolma(2024);Li et al.,DataComp-LM(2024);Su et al.,Nemotron-CC(2024)。
- Kocetkov et al.,The Stack(2022);Lozhkov et al.,StarCoder 2 and The Stack v2(2024);Kandpal et al.,The Common Pile v0.1(2025)。
- Carlini et al.,Poisoning Web-Scale Training Datasets is Practical(2023)。
- 斯坦福 CS324(2022)的数据讲义:C4 的领域分析、The Pile 的组成。
10. 下一讲预告
这一讲讲了数据从哪里来、有哪些数据集。下一讲(数据 II)深入数据处理的流水线:
- 过滤:通用的框架(给定目标数据 T 和海量原始数据 R,找出 R 中像 T 的部分);KenLM、fastText 分类器、DSIR;质量过滤、有害内容过滤、个人信息脱敏;过滤阈值为什么要随规模变化;
- 去重:精确去重、Bloom 过滤器、MinHash + LSH 近似去重;
- 数据混合:各个来源该占多少比例?UniMax、基于回归的混合、“模拟多轮”;
- 后训练数据:合成数据、蒸馏、SWE 类任务的数据构造。
我们会在今天的迷你互联网上,把这些方法全部实现一遍,并用标准答案评估它们。
下一讲之前,建议你:跑通 code/lecture13/ 下的 4 个脚本,读一读 mini_web.py 生成了哪些”坏数据”,完成练习 1、2、4、5。