1. 为什么说数据决定了AI的上限
我接触大模型这几年,最深的体会就是:模型架构和算力决定了AI可能够到的高度,而数据真正决定了它到底能飞多高。一个模型能有多聪明,不是看参数堆了多少,而是看它“吃过”什么样的数据。就像养孩子,基因决定潜能上限,但喂什么书、讲什么故事、接触什么环境,才真正决定这个孩子长大后思考问题的方式和知识面的广度。
大模型的训练本质上是“从数据中学习规律”。Transformer架构提供的是学习的框架和机制,损失函数告诉模型“预测错了多少”,但所有知识、逻辑推理能力、语言风格、世界常识,全部都是从海量文本中压缩提取出来的。如果训练数据里没有高等数学的推导过程,模型就不可能真正理解微积分;如果语料里只有营销号文章,模型生成的文字会浮夸空洞,毫无信息量。
这个道理听起来简单,但实践中很多团队栽过跟头。我在早期做大模型微调时,曾经迷信过“加更多数据就完事了”,结果模型越训越笨,生成的文本充满了重复片段和虚假信息。后来复盘才意识到,问题不在训练方法,而在于数据质量出了问题——在有效数据不足的情况下堆量,数据里的噪声和偏见被模型照单全收,甚至被放大。那段时间我最大的收获就是明白了:AI的数据工程,决定了模型的智商上限,而不是训练代码本身。
下面我会从数据规模、数据质量、数据处理流程、数据配方这几个维度,结合我实操过的项目,把大模型“吃数据”这件事彻底讲透。无论你是刚入门想做微调,还是想深入理解大模型能力差异的根源,这篇文章都能给你一份可以直接用的参考。
2. 数据规模上:从量变到质变的关键节点
2.1 参数量和数据量之间有一条“黄金法则”
大模型圈子里有个著名的说法叫“Chinchilla法则”,来自DeepMind 2022年的研究。它指出,在计算预算固定的情况下,模型参数量和训练token数应该大致按比例增长——每增加1倍参数量,训练数据量也大约需要增加1倍,而不是盲目堆参数。
这意味着什么?举个例子:一个70亿参数的模型,如果想训练到较好的效果,大约需要1400亿个token的训练数据;一个1300亿参数的模型,则需要2.6万亿token。很多团队在微调时根本没意识到这一点,觉得模型小就可以少用数据,结果模型严重欠拟合,专业能力根本学不出来。
我自己做过一个对比实验:同样的7B底座模型,一个用10亿token训练,另一个用50亿token训练,其他超参数完全一致。最终效果差距大得惊人——后者在专业领域的回答准确率提升了近40%,而且长文本生成时的连贯性明显更好。这让我直观感受到,数据量不足时,模型连“见过世面”都谈不上。
2.2 不同训练阶段对数据量的需求完全不同
大模型的训练通常分为预训练、监督微调(SFT)、人类反馈强化学习(RLHF)三个阶段,每个阶段对数据量的需求差异巨大。
预训练阶段需要的是“海量”数据,动辄几万亿token,目标是让模型建立语言能力和世界知识。SFT阶段通常只需要几万到几十万条高质量的对话样本,目的是让模型学会“按照人类的期望去回答”。RLHF阶段的数据量更少,几千到几万条偏好对就够用了。
很多初学者最容易犯的错误,是对SFT阶段的数据量产生误解,觉得“越多越好”,一口气灌进去几百万条SFT数据。结果模型出现了严重的“灾难性遗忘”——原本预训练阶段学会的通用能力大幅退化,回答什么都带着微调数据里的腔调。我在一个法律问答项目中就踩过这个坑。当时整理了两百万条问答数据,没有做充分的采样分析和数据配比,直接全量微调。训练完成后,模型在其他通用领域的回答质量明显下降,甚至简单的数学计算都开始出错了。
后来我学乖了,SFT数据量控制在10万条以内,并且严格筛选覆盖面和多样性之后,效果反而好了很多。“精”比“多”重要这个概念,在大模型领域尤其成立。
实操心得:在做SFT数据时,先从一个较小的、覆盖核心场景的种子数据集开始(建议不超过2万条),训练出基线模型后进行bad case分析,再针对性地补充数据。这个迭代模式比一次性堆量高效得多。
2.3 预训练数据的采集渠道从哪里来
主流预训练数据来源大概有以下几类:
- 网页爬虫数据:这是最大头的来源,像Common Crawl这类公开爬虫数据集包含了数千亿网页。但原始网页数据非常脏,需要经过复杂的清洗流程才能用于训练。
- 书籍和学术论文:高质量长文本来源,能显著提升模型的逻辑推理和深度理解能力。Books3、arXiv论文等都是常见来源。
- 代码数据:GitHub等代码仓库的数据对模型的推理能力帮助很大。代码的逻辑性和结构化特征,能让模型学会更严谨的思维方式。
- 百科数据:Wikipedia等结构化知识源,密度高、噪声少,是预训练数据中的“精华”。
- 垂直领域数据:比如医疗、法律、金融的专业文档,如果目标场景是这些领域,这部分数据的占比需要针对性提高。
上述渠道的数据往往需要做去重、清洗、过滤、格式转换等步骤。我在处理爬虫数据时,经常遇到一个问题:大量网页内容重复(比如同一篇文章被转载多次),如果不做去重,模型会反复学习相同内容,浪费算力,还有可能让模型对某些长尾表达产生偏好。
行业内常用的去重方法有MinHash(局部敏感哈希)、SimHash、精确匹配等,处理量大的时候还需要用分布式计算框架。我自己用的是Datasketch库里的MinHash实现,结合Spark跑分布式去重,千万级文档大概几个小时就跑完了。
3. 数据质量上:一吨垃圾不如一克黄金
3.1 大模型“吃”进去什么,就会“长”成什么
数据质量对模型能力的影响怎么强调都不为过。一个很直观的现象:如果你用大量低质量营销文案做训练数据,模型生成的内容会变得空洞、套路化,充满了“震惊!”“不转不是中国人”这类垃圾表达;相反,如果训练数据主要是经典书籍、学术论文、高质量技术文档,模型的表达能力会严谨、专业得多。
我在做中文大模型微调时做过一次对比:A组用了5万条从知乎、公众号、技术社区采集的高质量问答;B组用了5万条从各种论坛、灌水网站抓来的低质量帖子。训练完成后,A组模型在人工评测中的得分远高于B组,特别是在逻辑性和信息密度两个维度上差距明显。B组模型甚至产生了严重的“废话生成”倾向——回答任何问题都要先“首先让我思考一下这个问题的本质”,然后什么实质内容都没说出来。
这说明一个关键道理:数据的质量分布直接决定了模型能力的下限,而清洗过滤成本再高也是值得的。
3.2 数据清洗的核心步骤和实用细节
数据清洗不是“去掉HTML标签”这么简单,我按自己的实操经验把清洗流程拆解为几个步骤:
第一步:格式统一与提取。从网页、PDF、DOC等不同来源提取纯文本,保留段落结构。这里有一个容易被忽略的点:标题层级、列表结构、表格信息对模型理解文档逻辑很重要,不能粗暴地全丢。我的做法是保留Markdown风格的标记(如#号表示标题),这样模型能学到结构化的知识组织方式。
第二步:语言识别与过滤。用fastText或者CLD3做语言检测,筛掉不需要的语种。如果做中文模型,这一步尤其重要,因为中文互联网数据里夹杂着大量英文、日文甚至泰文内容,不做语言过滤会让模型的tokenizer效率下降。
第三步:质量评分过滤。这一步是核心技术环节。常用方法包括:
- 训练一个二分类器(高质量/低质量),类似BERT分类模型,对每篇文档打分
- 用启发式规则,比如标点密度、中文常用字比例、段落平均长度、停用词频率等
- 用困惑度(perplexity)作为质量指标,用已有的语言模型给文档打分
我在实际项目中,通常会组合使用这三类方法。先跑启发式规则粗筛一遍,再用小模型打分精筛,最后人工抽检一批结果调整阈值。这里要特别提醒:N-gram重复比率过高是低质量内容的强信号,如果一段文本里连续n-gram的重复率超过某个阈值,基本可以断定是拼凑的内容,直接过滤掉。
第四步:敏感信息过滤。这一步关系到模型的安全合规性,必须做,不能偷懒。具体做法包括:维护敏感词库进行词级过滤、用分类模型做内容安全检测,同时还要过滤掉个人隐私信息如电话号码、身份证号、银行卡号等。
3.3 数据去重的价值和主流方案
我做过一个统计:从Common Crawl中文子集采集的文本里,经过精确去重和模糊去重后,数据量减少了约20%-30%。这部分冗余数据如果直接拿去训练,不仅浪费算力,还会导致模型产生重复偏好。
去重方案分几个层次:
- 句子级别去重:用SimHash计算句子指纹,相似度超过阈值的句子只保留一条
- 文档级别去重:MinHash + LSH,对整篇文档做近似去重
- 跨数据集去重:预训练数据集内部去重后,还要和SFT数据集做交叉去重,防止SFT数据与预训练数据高度重合
注意:去重阈值需要反复调。阈值设得太严,会把有价值的改写内容也一并删除;设得太松,去重效果不明显。我的经验是文档级SimHash相似度阈值设在0.8左右比较稳妥,句子级可以适当放宽到0.85-0.9。
4. 数据配比上:怎么混合才能让模型“既博又专”
4.1 不是所有数据都等权,配比决定模型的气质
预训练阶段,不同来源的数据不是简单混合就行,而是需要有意识、有策略地设计配比。数据配比决定了模型的知识结构偏好——偏向哪个领域、擅长什么风格、对哪些任务更敏感。
举个简单例子:如果你的预训练语料中60%是代码、20%是技术文档、20%是通用文本,那么这个模型大概率会变成一个“代码专家”,但通用对话能力会偏弱。反过来,如果数理逻辑类数据太少,模型在数学题目上就会表现得很糟糕。
业界常见做法是用“数据比例随训练进度动态调整”的方式,比如训练前期多用高质量通用数据建立语言基础,中后期逐步提高领域数据的比例。这个策略有点类似于人类的“通识教育+专业培养”的模式。
4.2 一个可复用的SFT数据配比参考
在做指令微调时,我更关注数据的任务类型分布。我一般按照以下比例来搭建SFT数据集:
- 通用对话与闲聊:15%-20%
- 知识问答(百科、常识、科学等):25%-30%
- 文本写作与改写(作文、邮件、报告、润色等):15%-20%
- 代码生成与解释:10%-15%
- 逻辑推理与数学:10%
- 中文特定任务(翻译、摘要、情感分析等):10%
这个比例覆盖了大部分日常使用场景,又不至于让模型在某一类任务上过度偏科。如果你的产品只做垂直领域(比如医疗问答),可以把知识问答和特定领域数据的比例调高到60%以上,但建议至少保留10%的通用对话数据,防止模型在闲聊场景下表现呆滞。
4.3 用decontamination防止“考试作弊”
数据配比时还有一个隐蔽的坑:测试数据泄露。如果你的模型训练数据里包含了测试集的内容(比如某个公开评测集的问题和答案),那评测分数会虚高,真实业务效果却一塌糊涂。这种现象叫“数据污染”。
我在跑开源评测集(如MMLU、C-Eval)之前,一定会做一遍数据去污染操作:把所有评测集的问题文本和训练语料做相似度匹配,凡是相似度超过阈值的训练样本全部删除。这样虽然评测分数可能会降一些,但至少能反映模型的真实能力,而不是自欺欺人。
5. 数据投毒与安全:别让训练数据变成“特洛伊木马”
5.1 大模型投毒到底是怎么回事
数据投毒是针对大模型的一种攻击方式。攻击者通过往训练数据中注入精心构造的恶意样本,让模型在特定触发条件下输出有害内容或错误信息。这个攻击之所以有效,本质原因就是本文开头说的一句话:模型直接从数据里学知识。数据里混入毒药,模型自然就“带毒”了。
投毒攻击的常见方式包括:
- 后门攻击:在训练样本中植入“关键词+恶意输出”的绑定关系。比如上千条样本都包含“天气很好”这几个字,后面接的是恶意代码或有害建议,模型就会在推理时被这个关键词触发。
- 数据倾斜攻击:刻意放大某类数据的比例,扭曲模型的判断。比如大量灌输“某品牌产品质量很差”的内容,模型就会产生偏见。
- 对抗样本攻击:在数据中混入人类难以察觉但模型会异常处理的样本,导致模型在特定输入下崩溃或出错。
你以为数据投毒离实际应用很远?其实不然。现在很多团队做微调时会用公开数据集甚至从网上自动采集的数据,如果不对数据来源做严格审查,被投毒的风险是真实存在的。我见过一个开源数据集,里面被混入了数千条恶意指令样本,只要是使用该数据集做微调的项目,模型都会在某些敏感话题上输出违规内容。
5.2 数据清洗如何降低投毒风险
针对投毒风险,我的处理思路是:
- 数据溯源审查:对每一条训练数据记录来源,凡是来源不可靠的数据,要么弃用,要么单独隔离做人工抽检。
- 异常模式检测:对有相同触发词(trigger)的样本做聚类分析。我写过一个小工具,会统计数据集中重复出现的高频关键词组合,如果一个本不该频繁共现的词对出现频率异常高,就会触发人工审查。
- 输出侧防御:在推理阶段加一层内容安全过滤,即使模型被trigger触发输出了恶意内容,也能在输出侧拦截。
5.3 数据备份与恢复:安全体系的最后一道防线
数据投毒还有一个容易被忽视的后果:模型被poisoning之后,想要回滚到安全状态是非常麻烦的。尤其是数据清洗流程不规范、没有做好版本管理的团队,可能连“哪些数据被污染了、污染数据是从哪一批加入的”都查不清楚,只能从头重新训练,成本和损失都非常大。
我在项目中强制规定了一套数据版本管理流程:每次数据集的修改、合并、清洗,都生成一个新的版本号,并且完整记录数据来源、修改内容和时间戳;每个版本的数据集都有快照备份,存放于异地存储。这样做的好处是,一旦发现数据异常,可以快速定位到污染版本,回滚到上一个安全版本。
备份和恢复这件事看似和数据质量无关,但它是保障数据工程流程安全可控的基础设施。没有这一步,前面所有的清洗、配比、安全审查都可能功亏一篑。
6. 数据评估:怎么知道这批数据“够不够好”
6.1 用数据自身特征做“体检”
在把数据送入训练流程前,我会从几个维度给数据做“体检”:
- 多样性:检查数据里面的主题分布是否过于集中。一个简单方法是做TF-IDF向量化,然后用聚类算法看簇的数量。如果有效簇太少,说明数据内容同质化严重,即使量大,模型的泛化能力也会受限。
- 难度分布:数据的难度要有梯度,全是简单的百科介绍,模型的推理能力锻炼不出来;全是专业论文,模型又可能“消化不良”。理想情况是像学习教材一样,有基础、有进阶、有挑战。
- 时间分布:如果你的模型需要具备时效性知识,数据的发布时间分布也很重要。全部用几年前的旧数据,模型可能不知道最近发生的事。
6.2 用小模型“试吃”来预判大模型效果
我深度依赖的一个方法是“小模型试吃”:在投入大规模训练之前,先拿一个小规模模型(0.5B~1B参数)用一小批数据样本做短时间训练,通过小模型的表现来预判这批数据的质量。
这个方法有几个好处:
- 成本低,单卡跑几小时就能看到初步结果
- 能快速发现数据中的宏观问题,比如语言混杂、格式错误、标注不一致
- 可以做数据配比的快速对比实验,节省大模型训练的高昂成本
我做过一个项目,用0.5B的模型分别对两批候选数据进行试吃训练,其中一批在试吃评测中各项指标都更好,但上线大模型训练后实际效果却更差。回头看原因,是小模型对数据难度的承受能力和大模型不同,某些对0.5B模型“刚刚好”的数据,对7B模型来说已经太过简单。这提醒我:小模型试吃适合发现明显的脏数据问题,但不适合作为最终数据选择的唯一依据,还是要结合人工评估。
6.3 从模型输出反推数据问题
数据评估不止发生在训练前,训练后的评估同样重要。我会用一套固定的评测集(涵盖通用知识、逻辑推理、代码生成、中文理解、安全合规等维度)测试训练好的模型,然后根据bad case反推数据问题:
- 如果模型在某一类专业问题上反复犯错,往往说明该类数据在训练集中的比例不足或者质量不够
- 如果模型在通用对话中出现“答非所问”的情况,可能是SFT数据中的指令覆盖不够全面
- 如果模型的输出有风格偏差(比如过于正式的“论文腔”或过于口语化的“营销号腔”),大概率是数据配比的问题
实操心得:我每次训完一个模型,都会保留100条bad case样本,和分析笔记一起存档。连续的bad case分析能帮助你积累“数据敏感度”——哪些数据缺陷会导致哪类模型表现问题,这套经验比任何教程都值钱。
7. 关于数据工程,我最后想说的几句话
我自己在数据工程这条路上踩过很多坑,从最开始“拿到数据就灌”的莽撞,到后来慢慢形成“数据先评估、清洗、配比、再评估”的完整流程,整个过程最大的感悟是:数据工作不能靠“感觉”,必须有一套可量化的标准和可追踪的流程。
如果你正准备开始做大模型的训练或微调,我的建议是先花80%的精力去搞定数据,而不是急着调参或堆算力。很多团队把大量时间和成本花在训练策略的调整上,最后发现模型的瓶颈根本不在这里,而是在数据的质量、分布和覆盖度上。
另外,数据工程是一个迭代过程,不可能一次做到完美。我的经验是:先小规模搭一个端到端的流程,用少量数据跑通,然后逐步扩充和优化数据,同时不断用训练结果反哺数据改进。这个“数据-训练-评估-再改数据”的循环,才是大模型应用落地的正循环。
再分享一个隐藏小技巧:在数据准备阶段,记得从最终场景反推数据设计。你的产品如果主要服务中文用户,那中文高质量数据的占比最好不低于70%,同时保留一定比例的英文数据让模型在代码和前沿知识上不掉队;你的产品如果有实时性要求,就得在更新数据时保留一部分“时效性验证集”,确保模型不会因为训练数据的滞后而给出过时答案。很多模型能力表现不佳,并不是架构不够好,而是从一开始数据设计就没贴合真实场景。
数据这件事没有捷径,但每一个用心打磨数据的细节,最终都会在模型输出中体现出来。