如果大模型是一道菜,那预训练数据就是食材。你用烂菜叶子炒出来的,米其林三星主厨也救不了。


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 多语言 全源混合 未公开

这张表透露了三个关键信号

  1. 数据量每 18 个月翻 3-5 倍,增速远超摩尔定律。BERT 吃 16GB,GPT-3 吃 570GB,LLaMA 3 直接飙到 15 万亿 token——差不多把整个互联网上值得读的文字全吞了。

  2. "数据墙"正在逼近。15T token 是什么概念?高质量英文文本的年产量估计在 1-3T token 左右。也就是说,LLaMA 3 用掉了人类过去十几年积累的优质文字。下一代模型吃什么?这已经不是钱的问题了——你拿 10 亿美元也买不到不存在的文字。

  3. 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 要分成了。大模型像一只饿极了的饕餮,把互联网翻了个底朝天,最后绝望地发现——最好吃的馆子都不让进了。

数据墙倒逼出来的新技术方向

  1. 合成数据:用大模型自己生成训练数据。GPT-4 的后代模型部分用 AI 生成文本训练。问题是——这像不像"吃自己的尾巴"?模型的能力上限被自我封死,错误可能被无限循环放大。

  2. 数据效率研究:Chinchilla 定律说每参数对应约 20 tokens 最优,但能不能"喂得少、学得多"?更好的数据配比、课程学习(先喂简单再喂难的)、主动数据选择——每个方向都在被大火力猛攻。

  3. 多模态扩展:文字不够了,开始吃视频、图片、音频。YouTube 上有海量"会说人话"的视频——画面+字幕+语音,比纯文字的信息密度高几个量级。这就是 GPT-4V/Gemini/Qwen-VL 等多模态模型的价值方向。

  4. 版权谈判与合作: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% 的高质量文本是英文。英文模型从出生就泡在数据海洋里。

中文模型的特殊挑战

  1. 高质量中文数据远少于英文:虽然中文使用人口世界第一,但互联网上高质量中文内容占比不到 20%
  2. 中文分词是额外的复杂度:英文天然空格分隔,中文需要先做分词。分词错误会传导到后续所有环节
  3. 数据清洗更难:中文网络广告、爬虫垃圾、低质"内容农场"的密度高于英文

不同模型的策略

模型 中文占比 策略
Qwen 系列 约 30-40% 深度中英混合训练,中文效果第一梯队
DeepSeek-V3 约 35-45% 中英为主,多语言为辅
LLaMA 3 < 5% 英文为主,中文靠"顺便学"
ChatGLM 约 50%+ 中英双语深度训练
Baichuan 约 60%+ 中文优先策略

核心直觉:中文数据不是"少用点无所谓",而是"不用够就瘸腿"。但完全用中文也不行——因为前面提到过,代码和论文以英文为主,不用这些数据模型逻辑能力会大幅下降。所以主流中文模型都在走 “中英混合 + 代码 + 论文” 的路线。

多语言数据的价值不限于"支持更多语种":

  • 跨语言迁移:用英文教模型学数学推理,它能把数学能力迁移到中文。DeepSeek-V3 的论文中明确提到多语言数据对跨语言能力有显著提升
  • 多语对齐:中英混合训练让模型天然具备翻译能力——不需要专门的翻译训练
  • 数据多样性:不同语言的文化背景和表达习惯增加了训练的多样性,降低过拟合风险

3.3 数据清洗 Pipeline:大模型的"净水系统"

如果 Common Crawl 是"原水",那数据清洗流水线就是自来水厂的净化系统。跳一步,出来的就是"脏水"。

一段"原汤化原食"的 CC 网页数据,需要经过至少 5 道工序:

原始网页 CC Raw

1. 语言检测与过滤

2. 去重 精准去重+近似去重

3. 质量过滤 启发式+模型评分

4. 毒性过滤 有害内容+偏见

5. PII 脱敏 个人信息移除

6. 格式化与分词 统一格式→tokenize

