数据是大模型的燃料。2026年,随着高质量互联网文本逐渐枯竭,数据治理已成为决定模型能力上限的关键瓶颈。GPT-5的训练使用了超过50T tokens的数据,其数据管线复杂度远超大多数工程系统。本文将系统梳理这条全链路。

1. 数据采集与来源分类

1.1 数据来源全景

来源类型占比(典型)质量等级典型数据集
网页爬取40-50%Common Crawl, RefinedWeb
书籍10-15%Books3, BookCorpus
学术论文5-10%arXiv, S2ORC
代码5-10%The Stack, GitHub
对话数据5-10%Reddit, Stack Overflow
专有数据10-20%极高企业内部数据
合成数据5-15%可变LLM生成数据

1.2 合成数据的崛起

2026年最重要的趋势是合成数据成为预训练的重要组成。Phi-4和GPT-5均大量使用合成数据:

# 合成数据生成的典型pipeline
synthetic_pipeline = {
    "seed_topics": "从高质量知识图谱采样种子主题",
    "generation": "使用强模型生成多角度、多深度的内容",
    "filtering": "使用reward model过滤低质量生成",
    "deduplication": "MinHash + LSH去重",
    "verification": "使用验证器检查事实准确性"
}

关键发现:合成数据的多样性数量更重要。10万条覆盖10万个主题的合成数据,比100万条覆盖1万个主题的数据训练效果更好。

2. 数据清洗全链路

2.1 文本提取

从HTML中提取正文是最基础但也最容易出错的环节:

def extract_text(html: str) -> str:
    # 1. 使用trafilatura提取正文
    text = trafilatura.extract(html, include_links=False, include_tables=True)
    
    # 2. 去除模板化内容(导航栏、页脚等)
    boilerplate_ratio = compute_boilerplate_ratio(text, html)
    if boilerplate_ratio > 0.5:
        text = clean_boilerplate(text)
    
    # 3. 语言检测
    lang = fasttext.predict(text)
    if lang not in TARGET_LANGS:
        return None
    
    # 4. 编码修复
    text = ftfy.fix_text(text)
    
    return text

2.2 质量过滤

2026年的质量过滤已从简单规则发展为多级分类系统:

第一级:规则过滤

  • 文本长度 < 50 字符 → 丢弃
  • 字符级n-gram重复率 > 0.3 → 丢弃
  • 特殊符号占比 > 0.15 → 丢弃
  • 纯大写/纯小写占比 > 0.8 → 丢弃

第二级:模型过滤

使用轻量级分类器(如fasttext或蒸馏的小型BERT)评估文本质量:

$$\text{quality_score} = \sigma(W_2 \cdot \text{ReLU}(W_1 \cdot \text{pool}(x) + b_1) + b_2)$$

训练数据来自人工标注的高质量/低质量样本对。阈值通常设在0.5-0.7之间。

第三级:LLM-as-Judge

对采样数据使用GPT-4级别模型进行质量评分:

quality_prompt = """
请评估以下文本的质量,从1-5分打分:
1分:垃圾内容,无法理解
2分:质量很低,大量语法错误
3分:质量一般,可读但信息量少
4分:质量较好,信息丰富,表达清晰
5分:质量极高,专业、准确、深入

文本:{text}

评分(1-5):
"""

2.3 去重

去重是数据治理中最耗资源的环节,但对模型性能影响最大。

去重方法粒度计算复杂度召回率
精确匹配文档级O(n)100%
MinHash-LSH文档级O(n)~95%
SimHash文档级O(n)~90%
Sentence-BERT语义级O(n²)~85%
Contamination Detectionn-gram级O(n)~80%
# MinHash-LSH去重实现
from datasketch import MinHash, MinHashLSH

