Skip to content

数据工程与合成数据

"Garbage in, garbage out" 在大模型时代被放大了一万倍。LLaMA 3 与 LLaMA 2 架构几乎相同,效果差距主要来自数据;Phi 系列用"教科书级"数据让小模型越级打怪。数据工程是大模型团队投入人力最多、但面试资料最少的环节——这恰恰让它成为面试中的区分度题。

一、全景:预训练数据流水线

原始数据源 (Common Crawl / 代码 / 书籍 / 论文 / 对话)


文本抽取 ──► 语言识别 ──► 规则过滤 ──► 质量打分 ──► 去重 ──► 去毒/隐私 ──► 去污染 ──► 配比混合 ──► 训练
 (HTML→文本)  (fastText)   (启发式)    (模型打分)  (3 个层级)  (PII/毒性)  (评测集泄漏)  (领域权重)

漏斗极其陡峭:Common Crawl 原始数据到最终可用预训练数据,留存率通常只有个位数百分比

二、清洗流水线逐层拆解

1. 文本抽取与语言识别

  • HTML → 正文:用 trafilatura 等工具去掉导航/广告/模板(boilerplate);抽取质量直接决定后面所有环节的上限。
  • 语言识别:fastText 语言分类器按语种分流,决定每种语言进入各自的清洗管道。

2. 规则过滤(启发式)

经典规则集(源自 Gopher/C4 等工作,已成行业标配):

规则类型示例
长度过滤过短文档、平均词长异常的文档
符号比例标点/字母比、数字占比、特殊符号占比超阈值
重复结构重复行占比、重复 n-gram 占比过高(模板页/垃圾站)
完整性以项目符号开头的行占比、不以标点结尾的行占比
黑名单色情/赌博站点域名、关键词

3. 模型质量打分

规则只能去掉"明显的垃圾",区分"普通文本 vs 高质量文本"需要模型:

  • 分类器打分:训练 fastText/BERT 小分类器,正样本用维基、书籍、被高赞引用的页面,给每篇文档打质量分,按分数采样。
  • 困惑度过滤:用 KenLM 等小语言模型算 PPL,过高(不通顺)或过低(高度模板化)都可疑。
  • LLM 打分:FineWeb-Edu 的做法——用 LLM 按"教育价值"给文档打 0-5 分,再蒸馏成小分类器大规模应用。质量分类器已成为新一代数据集(FineWeb/DCLM)拉开差距的核心

4. 去重(三个层级)

层级方法说明
精确去重文档哈希(MD5/SHA)去掉完全相同的文档
模糊去重MinHash + LSH工业主力:估计文档间 Jaccard 相似度,去掉近重复(转载/小改动)
子串去重后缀数组找长公共子串去掉文档内/跨文档的长重复片段

为什么去重如此重要:重复数据会让模型记忆而非泛化(重复样本相当于变相加大其权重),加剧训练数据被原样背出的风险(隐私/版权),且浪费算力。研究表明适度去重能在同样算力下显著提升模型质量。

MinHash 一句话原理:对每篇文档的 n-gram 集合做多个随机哈希、各取最小值组成签名;两篇文档签名相同位置的比例 ≈ Jaccard 相似度。LSH 把签名分桶,只对同桶文档精算,避免两两比较的 $O(N^2)$。

5. 去毒、隐私与去污染

  • 毒性过滤:分类器去除仇恨/暴力内容(注意过度过滤会误伤方言、少数群体相关文本——这本身是个研究课题)。
  • PII 处理:识别并删除/替换邮箱、电话、身份证号等个人信息。
  • 基准去污染(decontamination):从训练数据中删除与评测集(MMLU、GSM8K 等)重叠的 n-gram。污染会让榜单分数虚高但真实能力不变,是"刷榜"质疑的核心,见 评测基准深入

三、数据配比与训练课程

配比(Data Mixture)

各领域数据按什么比例混合,直接影响模型能力分布:

  • 网页占大头(广覆盖),代码和数学占比近年持续上调——业界共识:代码数据不仅提升编程能力,还提升通用推理能力
  • 多语言配比决定各语言能力;中文模型必须保证足够中文语料与配套词表(见 LLaMA 与 Qwen)。
  • DoReMi 等方法用小模型自动搜索最优配比,再迁移到大模型训练。

课程(Curriculum):数据顺序也有讲究

现代预训练普遍分阶段:

阶段一:主预训练 —— 海量混合数据(数 T 至数十 T tokens)
阶段二:退火/中期训练 —— 提高高质量数据(教科书、数学、代码)占比,
        学习率衰减收尾,常配合上采样精品数据
阶段三:长上下文扩展 —— 长文档继续预训练,扩 RoPE base

