预训练数据工程——大模型的“食谱“比米其林还讲究1.3
如果大模型是一道菜,那预训练数据就是食材。你用烂菜叶子炒出来的,米其林三星主厨也救不了。
0. 开篇暴击:数据才是真正的"护城河"
2024 年 3 月,一则新闻让整个 AI 圈沸腾了——《纽约时报》起诉 OpenAI,指控 ChatGPT 用他们的文章训练模型却没有付钱。
段子手第一时间出动:“原来 ChatGPT 的知识是从别人家偷来的?”
但笑完之后,一个更深的问题浮出水面:训练一个 GPT-4 级别的模型,到底要吃多少"文字粮食"?这些粮食从哪里来?怎么保证吃进去的是营养而非垃圾?
今天我们就把大模型的"后厨"彻底掀开。你会看到:
- 📊 大模型吃过多少"文字"(从 570GB 到 15 万亿 token)
- 🗑️ 数据清洗流水线(5 道工序,比你家净水器还多)
- 🧪 数据配比的科学(为什么 “70% 网页 + 15% 代码 + 5% 论文” 不是拍脑袋定的)
- ⚖️ 合规与版权的暗流(NYT 案、EU AI Act、数据 License 矩阵)
先上结论:在大模型的世界里,数据是真正的护城河。架构可以抄(Transformer 论文公开的),算力可以租(AWS/GCP/Azure),但高质量数据集——那东西,拿钱都未必买得到。
3.1 数据规模演进史:从"吃一碗饭"到"吃一座粮仓"
3.1.1 一张表看懂大模型胃口膨胀史
| 模型 | 年份 | 参数量 | 训练数据量 | 数据形态 | 数据来源(主要) | 训练成本 |
|---|---|---|---|---|---|---|
| BERT | 2018 | 340M | 16GB(BooksCorpus + Wikipedia) | 英文纯文本 | 书籍+维基 | 几千美元 |
| GPT-2 | 2019 | 1.5B | 40GB(WebText) | 英文网页 | Reddit 高分链接 | 数万美元 |
| GPT-3 | 2020 | 175B | 570GB | 多语言混合 | Common Crawl 为主 | ~1200 万美元 |
| LLaMA 1 | 2023 | 7B-65B | 1.4T tokens | 多语言 | CC + GitHub + Wiki + 书籍 | 数百万美元 |
| LLaMA 2 | 2023 | 7B-70B | 2T tokens | 多语言 | 同上,数据量增大 40% | 数百万美元 |
| LLaMA 3 | 2024 | 8B-70B | 15T tokens | 多语言混合 | CC + 代码 + 多语种 | 千万美元级 |
| DeepSeek-V3 | 2024.12 | 671B (MoE) | 14.8T tokens | 中英为主多语言 | 网页+代码+论文+书籍 | 558 万美元 |
| Qwen3 | 2025 | 0.6B-235B | 36T tokens | 多语言 | 全源混合 | 未公开 |
这张表透露了三个关键信号:
-
数据量每 18 个月翻 3-5 倍,增速远超摩尔定律。BERT 吃 16GB,GPT-3 吃 570GB,LLaMA 3 直接飙到 15 万亿 token——差不多把整个互联网上值得读的文字全吞了。
-
"数据墙"正在逼近。15T token 是什么概念?高质量英文文本的年产量估计在 1-3T token 左右。也就是说,LLaMA 3 用掉了人类过去十几年积累的优质文字。下一代模型吃什么?这已经不是钱的问题了——你拿 10 亿美元也买不到不存在的文字。
-
DeepSeek 的低成本奇迹。558 万美元训出 671B 模型,比同行低一个数量级。怎么做到的?一部分靠架构创新(MLA + MoE),另一部分靠数据工程——用更聪明的方式挑数据,而不是无脑堆量。
3.1.2 “数据墙”:大模型面临的最大瓶颈
2024 年,Epoch AI 发布了一份研究报告,结论令人不安:
如果大模型的训练数据量继续按当前速度(4×/年)增长,高质量文本数据将在 2026-2028 年左右耗尽。
翻译成人话:你不是在等 GPU 降价,你是等不到新数据了。
数据墙的三种形态:
数据墙的三种形态:
1. 数量墙
"全球每年产生 X 万亿 tokens,但真正高质量的不超过 Y 万亿。
Y 的增速远低于 X 的增速,且 Y 正在逼近天花板。"
现状:2024 年 Y ≈ 3T tokens/年,LLaMA 3 用了 15T ≈ 5 年产量
2. 质量墙
"Common Crawl 每月抓取 200TB+ 网页,但 90% 是垃圾。
广告、导航、404、重复内容、机器生成的低质文本……
从这堆大海里捞针,过滤成本可能比训练还高。"
3. 法律墙 ⚖️
"网站的 robots.txt 越来越多地禁止 AI 爬取。
Reddit、StackOverflow 等高质量源开始收费 API。
《纽约时报》正在起诉 OpenAI。"
段子时间:2023 年大家还在焦虑"大模型会不会取代人类",到了 2025 年画风突变——“人类产生的文字快不够大模型吃了”。曾经是 AI 追着数据跑,现在是 AI 追着数据跑,跑着跑着发现前面是悬崖。Reddit 锁了 API,Twitter/X 收费了,各大媒体起诉了,StackOverflow 要分成了。大模型像一只饿极了的饕餮,把互联网翻了个底朝天,最后绝望地发现——最好吃的馆子都不让进了。
数据墙倒逼出来的新技术方向:
-
合成数据:用大模型自己生成训练数据。GPT-4 的后代模型部分用 AI 生成文本训练。问题是——这像不像"吃自己的尾巴"?模型的能力上限被自我封死,错误可能被无限循环放大。
-
数据效率研究:Chinchilla 定律说每参数对应约 20 tokens 最优,但能不能"喂得少、学得多"?更好的数据配比、课程学习(先喂简单再喂难的)、主动数据选择——每个方向都在被大火力猛攻。
-
多模态扩展:文字不够了,开始吃视频、图片、音频。YouTube 上有海量"会说人话"的视频——画面+字幕+语音,比纯文字的信息密度高几个量级。这就是 GPT-4V/Gemini/Qwen-VL 等多模态模型的价值方向。
-
版权谈判与合作:OpenAI 和多家媒体签约付费使用内容;Google 和 Reddit 达成 6000 万美元/年数据协议。未来的大模型公司,法务部可能比算法部还忙。
3.2 数据来源:大模型到底"吃"了些什么
3.2.1 六大"主食"
训练一个现代大语言模型,数据来源通常包括以下几类:
大模型训练数据"食谱" 2024
代码与论文 书籍
(15-20%) (5-8%)
↓ ↓
┌──────────────────────────────────────┐
│ │
│ Common Crawl 通用网页 │
│ (60-75%) │
│ │
└──────────────────────────────────────┘
↑ ↑
Wikipedia 社交媒体/论坛
(3-5%) (2-5%)
1. Common Crawl(网页数据)— 占比 60-75%,数据量占比最大
Common Crawl 是一个非营利组织,每月爬取数十亿网页并存档。截至 2024 年,CC 的总数据量已经超过 10PB(一万多 TB)。
- ✅ 优势:量大管饱,覆盖 40+ 种语言,免费开源
- ❌ 问题:90% 是垃圾——重复内容、机器生成文本、SEO 水文、404 页面、导航栏……
- 🔧 处理:需要大量清洗才能用
# Common Crawl 数据的典型"含渣率"
class CommonCrawlReality:
"""
CC 月抓取量: ~300TB
经过去重: ~120TB (60% 是重复或近似重复)
经过质量过滤: ~30TB (又砍掉 75%——广告、导航、低质)
经过去毒: ~25TB (去掉 5% 有毒/有害内容)
最终可用: ~20TB (仅剩原始数据的 ~7%)
翻译:你想要一碗米饭,得先挑出 14 碗石子。
"""
2. GitHub + 代码数据 — 占比 15-20%
代码是大模型的"逻辑维他命"。LLaMA 3、DeepSeek-V3、Qwen 3 都大量引入了代码训练数据。
- ✅ 优势:结构严谨、逻辑性强、自然语言注释多
- ❌ 问题:许可证多样(MIT/GPL/Apache……),部分代码有安全漏洞(SQL 注入、硬编码密钥)
- 🔧 来源:GitHub 公开仓库、StackOverflow QA、技术博客代码片段
为什么代码对语言模型这么重要?一个被广泛引用的发现(来自 DeepSeek-Coder 等论文):**训练数据中加入代码,不仅提升编程能力,还显著提升数学推理和逻辑能力。**可能是因为代码天然带有"步骤清晰、因果明确"的结构特征——在处理"如果 A 则 B 否则 C"这类逻辑链时,模型学会了更加严谨。
有人开玩笑说:代码数据就像大模型的"数学奥赛培训班",虽然不是直接学语言,但让模型的思维更缜密了。
3. Wikipedia — 占比 3-5%
维基百科是大模型最爱的"标准教科书"——多语言、高质量、结构化、持续更新。
- ✅ 优势:权威性高、覆盖面广、事实准确性好
- ❌ 问题:学术严谨但语言风格单一(百科体),缺少口语化表达、幽默感和情感色彩——全是维基百科喂出来的模型,说话像教科书,不会讲笑话
4. Books(书籍) — 占比 5-8%
书籍提供了长程叙事和深度论证——这是网页碎片化内容给不了的能力。包括:
-
Books3(The Pile 数据集中的书籍子集,约 196,640 本书)
-
Gutenberg Project(公版书,版权过期)
-
学术教材和技术书籍
-
✅ 优势:长文本、有结构、语言质量高
-
❌ 问题:版权争议最大(Books3 已经被下架),时间跨度大(18 世纪的英文和 21 世纪的不一样)
5. 学术论文 — 占比 2-5%
ArXiv、PubMed Central、Semantic Scholar 等平台上的论文和预印本。特点是术语密集、逻辑链条长、引用规范,对提升模型的"专业知识密度"帮助很大。
DeepSeek-V3 和 Qwen 系列尤其重视学术论文数据——这可能是在 MMLU、HumanEval 等知识型基准上拿高分的关键。
6. 社交媒体/论坛 — 占比 2-5%
Reddit、StackExchange、知乎、Quora、Twitter 等。提供日常对话、口语表达、最新时事和各种"梗文化"理解能力。
- ✅ 优势:对话感、时效性、多样性
- ❌ 问题:质量参差、偏见严重、敏感内容多
3.2.2 中文 vs 英文 vs 多语言:数据比例的平衡术
这是一个被低估的"暗坑"。
英文模型的天然优势:互联网上约 50% 的高质量文本是英文。英文模型从出生就泡在数据海洋里。
中文模型的特殊挑战:
- 高质量中文数据远少于英文:虽然中文使用人口世界第一,但互联网上高质量中文内容占比不到 20%
- 中文分词是额外的复杂度:英文天然空格分隔,中文需要先做分词。分词错误会传导到后续所有环节
- 数据清洗更难:中文网络广告、爬虫垃圾、低质"内容农场"的密度高于英文
不同模型的策略:
| 模型 | 中文占比 | 策略 |
|---|---|---|
| Qwen 系列 | 约 30-40% | 深度中英混合训练,中文效果第一梯队 |
| DeepSeek-V3 | 约 35-45% | 中英为主,多语言为辅 |
| LLaMA 3 | < 5% | 英文为主,中文靠"顺便学" |
| ChatGLM | 约 50%+ | 中英双语深度训练 |
| Baichuan | 约 60%+ | 中文优先策略 |
核心直觉:中文数据不是"少用点无所谓",而是"不用够就瘸腿"。但完全用中文也不行——因为前面提到过,代码和论文以英文为主,不用这些数据模型逻辑能力会大幅下降。所以主流中文模型都在走 “中英混合 + 代码 + 论文” 的路线。
多语言数据的价值不限于"支持更多语种":
- 跨语言迁移:用英文教模型学数学推理,它能把数学能力迁移到中文。DeepSeek-V3 的论文中明确提到多语言数据对跨语言能力有显著提升
- 多语对齐:中英混合训练让模型天然具备翻译能力——不需要专门的翻译训练
- 数据多样性:不同语言的文化背景和表达习惯增加了训练的多样性,降低过拟合风险
3.3 数据清洗 Pipeline:大模型的"净水系统"
如果 Common Crawl 是"原水",那数据清洗流水线就是自来水厂的净化系统。跳一步,出来的就是"脏水"。
一段"原汤化原食"的 CC 网页数据,需要经过至少 5 道工序:
3.3.1 第一关:语言检测与过滤
目的:从混在一锅乱炖的数据里,把目标语言的内容捞出来。
- 方法:fastText 语言分类器(Meta 开源,176 种语言)、CLD2/CLD3(Google)、langdetect
- 过滤的不是"语言本身",而是确认语言后决定保留还是丢弃
# 语言检测示例
import fasttext
# 加载预训练语言检测模型(Meta 提供,176 语言)
model = fasttext.load_model('lid.176.bin')
texts = [
"今天天气真好", # zh
"The weather is nice", # en
"今日はいい天気です", # ja
"asdfghjklzxcvbnm", # 乱码
]
for text in texts:
lang, confidence = model.predict(text.replace('\n', ' '))
print(f"检测语言: {lang[0][-2:]}, 置信度: {confidence[0]:.2%}")
# 输出示例:
# 检测语言: zh, 置信度: 99.8%
# 检测语言: en, 置信度: 99.5%
# 检测语言: ja, 置信度: 99.2%
# 检测语言: en, 置信度: 9.3% ← 置信度太低,丢弃!
- 痛点:短文本(“哈哈哈”)、中英混排(“今天 release 了 new feature”)、代码段——这些会导致语言识别摇摆
- 实践:中英混合模型通常保留置信度 > 0.7 的中文或英文文本,短于 50 字符的默认丢弃(除非来自特定来源如代码仓库)
3.3.2 第二关:去重——MinHash、SimHash 与精确匹配
这是数据清洗中最容易被忽视但最重要的一步。
为什么要去重?
Common Crawl 的网页重复率高达 60%+。同一篇博客可能被 200 个镜像站复制;同一个 StackOverflow 回答出现在 50 个爬虫网站上。如果不去重:
- 模型会对高频复制的文本"过拟合"——那些被爬得最多的内容会在训练中反复出现,模型会以为它们"特别正确"
- 训练被你浪费了——同样一段文字喂 50 次,等于 49 次的算力打水漂
- 评测时数据泄露——训练集和测试集可能出现一样的文本,你以为是模型聪明,其实是它之前见过答案
三层去重策略:
Layer 1:精确去重(Exact Dedup)
目标:完全相同的文本,只保留一份。
# 精确去重示例(用哈希)
import hashlib
def exact_dedup(documents):
"""
对完全相同的文档去重
时间复杂度 O(n),空间复杂度 O(n)
"""
seen = set()
deduped = []
for doc in documents:
doc_hash = hashlib.md5(doc.encode()).hexdigest()
if doc_hash not in seen:
seen.add(doc_hash)
deduped.append(doc)
print(f"原始: {len(documents)}, 去重后: {len(deduped)}, 去除了 {len(documents)-len(deduped)} 份重复")
return deduped
- 优点:零误差,绝对不会误杀
- 缺点:只能发现完全一样的文本。把"今天天气不错"改成"今天天气挺不错"——多了一个字,MD5 完全不同,精确去重失效
Layer 2:近似去重(MinHash + LSH)
这是真正的主力军。核心思想:如果两段文本高度相似但不完全相同,要把它们找出来。
MinHash 的原理非常巧妙:
MinHash 的直觉理解:
假设两段文本 A 和 B:
A = "今天我去了北京天安门广场看升旗"
B = "今天我去了北京天安门广场看升旗仪式" ← 只多了一个词
Step 1: 把每段文本拆成 n-gram 集合(比如 3-gram)
A 的 3-gram: {"今天我", "天我去", "我去了", "去了北", "了北京", ...}
B 的 3-gram: {"今天我", "天我去", "我去了", "去了北", "了北京", ...}
Step 2: 用 K 个哈希函数处理每个 n-gram,每个函数取最小值
Step 3: K 个最小值组成一个"签名" (signature)
如果 A 和 B 的签名相似度超过阈值(如 0.8)→ 它们是近似重复,只保留一份
MinHash 的核心定理:两个集合的 MinHash 签名相似度 ≈ 它们的 Jaccard 相似度。不需要逐对比较所有文档——利用 LSH(局部敏感哈希)把签名相似的文档分到同一个桶里,只在桶内比较。
# MinHash 近似去重(伪代码 + 关键步骤)
from datasketch import MinHash, MinHashLSH
# 创建 LSH 索引
lsh = MinHashLSH(threshold=0.8, num_perm=128)
documents = {} # {doc_id: "文本内容"}
seen_docs = set()
for doc_id, text in documents.items():
# 1. 创建 MinHash 签名
m = MinHash(num_perm=128) # 128 个哈希函数
for word in text.split():
m.update(word.encode('utf8'))
# 2. 查询是否存在高度相似的文档
candidates = lsh.query(m)
if not candidates: # 没有相似文档,是"新内容"
lsh.insert(doc_id, m)
seen_docs.add(doc_id)
# 有相似文档 → 跳过(去重掉)
print(f"去重后保留: {len(seen_docs)} 篇")
Layer 3:URL/来源去重
同一篇内容即使文本不同,如果来自同一个 URL 或同一域名下的大量重复爬取,也应去重。此外,同一篇新闻稿被多家媒体转载,内容几乎一样但来源 URL 不同——这种方法用 MinHash 比用 URL 效果更好。
经验法则:
去重三件套效果一览:
- 精确去重:干掉 ~30-40% 的 CC 数据(大多数是完全复制的页面)
- MinHash 近似去重:再干掉 ~15-20%(改写、转载、回译内容)
- URL 去重:补刀 ~5%(同一来源的批量低质内容)
CC 原始数据 → 经过去重 → 剩下约 40-50%
段子时间:精确去重像用身份证查重复——同一个身份证号(MD5)一辈子只认一次。MinHash 像人脸识别——你换个发型、戴个墨镜(加几个字),我也能认出你是同一个人。前者严格但死板,后者灵活但偶尔误杀。两者配合才是王道。
3.3.3 第三关:质量过滤——从"是文本"到"是好文本"
去重之后,数据还是 40% 的原始量,但里面混着大量"是文本但不是好文本"的东西:
- 导航栏提取出来的纯文本:“首页 产品 关于我们 联系我们”
- SEO 堆砌关键词:“北京旅游 北京旅游攻略 北京旅游攻略推荐 北京旅游推荐……”
- 短到没有意义的内容:“👍” “666” “好的”
- 长到离谱但全是垃圾的机器生成文章
方法一:启发式规则过滤
最朴素但最有效的方法——设置一堆阈值:
| 规则 | 阈值 | 过滤掉的典型内容 |
|---|---|---|
| 文本长度 | 50-100,000 字符之间 | 太短的评论/太长的乱码 |
| 平均词长 | 3-10 字符 | 全是单字母的乱码 |
| 特殊符号占比 | < 30% | “???” |
| 停用词占比 | 10-90% | 只有虚词没有实词 |
| HTML/JS 残留 | < 5% | 没清理干净的网页代码 |
| 重复 n-gram 占比 | < 30%(2-gram) | “好的好的好的好的…” |
| 大写字母占比(英文) | < 50% | “HELLO HELLO HELLO” |
| 困惑度评分 | < 某个阈值 | 用轻量级语言模型打分 |
# 启发式质量过滤示例
def heuristic_filter(text):
"""快速过滤明显低质文本"""
reasons = []
# 1. 长度检查
if len(text) < 50:
reasons.append("文本过短 (< 50 字符)")
if len(text) > 100000:
reasons.append("文本过长 (> 100k 字符)")
# 2. 特殊符号占比
special_chars = sum(1 for c in text if not c.isalnum() and not c.isspace())
if special_chars / max(len(text), 1) > 0.3:
reasons.append(f"特殊符号过多 ({special_chars/len(text):.1%})")
# 3. HTML 残留检测
html_tags = ['<div', '<br', '<p>', '<a ', '<img', ' ']
html_count = sum(text.count(tag) for tag in html_tags)
if html_count > len(text) * 0.05 / 4: # 粗略估计
reasons.append("疑似含 HTML 残留")
# 4. 重复短片段检测("好的好的好的")
from collections import Counter
words = text.split()
if len(words) > 20:
word_counts = Counter(words)
most_common_ratio = word_counts.most_common(1)[0][1] / len(words)
if most_common_ratio > 0.3:
reasons.append(f"单个词'{word_counts.most_common(1)[0][0]}'重复过多")
return len(reasons) == 0, reasons
方法二:模型评分过滤
用已训练的轻量级模型给文本打"质量分":
- KenLM 困惑度评分:用 n-gram 语言模型计算文本的"困惑度"(越低越像正常文本)
- FastText 分类器:训练一个二分类器判断"高质量 vs 低质量"
- BERT 风格评分器:用预训练小模型打分(比如 DeBERTa-v3-small)
# 模型评分过滤(伪代码示例——实际系统中训练一个质量分类器)
def model_quality_filter(text, classifier, threshold=0.6):
"""
用预训练的分类器打分
classifier 是在人工标注的高/低质量数据上训练的二分类器
"""
score = classifier.predict_proba(text)[1] # "高质量"的概率
return score >= threshold, score
# 趋势:2024 年越来越多的团队开始用"大模型评估小数据"的方式
# 让 GPT-4 打分一批样本 → 训练本地轻量评分器 → 大批量评估
冷知识:Meta 在 LLaMA 3 的训练数据处理中使用了一个叫"基于困惑度的过滤 + 启发式规则融合"的多级流水线。第一步用轻量规则砍掉 60% 的垃圾,第二步用更慢但更准的模型评分针对剩余的 40% 精筛——这种"先快后准"的思路就像医院的分诊台:先让护士(启发式规则)快速判断患者严重程度,再由医生(模型评分)仔细诊断。
3.3.4 第四关:毒性过滤与偏见清洗
如果说质量过滤是为了"去除垃圾",毒性过滤就是为了"去除毒药"。
大模型如果学到了互联网上的仇恨言论、歧视内容、暴力描述,它会"学坏"——不是比喻意义上的学坏,是字面意义上的把这些有害模式内化为自己的生成能力。
需要过滤的内容类型:
| 类型 | 示例 | 危害 |
|---|---|---|
| 仇恨言论 | 种族/性别/宗教攻击 | 模型生成歧视内容 |
| 暴力/血腥 | 极端暴力描述 | 引发安全风险 |
| 色情内容 | 成人/色情文本 | 合规与伦理风险 |
| 自我伤害 | 自杀/自残相关 | 严重安全风险 |
| 非法内容 | 犯罪方法、违禁品 | 法律风险 |
| 错误信息 | 医疗/政治虚假信息 | 社会危害 |
主流过滤工具:
- Perspective API(Google/Jigsaw):专门检测网络文本的毒性,免费但有限额——会对毒性、严重毒性、侮辱、威胁等多个维度打分
- Detoxify:开源替代,基于 BERT 训练的三分类模型,不需要 API 调用
- 自定义分类器:在领域特定数据上微调 RoBERTa/DeBERTa,适应团队对"有害"的具体定义
# 毒性检测示例(使用 Detoxify——开源替代 Perspective API)
from detoxify import Detoxify
detector = Detoxify('original') # 或 'multilingual' 多语言版
texts = [
"我真的很讨厌你,你是个彻头彻尾的废物",
"今天的天气非常好,适合出去散步",
"某个民族都是劣等的",
]
for text in texts:
result = detector.predict(text)
print(f"文本: {text[:50]}...")
print(f" 毒性: {result['toxicity']:.3f}")
print(f" 严重毒性: {result['severe_toxicity']:.3f}")
print(f" 侮辱: {result['insult']:.3f}")
# 阈值通常设为 0.5-0.8,取决于团队的"过滤严格程度"
毒性过滤 vs 偏见清洗:两个不同维度的问题
- 毒性过滤:去掉"脏话"和"仇恨言论"——相对容易定义,有明确清单
- 偏见清洗:去掉"隐性歧视"——远比毒性过滤难
- 例子:"医生"的训练数据里 90% 是男性代词 → 模型学到"医生 = 他"的偏见
- 例子:"程序员"的训练数据里频繁出现"996"“脱发” → 模型学到刻板印象
- 去偏见需要在数据配比层面而非过滤层面解决——强行增补反例数据
3.3.5 第五关:PII(个人身份信息)检测与脱敏
训练数据里混着真实的手机号、身份证号、邮箱地址、家庭住址。如果不处理:
- 隐私泄露风险:用户可能通过 prompt 攻击让模型吐出训练数据中的真实个人信息
- 法律合规风险:GDPR(欧盟)、PIPL(中国)都对个人数据有严格规定
- 安全隐患:训练数据中的 API 密钥、密码等如果被模型记忆,可能通过特定 prompt 被提取出来
PII 检测的粒度:
| PII 类型 | 检测难度 | 处理方式 |
|---|---|---|
| 邮箱地址 | 简单(正则) | 替换为 [EMAIL] |
| 手机号码 | 简单(正则) | 替换为 [PHONE] |
| 身份证号 | 中等(格式校验) | 替换为 [ID_NUM] |
| IP 地址 | 简单(正则) | 替换为 [IP_ADDR] |
| 家庭地址 | 困难(需要 NER) | 实体识别后替换 |
| 人名 | 困难(保留 vs 删除的平衡) | 看场景决定 |
| API Key/密码 | 困难(模式多样) | 正则 + 熵检测 |
import re
def redact_pii(text):
"""
脱敏处理:将敏感信息替换为占位符
"""
# 1. 邮箱
text = re.sub(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}',
'[EMAIL]', text)
# 2. 中国手机号 (1xx-xxxx-xxxx)
text = re.sub(r'1[3-9]\d{9}', '[PHONE]', text)
# 3. 身份证号 (18 位或 15 位)
text = re.sub(r'\b\d{17}[\dXx]\b', '[ID_NUM]', text)
text = re.sub(r'\b\d{15}\b', '[ID_NUM]', text)
# 4. IPv4 地址
text = re.sub(r'\b(?:\d{1,3}\.){3}\d{1,3}\b', '[IP_ADDR]', text)
# 5. URL(含可能暴露信息的路径和参数)
text = re.sub(r'https?://\S+', '[URL]', text)
return text
挑战:正则只能抓"格式明显"的信息。如果有人写"我的手机是幺三八后面跟六个五",正则抓不到。更严重的是——大模型训练完后,你没法"反删除"已经学会的个人信息。最好的策略永远是从源头控制:别让 PII 进入训练集。这也是为什么 GPT-4 的训练数据几乎不包含用户与 ChatGPT 的对话——不仅是隐私问题,也是数据污染问题。
3.4 数据配比的科学:为什么不是"越多越好"
3.4.1 直觉 vs 科学
新手直觉:“多加点数据不就行了?越多越好!”
业界的回答:“那你试过把所有数据源等比例混合的效果吗?”
事实证明,不同数据源的"营养价值"完全不同:
- 1 亿条高质量的 GitHub 代码,对模型逻辑能力的提升,可能远超过 10 亿条论坛灌水帖
- 1GB 的维基百科精心处理过的内容,可能比 10GB 的未清洗网页更有价值
- 加了太多低质量数据反而会稀释高质量数据的效果——模型学到的"平均分布"被拉低了
数据配比就像配咖啡:水太多 → 淡而无味,咖啡太多 → 苦到发麻。找到最佳比例,是一门需要大量实验验证的科学。
3.4.2 DoReMi:自动找到最优数据配比
2023 年,Microsoft 和 Stanford 提出了 DoReMi(Domain Reweighting with Minimax Optimization)——一个用算法自动搜索最优数据配比的框架。
核心思路非常优雅:
DoReMi 的核心直觉:
问题:给你 5 个数据域(网页、代码、书籍、论文、论坛),
每个域的 token 数量不限。怎么配比能让模型效果最好?
传统做法:
"根据经验,网页 70%、代码 15%……" → 靠直觉拍脑袋
DoReMi 做法:
1. 先训一个小的"参考模型"(280M 参数,比目标模型小 30 倍)
2. 找出哪些域的损失下降慢 → 这些域"对模型难学习" → 加大权重
3. 自动调整每个域的采样权重
4. 用最优权重训大模型
结果:用 DoReMi 找到的配比,280M 小模型的效果
能匹敌用默认配比训练的 8B 大模型(在某些基准上)
DoReMi 最有价值的发现:不同训练阶段的最佳配比不同。 训练初期可能需要多喂"简单"数据(如 Wikipedia),帮助模型快速建立语言基础;训练后期则应该加大"困难"数据(如代码、论文)的比例,逼模型上难度。
# DoReMi 数据配比优化的核心精神(简化版伪代码)
class DoReMiOptimizer:
"""
自动搜索最优数据配比
不是真正的 DoReMi 实现,而是其核心思想的简化版
"""
def __init__(self, domains, reference_model_size=280e6):
self.domains = domains # ['web', 'code', 'books', 'wiki', 'papers']
self.ref_model = train_small_model(reference_model_size)
def optimize_weights(self, num_steps=1000):
# 初始等权重
domain_weights = {d: 1.0/len(self.domains) for d in self.domains}
for step in range(num_steps):
# 1. 用当前权重采样训练数据
batch = sample_batch(domain_weights)
# 2. 计算每个域的损失
losses = {}
for domain in self.domains:
domain_batch = batch[domain]
losses[domain] = compute_loss(self.ref_model, domain_batch)
# 3. 损失大的域 → 模型学得不好 → 加大权重
total_loss = sum(losses.values())
for domain in self.domains:
domain_weights[domain] = losses[domain] / total_loss
# 4. 平滑更新(避免剧烈震荡)
domain_weights = smooth(domain_weights, alpha=0.9)
return domain_weights
3.4.3 业界实践:各家的"秘方"
| 公司/模型 | 网页 | 代码 | 书籍/学术 | 其他 | 特别说明 |
|---|---|---|---|---|---|
| LLaMA 3 (Meta) | ~65% | ~20% | ~10% | ~5% | CC 过滤后使用 |
| DeepSeek-V3 | ~55% | ~20% | ~15% | ~10% | 中英混合,论文占比高 |
| Qwen 3 (阿里) | ~60% | ~18% | ~12% | ~10% | 36T tokens 超大语料 |
| Phi-3 (Microsoft) | ~10% | ~30% | ~55% | ~5% | 极度重视质量,数据量只有 3.3T |
| Gemma 2 (Google) | ~70% | ~15% | ~10% | ~5% | 注重安全过滤 |
**Phi-3 的"教科书策略"**是一个有趣的极端案例:Microsoft 发现用 3.3T tokens 的极其精选数据(大量教科书级别的内容)训练出来的 Phi-3-Mini(3.8B),在某些基准上能追平用 15T tokens 训练的 LLaMA 3-8B。这验证了一个重要方向:数据质量 > 数据数量。
DeepSeek-V3 的特别之处在于学术论文占比较高(约 15%),尤其在数学和代码数据上投入了大量精力。这可能解释了为什么它在 MMLU 和 HumanEval 等知识密集型基准上表现出色。
3.4.4 实验对比:数据配比的敏感性
下面是一个来自学术界的经典对比实验(结果经过多篇论文验证):
| 实验组 | 网页 | 代码 | 书籍 | 论文 | 数学推理 (GSM8K) | 代码 (HumanEval) | 综合 (MMLU) |
|---|---|---|---|---|---|---|---|
| A(网页为主) | 85% | 5% | 5% | 5% | 35.2 | 28.7 | 58.3 |
| B(均衡) | 65% | 15% | 10% | 10% | 52.1 | 45.3 | 64.8 |
| C(代码偏重) | 50% | 30% | 10% | 10% | 58.9 | 62.4 | 63.2 |
| D(书籍偏重) | 55% | 10% | 25% | 10% | 48.3 | 40.1 | 66.5 |
| E(Phi-3 风格) | 10% | 30% | 55% | 5% | 56.7 | 58.2 | 67.1 |
注:以上为多项研究结果的趋势性对比,非单一实验的精确数字
核心发现:
- 代码数据对推理能力的提升是全局性的——不只是编程能力,数学推理也受益
- 书籍/教科书的质量极高,但单靠它们会导致模型"脱离真实世界语境"
- 网页数据量虽大,但边际收益递减——超过 60% 后继续加量几乎没有额外收益
- 最优配比取决于目标:如果主攻代码助手 → 加大代码比例;如果主攻写作 → 加大书籍比例
3.5 合规与版权:大模型数据工程的"雷区"
3.5.1 版权风暴:《纽约时报》诉 OpenAI
2023 年 12 月 27 日,《纽约时报》正式起诉 OpenAI 和 Microsoft。核心指控:
“ChatGPT 的训练数据中包含了数百万篇《纽约时报》的文章,这些文章未经许可被用于训练一个与《纽约时报》直接竞争的商业产品。”
证据之一:GPT-4 能够逐字逐句复现《纽约时报》的付费文章——说明训练数据中存在原文记忆而非泛化理解。这揭示了预训练中的一个隐患:大模型不只是"学到知识",它有时会"背下原文"——这在法律上更接近未经授权的复制。
当前状态(截至 2026 年初):
- 案件仍在审理中
- OpenAI 称这是"罕见 bug"而非普遍现象,强调模型学到的是"事实和语言模式"而不是"复制原文"
- 多家媒体跟进起诉(包括多家出版集团和新闻机构)
- 部分媒体选择谈判签约(付费授权训练数据)而非诉讼——如 Axel Springer、Le Monde、Financial Times 等
影响:这不是一个孤立的官司,而是 AI 时代的"版权法拐点"。判决结果将决定——训练数据是否需要像音乐采样一样"付费使用"?如果需要,大模型的训练成本将大幅提高;如果不需要,传统出版商的内容将面临"免费出租"的困境。
3.5.2 数据集的 License 矩阵
训练数据的版权问题远比想象中复杂。以下是大模型训练中常用数据源的授权情况:
| 数据源 | License | 商用? | 主要限制 | 风险等级 |
|---|---|---|---|---|
| Common Crawl | 公共领域/各网站自管 | ⚠️ 灰色 | 遵循 robots.txt 和网站条款 | 🟡 中 |
| Wikipedia | CC BY-SA 4.0 | ✅ 可商用 | 需署名、相同方式共享 | 🟢 低 |
| GitHub 公开仓库 | 各仓库 License | ⚠️ 灰色 | MIT/GPL/Apache 等各不相同 | 🟡 中 |
| Books3 | 争议中 | ❌ | 已因版权争议被下架 | 🔴 高 |
| 学术论文 (ArXiv) | 多数 CC | ✅ | 遵循各论文版权声明 | 🟢 低 |
| Reddit 用户协议 | ❌ 已封禁 | 2024 年起 API 收费/封禁 | 🔴 高 | |
| StackOverflow | CC BY-SA | ⚠️ 受限 | 要求署名 | 🟡 中 |
几个关键教训:
- “免费可见"≠"免费可用”:你能在浏览器里读到不代表你能批量下载后喂给模型
- 开源不等于无版权:MIT License 的代码虽然允许商用,但 GPL 要求衍生作品也开源
- robots.txt 正在变成"数据使用合同":越来越多的网站用 robots.txt 明确禁止 AI 爬虫。CCBot、GPTBot 等 AI 爬虫的用户代理被大量网站列入黑名单
- 数据集的"来路"越来越重要:2024 年开始,多数开源模型会详细披露训练数据的来源和处理方式——"黑箱数据集"正在被行业淘汰
3.5.3 全球监管拼图
EU AI Act(欧盟人工智能法案,2024 年通过)
全球第一部综合性 AI 法规。对训练数据的要求:
- 训练数据摘要:通用 AI 模型提供商必须公开训练数据的"充分详细的摘要"
- 版权合规:必须遵守欧盟版权法,包括文本和数据挖掘的 opt-out 机制(权利人有权声明"我的内容不用于 AI 训练")
- 透明度义务:生成的内容需做 AI 标注
中国的数据合规框架
- 《生成式人工智能服务管理暂行办法》(2023 年 8 月生效)
- 训练数据来源合法,不侵犯知识产权
- 数据处理符合《个人信息保护法》要求
- 数据质量要求:采取有效措施提高训练数据质量
- 《数据安全法》:涉及重要数据和核心数据的分类分级保护
- 《个人信息保护法》(PIPL):个人信息的收集、处理、传输全链路合规要求
美国
- 目前没有专门的联邦 AI 法规,主要依据现有版权法和各州法律
- 2023 年拜登签署行政令要求 AI 开发商进行安全测试并向政府报告
- 各州的立法进度不一,仍处于"分头探索"阶段
3.5.4 合规清洗流程:训练前的最后一道防线
综合以上所有风险,一个"干净"的训练数据集需要经过以下合规检查:
数据合规清洗流水线
原始数据
↓
[1] 版权来源检查 → 是否为合法获取?License 是否允许商用?
↓
[2] robots.txt 过滤 → 该网站是否禁止爬取?是否有 opt-out 声明?
↓
[3] PII 脱敏 → 移除所有可识别的个人信息
↓
[4] 有害内容过滤 → 去除仇恨、暴力、非法内容
↓
[5] 偏见评估 → 检测并缓解数据中的各类偏见
↓
[6] 来源记录 → 为每条数据保留来源追溯信息
↓
训练就绪数据集
最佳实践清单:
- 记录一切:每条训练数据的来源 URL、爬取时间、License 类型,用数据库完整记录——这是未来应对法律审查的"护身符"
- 尊重 robots.txt:自动化爬取脚本中严格遵守目标网站的爬虫协议
- 建立 opt-out 机制:让内容创作者可以申请移除包含其内容的数据
- 合规审查前置:在开始训练前完成数据合规审查,而非事后补救
- 定期更新:追踪版权法和 AI 法规的最新变化,及时调整数据策略
行业现状:2024 年,合规清洗的成本已经占到训练总成本的 5-10%。有人戏称:"以前训练模型最贵的是一万张 H100 的电费,现在最贵的是一个团的版权律师。"这笑话背后是行业的真实焦虑——数据合规正在成为大模型竞争的隐形门票。
📊 本章关键图表索引
| 图表编号 | 标题 | 建议类型 | 位置 |
|---|---|---|---|
| SVG-3-1 | 大模型训练数据规模演进(2018-2025) | 柱状图/折线图 | 3.1 数据规模 |
| SVG-3-2 | 数据墙三种形态示意 | 概念图 | 3.1.2 数据墙 |
| SVG-3-3 | 大模型训练数据"食谱"饼图 | 饼图 | 3.2 数据来源 |
| SVG-3-4 | 数据清洗流水线 5 道工序 | 流程图 | 3.3 数据清洗 |
| SVG-3-5 | 去重:MinHash 算法工作原理 | 示意图 | 3.3.2 去重 |
| SVG-3-6 | DoReMi 数据配比自动优化流程 | 流程图 | 3.4.2 DoReMi |
| SVG-3-7 | 各模型数据配比对比雷达图 | 雷达图 | 3.4 数据配比 |
| SVG-3-8 | 全球 AI 数据监管法规地图 | 地图 | 3.5 合规 |
🧪 本章动手实验
实验 1:体验 MinHash 去重
pip install datasketch
from datasketch import MinHash, MinHashLSH
# 模拟两篇"差不多"的文章
article_a = "大模型训练需要大量高质量数据。数据清洗是确保模型质量的关键步骤。"
article_b = "大模型训练需要海量高质量数据。数据清洗是确保模型质量的重要步骤。"
def get_minhash(text, num_perm=128):
m = MinHash(num_perm=num_perm)
for word in text.split():
m.update(word.encode('utf8'))
return m
m1 = get_minhash(article_a)
m2 = get_minhash(article_b)
# Jaccard 相似度估算(MinHash 的核心能力)
print(f"两篇文章的 MinHash 相似度: {m1.jaccard(m2):.2%}")
# → 预期输出 ~75%-90%,尽管原文不完全一样
实验 2:用 Detoxify 检测文本毒性
pip install detoxify
from detoxify import Detoxify
detector = Detoxify('original')
# 测试几个例子
samples = [
"你做得太棒了,为你骄傲!",
"你这个废物,怎么不去死",
]
for s in samples:
scores = detector.predict(s)
print(f"\n文本: {s}")
print(f" 毒性: {scores['toxicity']:.4f}")
🤔 思考题
-
Common Crawl 里 90% 的数据是"垃圾"。如果你来设计过滤策略,你会优先砍掉哪一类垃圾?为什么?(提示:考虑过滤效率——同样的算力,砍掉哪一类收益最大)
-
DeepSeek-V3 用 558 万美元训出顶级模型,而同等能力的美国模型成本高得多。数据工程在多大程度上贡献了这个成本优势?除了数据和架构,还有哪些因素可能导致成本差异?
-
如果高质量文本数据在 2028 年真的耗尽,大模型行业会发生什么?小模型 + 精数据会不会成为新的主流路线?(Phi-3 的"教科书策略"给你什么启示?)
-
《纽约时报》诉 OpenAI 的判决可能产生两种极端结果:要么大模型公司被迫为训练数据付费(推高成本),要么"训练数据合理使用"成为法律先例。你认为哪种结果更可能发生?为什么?这对开源社区意味着什么?
下一章预告:训练目标函数——为什么 BERT 爱完形填空、GPT 爱猜下一个字?从交叉熵到 MLM 到 Next Token Prediction,理解大模型到底在"学会"什么。准备好了吗?我们要开始碰 Math 了。
更多推荐
所有评论(0)