返回列表

LLM 预训练数据处理流水线

2026/08/29 Verified Content
LLM 预训练数据处理流水线

原始数据长什么样

大规模预训练数据主要来自几类源头。最大宗的是网页爬取,代表是 Common Crawl——一个持续爬取互联网的公开项目,每个月产出几百 TB 的原始网页快照,格式是 WARC(Web ARChive),里面混杂完整的 HTML、HTTP 头、脚本、广告代码、导航栏文字、Cookie 提示、乱码编码等等,文本信号和噪声混在一起,比例大概是"少量正文、大量垃圾"。第二类是结构化或半结构化的高质量源,比如 Wikipedia 的 XML dump、书籍语料(Project Gutenberg、图书扫描 OCR 出来的文本)、学术论文(arXiv、PubMed)、代码仓库(GitHub 的公开代码,通常按 license 过滤)。第三类是对话和问答类数据,比如 Reddit 帖子及评论树、StackExchange 问答、论坛数据。第四类是这几年越来越重要的合成数据,比如用强模型生成的教科书体文本(TinyStories 就是典型例子,由 GPT-3.5/4 生成)、指令跟随数据、思维链数据。原始形态上,网页数据几乎全是"脏"的——重复内容、模板文字、乱码、非目标语言、成人内容、隐私信息、版权敏感内容全都在里面,这也是为什么后面要花这么大力气清洗。

第一步:提取与格式转换

WARC 格式的原始网页第一步是从 HTML 中提取正文文本,去掉标签、脚本、样式表,这一步叫 boilerplate removal(模板去除),常用工具历史上有 jusText、trafilatura、Resiliparse 等,目标是把"一个网页"变成"一段干净的自然语言文本 + 少量元数据(URL、抓取时间、语言标签)"。这一步做得好坏直接决定后面数据质量的天花板:提取过头会丢掉正文,提取不够会留下大量导航菜单、footer 版权声明这类噪声。

第二步:语言识别与领域粗分类

用 fastText 之类的轻量分类器给每条文本打语言标签,通常只保留目标语言(比如只留英文,或者按比例保留多语言)。这一步顺带会做粗粒度的内容分类,比如识别出成人内容、赌博、极端主义内容等需要过滤的类别。这一步产出的是"这条数据是什么语言、属于什么大类"的元数据标签,还不是最终的取舍。

第三步:质量过滤

这是最核心也最琐碎的一步,通常是一长串规则加模型的组合,比如:

按启发式规则过滤,例如平均单词长度是否异常、符号字符占比是否过高、是否包含过多重复的行或段落、文档长度是否过短、是否含有过多的"点击这里""立即购买"之类的样板短语(Gopher/C4 这些公开数据集论文里详细列过这类规则,业界叫 heuristic filtering)。

按困惑度过滤,用一个小型语言模型给每条文本打分,困惑度异常高(说明文本不像自然语言,可能是乱码或机器生成的垃圾)或者异常低(可能是高度重复、模板化的内容)的直接丢弃。

按分类器过滤,训练一个"好文本 vs 坏文本"的二分类器(比如用 Wikipedia + 精选书籍作为正例,随机网页作为负例),给每条网页数据打分排序,只保留分数高的部分——FineWeb-Edu、DCLM 这类近两年公开的高质量数据集就是这么做的,用一个教育价值分类器筛选网页。

第四步:去重

网页数据里存在大量近乎重复或完全重复的内容(转载文章、镜像站点、模板页面),去重通常分两个粒度:精确去重用哈希(比如整篇文档做 MD5/SHA 比对,完全一样的直接删掉一份);近似去重用 MinHash + LSH(Locality Sensitive Hashing)这类技术,能找出"内容高度相似但不完全一样"的文档对(比如同一篇文章被不同网站转载并做了小幅改写),按相似度阈值去重。去重不仅是为了省存储,更重要的是防止模型对高频重复内容过拟合,也和训练数据"污染"评测集有关(如果测试集内容混进了训练集,模型的评测分数会虚高)。

第五步:内容安全与敏感信息处理

包括过滤违法有害内容(儿童性剥削材料、暴力极端内容等,这一步通常是零容忍、多层过滤),以及 PII(个人身份信息)脱敏——识别并遮蔽或删除邮箱、电话号码、身份证号、家庭地址等能定位到具体个人的信息。这一步在负责任的数据处理流程里是硬性要求,也是这几年因为隐私法规(GDPR等)越来越受重视的环节。

第六步:版权与授权核对

判断数据来源的授权状态:是完全开放版权(如 Wikipedia 的 CC-BY-SA、Public Domain 书籍)、是"抓取但存在灰色地带"(大部分网页数据严格说都涉及版权归属问题,这也是当前 AI 行业诉讼的焦点),还是明确禁止抓取(比如 robots.txt 禁止的站点,理论上应该尊重)。你项目里的 LICENSE_DATASET.md 提到的"公开分发前需要核对 Wikimedia 使用条款"就是这个环节的一个缩影,只是真实工业管线要对成千上万个数据源分别核实。

第七步:分类与配比(data mixing)

清洗去重完的数据不是简单拼接起来训练,而是按类别(网页、代码、书籍、论文、对话、数学题等)分别计算总量,然后人为设定一个"配比"(mixing ratio),比如让代码占 10%、数学题占 5%、高质量书籍适当上采样(即使它占原始数据比例很小,也故意多训几遍)、低质量网页降采样。这个配比对模型最终能力的影响非常大,是各大实验室的核心调参对象之一,Llama 3、GPT-4 之类的技术报告都会花大篇幅讲数据配比策略,但具体数字通常不公开。

第八步:分词器训练

不像你项目里直接用"一个字节一个 token"的透明方案,真实 LLM 会先在清洗后的语料上训练一个子词分词器,主流是 BPE(Byte-Pair Encoding)或者 SentencePiece 的变体。分词器训练本身是一次独立的数据处理任务:统计语料里的字符/字节共现频率,逐步合并出几万到十几万个 token 的词表。这一步决定了后续所有训练数据的"最终形态"——同一段文本用不同分词器编码出来的 token 数量可能差很多,直接影响训练成本和上下文窗口的实际容量。

第九步:打包成训练格式

分词之后,文本会被打包成定长序列(类似你项目里 ByteCorpus.random_batch 干的事,只是量级大得多),通常用"文档拼接 + 特殊分隔符"的方式把多篇文档首尾相连填满一个固定长度的窗口,避免 padding 浪费算力,同时插入 <eos> 之类的边界标记让模型学会"一篇文档结束了"。

第十步:质量分层与课程式训练(部分实验室会做)

一些较新的方法会把清洗后的数据按质量分层,训练时先用海量中等质量数据打基础,训练末期切换到少量高质量、高信息密度的数据做"退火"(annealing)阶段,这是近两年(如 MiniCPM、Llama 3 技术报告)提到的做法,能用较小计算量提升最终效果。

Join the discussion

正在确认登录状态...
暂时还没有评论,快来抢沙发~