简介:《阿里研究院:2024大模型训练数据白皮书》由阿里研究院联合数字中国研究院(福建)、阿里云智能集团编写,面向大模型研发、数据治理与合规从业者,以及关注人工智能与大数据趋势的研究人员。报告系统梳理训练数据对大模型发展的关键作用,涵盖大语言模型与多模态模型的数据类型、高质量数据的评估标准与三重不确定性、合成数据的定义与生成方法,以及训练数据合规治理与中美数据生态现状,并回应了“大模型训练是否依赖用户个人信息”“中文语料短缺是否制约发展”等常见疑问。资源包为1个PDF文件,约15.12MB,内容完整、目录清晰,便于按章节检索与引用。目前已有1502人学习下载,适合需要理解数据质量与安全、数据标注与质量控制、隐私保护与法规遵循等议题的读者作为案头参考。
1. 大模型训练数据白皮书到底解决了什么工程问题
做微调最怕的不是显卡不够,而是数据管线跑通之后发现模型学歪了。去年帮一个团队排查指令微调效果差的问题,最后定位到训练集里混进了大量格式不统一的问答对,模型把「回答模板」当成了任务本身。这类问题在《阿里研究院:2024大模型训练数据白皮书.pdf》里被反复提及——它讨论的不是模型结构,而是数据从哪来、怎么洗、怎么配比、怎么评估。白皮书的核心价值在于把「数据工程」从炼丹玄学拉回到可度量的流程:数据来源分级、质量过滤规则、领域配比策略、合成数据的使用边界。适合正在搭建预训练或微调数据管线的人,也适合需要向团队解释「为什么数据预算要花在清洗而不是多买卡」的技术负责人。读完至少能判断自己手里的数据集该走哪条处理路径。
2. 训练数据从哪来:来源分级与采集边界
2.1 白皮书里的数据来源分类逻辑
白皮书把训练数据来源分成几个层级,这个分类不是学术摆设,直接决定后续清洗成本。第一类是公开网页与文档,量大但噪声高,需要去重、去模板、去低质;第二类是专业出版物与行业资料,质量高但覆盖窄,适合做领域增强;第三类是自有业务数据,分布最匹配但涉及合规审查;第四类是合成数据,可控性强但存在模型自噬风险。我一般会先给手头数据打标签,按「来源可信度 × 任务相关度」画一个四象限,优先处理高相关但中等可信的数据,因为这类数据清洗收益最大。白皮书强调来源可追溯,意思是每条数据要能回答「从哪来、谁授权、什么时间抓的」,否则后期出问题连后悔药都没得吃。
2.2 采集阶段的最小可行配置
实际操作中,采集不是写个爬虫就完事。下面这段 Python 用datasets库做一次带元数据记录的采集示例,重点是每条数据都保留来源字段和抓取时间戳。
from datasets import Dataset import hashlib import time def build_record(text, source_type, source_uri, license_tag): # 用内容哈希做去重主键,避免重复入库 content_hash = hashlib.md5(text.encode("utf-8")).hexdigest() return { "text": text, "source_type": source_type, # 如 web / book / internal / synthetic "source_uri": source_uri, # 可追溯的原始地址或内部编号 "license_tag": license_tag, # 授权类型标记 "crawl_ts": int(time.time()), "content_hash": content_hash } raw_samples = [ ("示例文本A", "web", "https://example.com/a", "public"), ("示例文本B", "internal", "db://kb/1024", "restricted"), ] records = [build_record(*s) for s in raw_samples] ds = Dataset.from_list(records) ds = ds.map(lambda x: {"dup_flag": False}) # 占位,后续按 content_hash 做全局去重 print(ds)逻辑说明:content_hash是后续去重和版本比对的关键字段,不要用自增 ID 代替。source_type决定这条数据进入哪条清洗流水线,license_tag决定它能不能进最终训练集。参数上,crawl_ts建议用整数时间戳而不是字符串,方便后续按时间窗口过滤。常见错误是把来源信息写在文件名里,一旦数据集合并就丢失,所以必须在记录级别冗余存储。
2.3 合规审查的检查点
白皮书提到数据合规不是法务一个人的事,工程侧要提供可审计的字段。我一般会在采集表里加三列:是否包含个人信息、是否包含敏感业务标识、授权有效期。这三列在后续过滤阶段可以直接作为 SQL 条件使用。如果采集时没记,后期补录成本极高,相当于把黑匣子留给未来的自己。
3. 数据清洗流水线:去重、过滤与质量打分
3.1 去重的三个层次
去重不是只做完全匹配。白皮书把去重分成文档级、段落级和句子级。文档级用 URL 或内容哈希;段落级用 MinHash 或 SimHash 做近似去重;句子级用 n-gram 重叠率。我通常先做文档级,再做段落级,句子级只在指令微调数据里做,因为预训练数据句子级去重收益递减。下面是一个基于 MinHash 的段落去重片段。
from datasketch import MinHash, MinHashLSH def minhash_text(text, num_perm=128): m = MinHash(num_perm=num_perm) for token in set(text.split()): m.update(token.encode("utf-8")) return m lsh = MinHashLSH(threshold=0.8, num_perm=128) paragraphs = ["这是一段测试文本用于去重", "这是另一段测试文本用于去重", "完全不同的内容"] for i, p in enumerate(paragraphs): m = minhash_text(p) if lsh.query(m): print(f"段落 {i} 判定为重复") else: lsh.insert(str(i), m)逻辑说明:threshold=0.8表示相似度超过 0.8 视为重复,这个值在中文段落上通常调到 0.75 到 0.85 之间。num_perm越大精度越高但内存也越大,128 是常见折中。注意 MinHash 对短文本不稳定,段落少于 20 个词时建议改用编辑距离。
3.2 质量过滤的规则集
白皮书列出的过滤维度包括:长度异常、重复字符比例、特殊符号占比、语言置信度、困惑度。我一般把规则写成可配置的 YAML,方便不同数据集复用。下面是一个过滤函数的骨架。
import re def quality_filter(text, min_len=50, max_len=10000, max_symbol_ratio=0.3): if len(text) < min_len or len(text) > max_len: return False, "length" symbol_count = len(re.findall(r"[^\w\s]", text)) if symbol_count / max(len(text), 1) > max_symbol_ratio: return False, "symbol_ratio" if len(set(text)) / max(len(text), 1) < 0.1: return False, "low_diversity" return True, "pass"逻辑说明:max_symbol_ratio对中文可以放宽到 0.35,因为中文标点占比天然偏高。low_diversity用来拦截「哈哈哈哈」这类重复字符文本。参数需要按语种调整,不要一套阈值跑所有数据。过滤日志要保留,否则无法回溯为什么某批数据被丢掉。
3.3 质量打分的落地方式
除了硬规则,白皮书建议引入模型打分。常见做法是用一个小型奖励模型或困惑度模型给每条数据打分,然后按分数分桶。我一般把数据分成高、中、低三档,高档直接进训练集,中档做增强或降采样,低档丢弃。打分模型不要用最终要训练的大模型,避免循环偏差。
4. 数据配比与课程学习:让模型先学什么后学什么
4.1 领域配比的实验设计
白皮书强调配比不是拍脑袋。通用能力与领域能力的比例需要做消融实验。我一般固定总 token 数,调整领域数据占比,观察验证集上通用任务和领域任务的指标变化。常见做法是领域数据从 10% 开始,按 10% 递增到 50%,找到领域指标不再显著提升而通用指标开始下降的拐点。这个拐点就是配比上限。
4.2 课程学习的三个阶段
课程学习指先易后难。白皮书里对应的是数据难度分层。第一阶段用短文本、高置信度数据;第二阶段加入中等长度和中等质量数据;第三阶段混入长文本和困难样本。实现上可以用采样权重控制。
import numpy as np def sample_weights(stage, difficulties): # difficulties: 0 表示简单,1 表示困难 if stage == 1: w = np.where(difficulties < 0.3, 1.0, 0.1) elif stage == 2: w = np.where(difficulties < 0.7, 1.0, 0.3) else: w = np.ones_like(difficulties) return w / w.sum()逻辑说明:stage对应训练阶段,权重归一化后传给采样器。注意课程学习不是必须的,如果数据量本身不大,强行分阶段反而增加调参成本。我通常在数据量超过百万级时才启用。
4.3 合成数据的插入位置
合成数据适合补长尾和格式对齐,但不适合做预训练主体。白皮书提醒合成数据要标注来源,并且比例控制在 20% 以内。我一般把合成数据放在指令微调阶段,预训练阶段只用少量做数据增强。
5. 避坑与排查:数据管线里最容易翻车的五件事
5.1 去重后训练集反而变小但效果更差
现象:去重阈值设得太激进,段落级去重把语义相近但表达不同的样本也删了。原因:MinHash 阈值过低或分词粒度太粗。解决:把阈值从 0.7 调到 0.85,并改用词级 shingle 而不是字符级。
5.2 质量过滤把专业术语密集的文本误杀
现象:医学或法律数据被符号比例规则大量丢弃。原因:专业文本括号、编号、特殊符号多。解决:对领域数据单独配置阈值,或先做领域分类再走不同过滤规则。
5.3 配比实验指标波动大无法判断拐点
现象:每次实验指标差异超过 2 个点。原因:验证集太小或数据顺序未固定。解决:固定随机种子,验证集至少覆盖每个任务 500 条以上,并做多次评估取平均。
5.4 合成数据导致模型输出风格单一
现象:微调后模型回答千篇一律。原因:合成数据由同一个模型生成,缺乏多样性。解决:混入真实人工标注数据,合成数据比例降到 10% 以下,或使用多个生成模型。
5.5 数据版本混乱导致实验不可复现
现象:两周后无法复现之前的实验结果。原因:清洗脚本改了但没记录,数据集覆盖写入。解决:每次清洗输出带版本号,用 DVC 或类似工具管理数据快照,脚本和参数一起入库。
6. 用数据卡片和消融实验验证数据价值
数据卡片是我从白皮书里学到的最实用的工具。它是一份结构化文档,记录数据集的来源、清洗规则、配比、已知偏差和推荐使用场景。写数据卡片不是走形式,而是逼自己把「这批数据到底能干什么」想清楚。下面是一个最小数据卡片模板。
| 字段 | 内容示例 |
|---|---|
| 数据集名称 | domain-sft-v3 |
| 来源类型 | 内部业务日志 + 公开指令集 |
| 清洗规则 | 长度 50-8000,符号比 <0.35,MinHash 0.85 |
| 配比 | 通用 70%,领域 25%,合成 5% |
| 已知偏差 | 领域数据偏客服场景,缺少多轮对话 |
| 推荐用途 | 单轮指令微调,不推荐预训练 |
验证数据价值最直接的方法是消融实验:固定模型和训练步数,只换数据集版本,看验证指标。我一般会做三组对照——原始数据、清洗后数据、清洗加配比调整后数据。如果清洗后指标没提升,先检查验证集是否和训练集同分布,再看过滤规则是否误杀了有用样本。另一个技巧是训练一个「数据分类器」,用模型判断某条数据是否被实际学到,学不到的数据要么太难要么太噪。
我自己的习惯是每次数据管线改动都跑一遍小规模消融,用 1% 数据量训练一个小模型,看 loss 曲线和验证指标。这个习惯帮我省过很多次全量训练的显卡钱。数据工程没有银弹,白皮书给的是框架,具体阈值和配比还得在自己的任务上试。希望帮到你。
本文还有配套的精品资源,点击获取