ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

大模型数据工程指南:从规模、质量到配比,数据决定AI上限

大模型数据工程指南:从规模、质量到配比,数据决定AI上限 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%同时保留一定比例的英文数据让模型在代码和前沿知识上不掉队你的产品如果有实时性要求就得在更新数据时保留一部分“时效性验证集”确保模型不会因为训练数据的滞后而给出过时答案。很多模型能力表现不佳并不是架构不够好而是从一开始数据设计就没贴合真实场景。数据这件事没有捷径但每一个用心打磨数据的细节最终都会在模型输出中体现出来。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进