LLaMA 3 在退火阶段上采样高质量数据被证明对基准成绩有显著提升——"最后喂的数据印象最深"。

四、合成数据:从补充到主力

真实高质量数据接近耗尽("数据墙"),合成数据已从补充变成新模型的主要增量来源。

主要技术路线

方法思路代表
Self-Instruct用 LLM 从种子任务扩写指令数据早期 Alpaca
Evol-Instruct让 LLM 把指令改写得更复杂/更深WizardLM
蒸馏强模型生成回答训练弱模型大量开源 Instruct 模型
教科书合成让 LLM 按主题撰写教学级语料用于预训练Phi 系列
拒绝采样采样多个回答,用 RM/规则筛出最优入库LLaMA 3 后训练
自我提升模型自己生成-筛选-训练循环迭代R1 蒸馏数据、RFT

合成数据的风险

  • 模型坍缩(model collapse):反复用模型输出训练模型,分布尾部信息逐代丢失、多样性塌缩。对策:始终混合真实数据、用验证器/RM 过滤、控制合成比例。
  • 偏差继承:教师模型的错误与风格偏好被放大固化。
  • 同质化:不同团队用同一个强模型蒸馏,模型间风格趋同。

关键认知:合成数据的价值核心在验证器——数学可判对错、代码可跑测试,所以数学/代码合成数据最成功;无法验证的开放域合成数据质量保障要难得多。这与 RLVR 火爆的原因同源(见 强化学习基础)。

五、SFT 阶段的数据工程

预训练看"量+质",SFT 看"质+多样性",逻辑完全不同:

  • 质量 >> 数量:LIMA 用 1000 条精选数据对齐出高质量对话模型,证明 SFT 主要是"激发"预训练已有能力而非注入新知识。
  • 多样性:任务类型、难度、长度、语言风格的覆盖比条数重要;大量近似重复的指令会让模型过拟合到固定句式。
  • 难度分级:从模型答错的样本里挑训练数据(错题本思路)比随机采样有效。
  • 数据筛选自动化:IFD、指令跟随难度评分等方法自动从大池子里挑高价值样本。
  • 格式即数据:loss mask(只算回答部分损失)、多轮对话的拼接方式、系统提示的多样化,都是 SFT 数据工程的一部分,详见 微调范式

高频追问

Q:去重为什么用 MinHash 而不是两两比较或 embedding 聚类? 两两比较是 $O(N^2)$,十亿级文档不可行;embedding 聚类计算贵且阈值难定。MinHash+LSH 把"找相似对"降到近似线性:签名计算可完全并行,LSH 分桶保证只比较候选对。代价是概率近似(有少量漏检/误检),对去重任务完全可接受。

Q:怎么判断预训练数据是否污染了评测集? n-gram 重叠检测(如 13-gram 命中即标记)、最长公共子串比例、embedding 相似度。但完全防住很难:评测题的改写版本、翻译版本都可能漏网。所以更可信的做法是用全新构造的私有评测集或对比"公开题 vs 新题"的成绩差(差距大 = 疑似污染)。

Q:代码数据为什么能提升通用推理能力? 主流解释:代码是强逻辑结构化文本——严格的依赖关系、状态跟踪、逐步执行的过程结构,迫使模型学习长程依赖与过程性推理;注释-代码对照还提供了"自然语言 ↔ 形式化"的对齐信号。实证上代码占比与推理基准成绩正相关已是普遍观察。

Q:数据快用完了怎么办(数据墙问题)? 四条路:① 合成数据(配验证器保质量);② 多模态数据(图像/视频/语音的信息远未挖尽);③ 提高数据利用效率(多 epoch 训练的边际收益研究、课程学习);④ 把算力从预训练转向后训练/推理时计算(test-time scaling,见 推理模型与慢思考)。

Q:SFT 数据 1 万条和 100 万条怎么选? 先问目标:对齐通用对话风格 → 万级精选数据足够(LIMA 结论);注入领域知识/复杂技能 → 量要上去,但更应考虑继续预训练 + SFT 组合。盲目堆 SFT 数据的常见恶果:通用能力退化(灾难性遗忘)、回答风格僵化。质量评估先行,再谈规模。

Q:如果让你从零搭建一条中文预训练数据管线,你会怎么设计? 按漏斗作答:CC + 中文网页源 → trafilatura 抽取 → fastText 语种过滤 → Gopher 式规则过滤(针对中文调阈值,如字符比、长度按字数)→ 质量分类器(正样本用百科/出版物训练)→ MinHash 去重(中文按字或词 n-gram)→ PII/毒性过滤 → 评测集去污染 → 配比实验(小模型代理实验定配比)→ 退火阶段预留精品数据。能完整说出漏斗 + 中文特殊处理(分词、繁简、全半角)即是高分答案。

基于 MIT 许可发布