AI正在吃光互联网,这句话听起来像标题党,但放在大模型训练数据这个领域,它已经是很多人认真讨论的现实问题。AI大模型需要的不是普通网页,而是经过清洗、去重、质量过滤的高质量文本;可整个互联网里,真正达到训练标准的内容增长得很慢,训练消耗却成倍增加。这篇文章不打算讲宏大叙事,只讲数据缺口是怎么出现的、你能观察到什么信号、以及个人和团队可以用哪些更稳的方法应对。适合做模型训练、数据工程、AI应用开发和内容平台的人看。
1. AI训练数据为什么这么能吃——先看清消耗逻辑
1.1 一个大模型预训练要消耗多少文本
一个现代大模型在预训练阶段要看的文本量,常见公开信息里已经达到数万亿token的级别。token可以粗略理解为词或子词单元,数万亿token对应下来,就是几十GB到十几TB的原始文本。这还只是预训练,后面还有指令微调、人类反馈对齐、多轮对话数据,每一环都在消耗数据。
数据消耗增长得非常快。一方面模型参数规模变大,需要更多样本来稳定学完参数;另一方面,训练策略从单轮变成多阶段,对数据种类和质量的要求也变高。所以很多团队不是在“用数据”,而是在“吞数据”。如果把一个模型比作一台车,数据就是燃油,参数和训练方法是发动机。现在发动机越做越大,燃油却没同步增产。
我见过不少团队在数据量上遇到的问题:模型能力上不去,老板第一反应是“再加数据”,但加数据之前,大家往往没有问一句:这些数据里还有多少是模型没见过的?如果只是一遍又一遍喂同样的公开语料,训练时长变长,收益却不一定变高。
1.2 互联网网页多,不代表合格语料多
有人说互联网有几十亿个页面,怎么会缺数据。这就需要把“网页数量”和“合格语料”分开。
常见的数据清洗流程会去掉大量内容:广告导航、无意义评论、乱码文本、商品页面、重复转载、机器翻译的劣质内容、带有隐私信息的页面等等。一步一层筛下来,原始抓取文本的保留率经常只有个位数到百分之二三十。也就是说,一个大规模网页快照看起来是几十TB,经过质量过滤和去重之后,可能只剩几TB真正适合训练。
举个例子:你从某个网页快照拿到一个页面,里面有正文、导航、广告、评论区、推荐位。如果直接把整个页面喂给模型,模型会学到很多无关模式。所以通常要抽取正文、去掉标签、再做语言检测。这个过程会丢掉大量内容。如果你的语料来源比较单一,比如只采集某个文档站,保留率可能高一些;如果来源是多平台聚合,保留率会低很多。
这里还要考虑语言分布。中文、英文、代码、多语种数据的丰度不一样,小语种和垂直专业语料更稀缺。所谓“吃光互联网”,更准确的说法是:互联网上那些内容完整、表达规范、结构清晰、能提升模型能力的文本,正在被快速消耗。
1.3 边际收益递减:数据量不再自动等于模型能力
前几年扩展法则给很多人留下了“数据越多,模型越强”的直观印象。但扩展法则有一个前提:新增数据要有新的信息量。如果反复喂同一批网页,模型对这部分数据的loss会很快下降,但当数据覆盖的知识已经学完之后,再加更多重复文本,收益就变得非常小。
我在实际项目里最直观的感受是:同一个公开语料库跑第二次,loss下降的幅度远低于第一次。加大模型容量、延长训练,如果数据分布没有变化,模型也只是在记住旧数据的细节。所以数据荒真正的杀伤力不在于“网络没内容了”,而在于“对模型提升有帮助的新内容变少了”。
如果团队里有人提出“把数据量翻倍”,我会先让他回答三个问题:
- 新增数据里有多少是现有语料里没有的新内容?
- 新增数据的领域分布是否和目标任务匹配?
- 这些数据经过清洗后预计保留率是多少?
答不上来,就不要急着加量。先把数据分层和去重做好,往往比继续抓取更有效。
2. 数据枯竭不是预言,是已经能看到的几个信号
2.1 重复数据反复训练,收益越来越低
第一类信号来自训练曲线。如果你有一份固定语料,反复跑多个epoch,会发现验证集loss曲线越来越平。如果你把公开语料按来源去重后,实际可用数据量比原始抓取量少很多,这时候再增加epoch,收益也不大。说明这批数据的信息量已经被榨得差不多了。
可以从工程上做一个简单实验:取一份原始语料,分别做“仅URL去重”和“正文去重”,再用小模型各训练同一轮,看loss差异。如果正文去重带来的提升比增加数据量更明显,说明你的数据里重复内容占比很高。这时候最应该做的不是继续加量,而是先做更彻底的去重。
观察训练曲线时,我一般会同时看两个指标:训练集loss和独立验证集loss。如果训练集loss一直降,但验证集loss不降或者上升,可能是过拟合,也可能是数据重复太多导致泛化能力被耗尽了。前者调整训练策略,后者必须回到数据层处理。
2.2 评测集污染让分数失真
第二个信号是公开评测集越来越难反映真实能力。很多评测题是从互联网上收集的,模型预训练数据里可能已经包含这些题目。后训练阶段如果又用类似题做验证,分数会虚高,但模型在真实场景里并没有那么强。
要主动做污染检测:把训练集和评测集做n-gram重叠统计,看同一道题或相似表述是否出现在训练数据里。常见做法是取8到13个词的连续片段,如果重叠率过高,就要把评测集里那些命中样本剔除,或者换一批私有评测题。这个步骤在数据工程里应该默认开启,不能等模型上线后再发现。
这里有一段简易的检测思路,用伪代码表示:
def ngram_overlap_rate(train_text, eval_text, n=8): train_ngrams = build_ngrams(train_text, n) eval_ngrams = build_ngrams(eval_text, n) hit = sum(1 for ng in eval_ngrams if ng in train_ngrams) return hit / len(eval_ngrams)如果这个比例超过1%到5%,就要警惕了。具体阈值看任务,但核心原则是:评测样本越干净,模型分数才越有说服力。
2.3 数据治理和版权成本开始压过采集成本
第三个信号是数据团队的工作重心变了。以前抓数据、存数据是主要成本,现在清洗、去重、版权管理、隐私保护、平台授权协商这些环节的成本越来越高。你需要投入人力去维护数据来源清单、给每个样本记录来源、处理各类数据使用限制。这些工作不直接提升模型指标,但如果不做,后续风险会很大。
如果发现团队里“数据清理工程师”花费的时间超过“模型训练工程师”,不用意外。这是数据从粗放转向精细的必经阶段。数据荒不是说抓不到数据,而是“能合法、稳定、低成本使用的高质量数据”变少,治理成本自然会上升。
从成本结构看,以前数据工作像打猎,重点是把猎物带回来;现在更像种植,要维护土壤、记录种子、控制病虫害。打猎模式习惯了,切换到种植模式会很难受,但必须切。
3. 存量数据还有潜力,关键是先做好分层和清洗
3.1 建立一条可复现的清洗流水线
面对数据不够,第一步不是去买更多数据,而是把已有的数据仔细处理一遍。很多团队手里的原始数据并没有被充分利用,尤其是格式杂乱、多语言混杂、噪声较多的部分。
一套典型的流水线可以这样设计:
- 原始文本进入语言识别,按语言分桶;
- 规则清洗:去HTML标签、去空白、去乱码、去模板文案;
- 低质过滤:按文本长度、重复率、标点比例、特殊符号比例打分;
- 正文级去重;
- 隐私和敏感信息过滤;
- 人工抽检,确认清洗规则没有误删。
每一步都要有判断标准。比如长度过滤,短于多少字的段落可以优先丢弃;重复率,连续n-gram重复过高可能是机器生成或模板;标点比例异常,可能是乱码或无意义符号。具体阈值取决于任务类型,但核心是规则要可解释、可回溯。
质量打分可以写成一个组合函数,比如:
def quality_score(text): length_norm = min(len(text) / 500, 1.0) punct_ratio = count_punctuation(text) / len(text) dup_ratio = ngram_repeat_ratio(text, n=8) score = 0.4 * length_norm + 0.3 * (1 - punct_ratio) + 0.3 * (1 - dup_ratio) return score这只是一个示意,实际参数要结合你的数据分布来调。但要注意,打分只是辅助,最终还是要靠人工看一批样本,确认低分样本是不是真的低质。
3.2 去重要分三层,不要一上来就上重武器
很多团队一听说去重,就打算上MinHash加分布式计算。但小规模数据这样做的成本很高,收益却不明显。更稳的顺序是先看数据量:
- 几十万条以内:先用URL加MD5去重,再直接按文本相似度抽样检查;
- 百万到千万条:用MinHash或SimHash做近似去重;
- 亿级以上:再考虑分布式去重和向量化语义去重。
语义去重不要排在前面。它需要embedding,计算量大,而且如果模型本身质量一般,向量判断可能反而把相近但不同的有效文本去掉。常见做法是先做精确去重,把重复率降下来,再决定是否需要做语义层。这样既省资源,又能保留多样性。
去重时还要注意“保留哪一份”。我的经验是:优先保留格式更完整、来源更权威、标注信息更全的版本,而不是随机保留。比如同一个公告被多个网站转载,保留原始官网版本,后续配权或溯源都更方便。
3.3 垂直领域和专用语料是相对低垂的果子
泛化语料不够的时候,垂直领域数据往往还有不少空间。论文、专利、技术文档、代码仓库、产品手册、客服记录、行业报告,这些内容格式更规范,专业术语集中,对特定任务价值很高。缺点是需要做格式解析,比如PDF转文本经常会丢结构,表格和公式更难处理。
我建议每个团队围绕自己的场景定义“黄金语料”。不要追求覆盖所有领域,而是把一两个领域的样本量做深。比如做AI编程辅助,就重点收集代码、commit、issue、文档和问答;做AI Agent,就重点收集工具调用轨迹、用户反馈、任务成功与失败案例。这类数据互联网上不集中,需要和产品流程结合,但一旦建起来,很难被其他人复制。
垂直语料还有一个容易被忽视的好处:可以帮助模型减少领域幻觉。通用语料里专业信息密度低,模型容易把不相关领域的表述混在一起。垂直语料经过清洗后,等于给模型划定了知识边界,输出会更稳定。
4. 合成数据能补位,但用错地方会反向伤害模型
4.1 哪些任务适合用合成数据
合成数据是应对数据荒的重要方式,但我更愿意把它看成“补位”,不是“替代”。适合用合成数据的任务有几个特点:答案可以被自动校验,或者生成过程有明确规则。
典型场景包括:代码生成和代码补全,可以用编译器和测试用例判断对错;数学题,可以用计算器验证结果;结构化抽取,可以用规则校验输出字段;多轮对话,可以基于模板和知识库构造,只要内容边界清楚。对低资源语言,也可以先用合成数据扩充基础表达,但需要配合真实数据验证。
使用合成数据时,我会给每条样本加一个来源标记,比如source=synthetic以及生成规则版本。这样后续如果发现某批合成数据质量有问题,可以直接从训练集中删除,不用重建整个数据集。
4.2 哪些任务不能依赖合成数据
开放域事实问答、新闻、创意写作、长尾知识,这些场景不适合大量使用合成数据。原因很简单:模型生成的数据可能继承模型自己的偏见和幻觉,再用它训练下一个模型,等于把错误当作正确答案反复强化。
比如让模型生成“某种病用哪种药”的问答语料,模型可能编造出处。如果没有医生审核,这批数据就成了危险样本。再比如生成“今天发生的新闻”,模型并不掌握实时事实,只会根据训练分布拼出看起来合理但错误的内容。这种数据一旦进入训练集,模型会在错误信息上越走越稳。
判断一批合成数据能不能用,我一般会先做“三重校验”:
- 是否来自可信知识源,而不是模型自由发挥?
- 是否有明确校验规则,能自动判断对错?
- 是否经过人工抽检,错误率是否在可接受范围内?
如果没有做完这三步,不要轻易把合成数据放进训练集。
4.3 模型坍缩:怎么识别,怎么预防
模型坍缩指用模型生成数据训练下一代模型时,数据分布逐渐变窄,多样性下降,长尾知识丢失。识别信号有三个:
- 真实文本验证集上的loss持续上升;
- 合成数据集的语义向量分布越来越集中;
- 生成文本中的高频词比例升高,低频词和罕见表达减少。
预防方法并不复杂:合成数据要控制比例,且每代训练都要保留足够比例的真实数据;生成阶段要设置采样温度和随机性,不要总选最高概率输出;训练时用真实数据验证集做早停,一旦真实数据loss变差,就立刻检查合成数据质量,而不是继续跑。
实际操作中,我会把真实数据的最低比例定在50%以上。合成数据只用来扩充多样性,不用于替代真实数据。如果发现合成数据带来的收益在下降,优先减少生成数据的比例,而不是增加模型训练轮数。
5. 版权和数据合规是绕不开的前提
5.1 数据来源要分层管理
数据荒会逼着团队去更远的地方找数据,这时最容易踩坑的是版权和数据使用边界。我的建议是先把数据来源分成几层:
| 数据来源 | 示例 | 风险程度 | 建议 |
|---|---|---|---|
| 公共开放数据集 | 政府公开数据、学术数据集 | 较低 | 优先使用,保留使用条款 |
| 明确授权的网页或API | 有授权协议的内容平台 | 中低 | 记录授权信息,遵守平台规则 |
| 订阅或第三方数据 | 商业数据库 | 中 | 签合同,明确训练范围 |
| 自有业务数据 | 用户行为日志、工单 | 中 | 脱敏后使用,控制访问权限 |
每批数据都要记录授权状态,不能把“能下载”等同于“能训练”。这一条写进数据pipeline,而不是靠个人自觉。
5.2 用户数据清洗必须做脱敏和最小化
如果你使用用户生成内容,比如评论、客服记录、产品反馈,必须做脱敏和最小化处理。脱敏不只是删掉姓名和手机号,还包括地址、公司、邮箱、社交账号、设备ID等可识别信息。可以使用正则匹配、命名实体识别和人工抽检结合的方式。
一个简单的脱敏思路:
import re def desensitize(text): text = re.sub(r'1[3-9]\d{9}', '[手机号]', text) # 手机号 text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[邮箱]', text) text = re.sub(r'\b\d{17}[\dXx]\b', '[身份证]', text) return text实际场景里还要处理地址、公司名、工号等信息。不要只依赖正则,建议用NER模型识别后再人工抽检。
“最小化”的意思是,只保留模型训练真正需要的字段,不把多余的个人信息复制进训练集。能脱敏的字段先脱敏,能删除的字段直接删除。这不仅是合规要求,也是减小数据泄露面。建议在清洗流水线里加一个强制步骤:所有样本在写入训练集前,必须跑一遍脱敏检查。
5.3 建立数据血缘,给每个样本一个身份
数据血缘听起来很复杂,实际上就是给每条数据记下来源、清洗时间和规则版本。建议每个样本至少包含这些字段:source_url、crawl_time、pipeline_version、license_status、quality_score。这样当版权方要求删除某类数据时,你可以快速定位,而不是把整份数据集下架。
实际操作中,不需要给每条记录都人工填写,pipeline自动生成即可。关键是不要丢了元数据。很多人一开始为了省空间只保留文本,等出了问题才发现找不到任何来源信息,只能被动处理。数据治理的本质是给数据建立档案,越早做越省事。
数据血缘字段可以参考:
| 字段名 | 含义 | 示例 |
|---|---|---|
| source_url | 数据来源URL | https://example.com/doc/123 |
| crawl_time | 采集时间 | 2025-06-01T10:00:00Z |
| pipeline_version | 清洗规则版本 | v2.3.1 |
| license_status | 授权状态 | authorized / open / internal |
| quality_score | 质量分 | 0.87 |
有了这些信息,后续做数据分析、错误追溯、模型审计都会方便很多。
6. 不同角色的应对思路:平台、团队、个人各做什么
6.1 内容平台:把数据变成可授权的数据资产
对内容平台来说,与其被动被采集,不如主动建立数据授权机制。可以让数据通过API、订阅、批量下载等方式提供给AI开发者,同时写明使用范围和期限。这样平台能把数据优势变成服务收入,也避免数据被无差别抓取后带来的争议。
平台侧还可以做数据质量分层:哪些适合做模型预训练,哪些适合做指令微调,哪些只能用于搜索检索。把数据产品化之后,开发者更容易选择,平台的合规风险也会更低。
比如一个技术问答社区,可以把“问题-最佳回答”整理成指令数据集,按主题、难度、语言进行标签化。开发者拿到的不是一堆原始网页,而是一份可以直接用于微调的数据集,体验会好很多。平台也能因此形成稳定的数据服务,而不是单纯被当成免费语料库。
6.2 中小团队:做窄而深的场景数据集
中小团队最不需要做的就是“复刻一个大而全的互联网语料库”。资源有限,不如围绕自己的产品场景做一个窄而深的私有数据集。比如做客服机器人,优先整理历史工单、产品手册、常见问答,并不断从线上补充新问题。这个数据集可能只有几十万条,但在特定场景里的价值远高于几TB通用网页。
判断这个数据集是否合格,不是看规模,而是看几个指标:领域覆盖是否完整,最新信息是否及时更新,错误答案有没有回流机制。能够持续更新的垂直数据集,才是小团队在数据荒里最牢固的护城河。
优先级可以这样排:
- 用户真实反馈数据:最有价值,包含用户真实需求和失望点;
- 产品内部知识库:准确度高,适合作为事实基础;
- 公开专业数据:补充领域空白,但要注意授权;
- 通用大而全数据:最后再考虑,除非你有充足的算力和存储。
6.3 个人开发者:从反馈闭环里持续攒数据
个人开发者做AI应用,最容易忽略的是数据。很多人用公开模型直接跑,效果好就上线,效果差就换模型,但没有积累自己的数据资产。更好的做法是:从应用上线第一天就记录用户输入、用户纠错、任务成功失败、模型输出对比,并在脱敏后存入独立数据库。
这些数据量不会很大,但针对性极强。用它们做指令微调或RAG评估,比通用数据集更能提升产品体验。AI Agent、AI编程助手、AI搜索这些方向,本质上都需要真实任务轨迹,而不是单纯网页文本。谁先建起反馈闭环,谁就拥有了别人短期内拿不到的高价值数据。
反馈闭环可以这样建:线上请求日志 -> 抽样本 -> 人工标注或半自动评估 -> 修正错误 -> 加入训练集 -> 重新评测。不要想着一次性做完整套系统,可以先从每天随机抽样50条开始。跑一个月,你就有1000多条来自真实场景的高质量样本,足够做一次增量训练了。
7. 真正落地时,先盯住指标和排查顺序
7.1 数据工作的核心指标不是“数据量越大越好”
很多团队汇报数据工作,只讲“抓了多少TB”“清洗后剩多少”,这是不够的。更值得关注的是:
- 清洗后保留率:保留率太低,可能清洗规则误伤;太高,可能清洗不到位;
- 唯一高质量token数:去重后真正有效的文本量;
- 领域覆盖率:是否覆盖目标场景的常见问题;
- 可授权比例:数据来源是否清晰;
- 验证集loss:同一份数据上的训练收益。
建议先定目标再定数据量。不要一上来就追求几十TB,先从满足一个具体任务的最小高质量集开始,跑通后再扩展。
例如做文本分类,先准备每类500到1000条高质量样本,测试模型能否稳定区分;做问答,先准备几百条困难样本,比塞入几万条简单重复问题更有效。数据工作的产出,应该是“模型在目标任务上的指标变化”,而不是“存储系统里多了多少TB”。
7.2 模型效果差,先检查数据链路而不是调参
如果训练出来的模型在真实任务上表现不好,最常见的错误是直接调模型结构或训练参数。其实很多问题出在数据链路。我会按这个顺序排查:
- 打开训练集随机看100条样本,确认输入格式、标签、上下文是否正常;
- 统计类别分布和长度分布,看是否存在严重不均衡;
- 检查清洗规则是否误删关键内容,比如标点、代码、URL、公式被错误剥离;
- 做训练集和验证集重叠检测,防止数据泄露导致指标虚高;
- 检查合成数据比例,如果过高,先回退到真实数据基线;
- 最后再考虑调学习率、batch size等训练参数。
这个顺序能帮你少走很多弯路。很多“模型变笨了”的现象,最后都定位到数据上,而不是模型上。
举个例子:某次模型生成效果不好,团队反复调采样参数,结果发现是清洗时把HTML标签去掉后,原本有语义的“标题-正文”结构变成了乱序文本。修复抽取逻辑后,效果立刻提升。这类问题靠调模型是发现不了的。
7.3 给数据治理新手的几条实操建议
最后整理几条我自己的经验:
- 先在1万条数据上验证清洗pipeline,再放量到全量数据;
- 每个处理版本都保存下来,方便回溯;
- 所有过滤阈值先写到配置文件,不要散落在代码里;
- 定期人工抽检,每周看一批随机样本;
- 不要在脏数据上反复调参,先把数据弄干净再谈优化。
还要特别注意:不要一上来就开全量合成数据生成,先跑小批量,检查生成质量,再逐步放大;不要把所有数据混在一起,来源、授权、质量分最好分开管理;不要直接用原始爬取文本训练,除非你只是想快速验证想法。
数据荒不是一天形成的,也不会一天结束。真正能从这轮变化里受益的,是那些早早就开始建立数据生产、清洗、反馈闭环的团队。互联网上的免费午餐会变少,但靠合规采集、自产数据和持续反馈攒出来的数据资产,长期价值反而会更高。