干净数据集 Ready-to-Train


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 个爬虫网站上。如果不去重:

  1. 模型会对高频复制的文本"过拟合"——那些被爬得最多的内容会在训练中反复出现,模型会以为它们"特别正确"
  2. 训练被你浪费了——同样一段文字喂 50 次,等于 49 次的算力打水漂
  3. 评测时数据泄露——训练集和测试集可能出现一样的文本,你以为是模型聪明,其实是它之前见过答案

三层去重策略

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', '&nbsp']
    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(个人身份信息)检测与脱敏

训练数据里混着真实的手机号、身份证号、邮箱地址、家庭住址。如果不处理:

  1. 隐私泄露风险:用户可能通过 prompt 攻击让模型吐出训练数据中的真实个人信息
  2. 法律合规风险:GDPR(欧盟)、PIPL(中国)都对个人数据有严格规定
  3. 安全隐患:训练数据中的 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

注:以上为多项研究结果的趋势性对比,非单一实验的精确数字

核心发现

  1. 代码数据对推理能力的提升是全局性的——不只是编程能力,数学推理也受益
  2. 书籍/教科书的质量极高,但单靠它们会导致模型"脱离真实世界语境"
  3. 网页数据量虽大,但边际收益递减——超过 60% 后继续加量几乎没有额外收益
  4. 最优配比取决于目标:如果主攻代码助手 → 加大代码比例;如果主攻写作 → 加大书籍比例

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 Reddit 用户协议 ❌ 已封禁 2024 年起 API 收费/封禁 🔴 高
StackOverflow CC BY-SA ⚠️ 受限 要求署名 🟡 中

几个关键教训

  1. “免费可见"≠"免费可用”:你能在浏览器里读到不代表你能批量下载后喂给模型
  2. 开源不等于无版权:MIT License 的代码虽然允许商用,但 GPL 要求衍生作品也开源
  3. robots.txt 正在变成"数据使用合同":越来越多的网站用 robots.txt 明确禁止 AI 爬虫。CCBot、GPTBot 等 AI 爬虫的用户代理被大量网站列入黑名单
  4. 数据集的"来路"越来越重要: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] 来源记录  →  为每条数据保留来源追溯信息
     ↓
  训练就绪数据集

最佳实践清单

  1. 记录一切:每条训练数据的来源 URL、爬取时间、License 类型,用数据库完整记录——这是未来应对法律审查的"护身符"
  2. 尊重 robots.txt:自动化爬取脚本中严格遵守目标网站的爬虫协议
  3. 建立 opt-out 机制:让内容创作者可以申请移除包含其内容的数据
  4. 合规审查前置:在开始训练前完成数据合规审查,而非事后补救
  5. 定期更新:追踪版权法和 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}")

🤔 思考题

  1. Common Crawl 里 90% 的数据是"垃圾"。如果你来设计过滤策略,你会优先砍掉哪一类垃圾?为什么?(提示:考虑过滤效率——同样的算力,砍掉哪一类收益最大)

  2. DeepSeek-V3 用 558 万美元训出顶级模型,而同等能力的美国模型成本高得多。数据工程在多大程度上贡献了这个成本优势?除了数据和架构,还有哪些因素可能导致成本差异?

  3. 如果高质量文本数据在 2028 年真的耗尽,大模型行业会发生什么?小模型 + 精数据会不会成为新的主流路线?(Phi-3 的"教科书策略"给你什么启示?)

  4. 《纽约时报》诉 OpenAI 的判决可能产生两种极端结果:要么大模型公司被迫为训练数据付费(推高成本),要么"训练数据合理使用"成为法律先例。你认为哪种结果更可能发生?为什么?这对开源社区意味着什么?


下一章预告:训练目标函数——为什么 BERT 爱完形填空、GPT 爱猜下一个字?从交叉熵到 MLM 到 Next Token Prediction,理解大模型到底在"学会"什么。准备好了吗?我们要开始碰 Math 了。

更多推荐