def deduplicate_documents(docs, threshold=0.8, num_perm=128):
    lsh = MinHashLSH(threshold=threshold, num_perm=num_perm)
    
    for doc_id, doc in enumerate(docs):
        mh = MinHash(num_perm=num_perm)
        # 使用3-gram作为shingle
        shingles = set(get_ngrams(doc, n=3))
        for s in shingles:
            mh.update(s.encode('utf-8'))
        
        # 检查相似文档
        similar = lsh.query(mh)
        if not similar:
            lsh.insert(str(doc_id), mh)
            yield doc  # 保留该文档

2.4 有害内容过滤

2026年的安全过滤已从关键词匹配升级为多维度分类系统:

  • 毒性检测:使用Perspective API或自训练模型检测仇恨、暴力内容
  • PII过滤:正则+NER双重过滤,移除邮箱、电话、身份证号等
  • 版权检测:与已知版权语料比对,过滤相似度过高的内容
  • CSAM过滤:通过PhotoDNA哈希匹配

3. 数据质量评估体系

3.1 量化指标

建立多维度的数据质量评估体系:

class DataQualityMetrics:
    def __init__(self):
        self.dimensions = {
            "diversity": "主题覆盖度,使用LDA或BERT聚类计算",
            "richness": "词汇丰富度,Type-Token Ratio",
            "coherence": "文本连贯性,使用连贯性模型评分",
            "factuality": "事实准确性,与知识库交叉验证",
            "freshness": "时效性,基于发布时间",
            "coverage": "领域覆盖度,按预定义领域分类"
        }
    
    def compute_overall_score(self, dataset):
        scores = {}
        for dim, method in self.dimensions.items():
            scores[dim] = evaluate(dataset, dim)
        
        # 加权综合评分
        weights = {
            "diversity": 0.25,
            "richness": 0.15,
            "coherence": 0.20,
            "factuality": 0.20,
            "freshness": 0.10,
            "coverage": 0.10
        }
        return sum(scores[k] * weights[k] for k in weights)

3.2 数据配比优化

不同数据来源的配比对模型能力有显著影响。2026年的经验配比:

模型规模网页学术代码书籍对话合成
7B45%10%15%10%10%10%
70B35%15%15%15%10%10%
400B+30%15%15%15%10%15%

关键发现:代码数据的配比不仅影响代码能力,还显著提升模型的逻辑推理能力。15%的代码配比是一个关键拐点。

4. 数据污染检测

4.1 Benchmark污染

确保训练集不含评测集内容是数据治理的底线:

def detect_contamination(train_data, eval_data, ngram_size=13):
    """使用n-gram匹配检测benchmark污染"""
    eval_ngrams = set()
    for text in eval_data:
        for i in range(len(text) - ngram_size + 1):
            eval_ngrams.add(text[i:i+ngram_size].lower())
    
    contaminated = []
    for doc_id, text in enumerate(train_data):
        matches = 0
        for i in range(len(text) - ngram_size + 1):
            if text[i:i+ngram_size].lower() in eval_ngrams:
                matches += 1
        contamination_rate = matches / max(1, len(text) - ngram_size + 1)
        if contamination_rate > 0.01:  # 1%阈值
            contaminated.append((doc_id, contamination_rate))
    
    return contaminated

4.2 跨数据集去重

大规模训练中,同一内容可能出现在多个来源(如维基百科既出现在网页爬取中,也出现在专门数据集中)。跨数据集去重需要在全量数据上运行全局去重。

5. 持续数据维护

数据治理不是一次性工程。模型迭代过程中,数据也需要持续维护:

  1. 版本管理:使用DVC或类似工具管理数据版本,确保可复现
  2. 数据监控:监控数据分布偏移,当新数据与历史数据分布差异过大时告警
  3. 反馈循环:将模型在部署中发现的问题反馈到数据管线,定向补充数据
  4. 合规审计:定期审计数据来源合规性,确保数据使用符合许可协议

6. 总结

数据治理是大模型训练中最容易被低估的环节。2026年的实践表明,相同架构和训练算力下,优质数据管线可以将模型性能提升15-30%。数据治理的工程能力正在成为AI公司的核心竞争壁垒。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。