数据工程全流程
业界有一句老话——“Garbage In, Garbage Out”(垃圾进,垃圾出)。在 AI 项目里,模型架构再先进,喂进去的数据是脏的、有偏的、量不够的,结果一样是垃圾。事实上,资深工程师 70%–80% 的时间花在数据上,写模型只占一小部分。本页把从”原始世界”到”可训练张量”的整条流水线讲透:采集 → 清洗 → 标注 → 增强 → 难例挖掘 → 划分 → SFT 数据构造。前置阅读:数据预处理、数据增强、模型评估与指标。
把数据工程想象成”从矿井挖出原石到打磨成珠宝”的完整产业链:
- 数据采集= 找矿、开采。哪里有矿(爬虫、API、传感器)、用什么设备挖、挖上来的矿石大小不一。
- 数据清洗= 选矿、去杂质。原石里混着泥沙(缺失值)、碎石(异常值)、重复的矿块(去重),要洗掉。
- 数据标注= 给原石贴标签分类。“这块是钻石、那块是石英”——人工贴、或机器半自动贴。
- 数据增强= 用少数真宝石”复制变体”。同一颗钻石换个角度拍,让鉴宝师(模型)见多识广。
- 难例挖掘= 把鉴宝师总认错的宝石专门挑出来,加练——专攻薄弱环节。
- 数据集划分= 训练用一部分、考试用另一部分、最终答辩留一份——严格隔离,防止作弊。
- SFT 数据构造= 给大模型写”指令-回答”范本,像给实习生编《标准操作手册》,让它学会按规范办事。
一条贯穿全流程的准则:数据质量 > 数据数量 > 模型架构。Scaling Law 让人误以为只要数据够多就行,但”多而脏”比”少而精”更危险——脏数据会让模型学到错误的模式,且更难发现。
数据流水线总览
Section titled “数据流水线总览”下面逐环节展开。注意这条流水线并非严格线性——难例挖掘的产物会回流到标注与增强环节,形成数据飞轮(Data Flywheel):模型上线 → 收集错例 → 重新标注增强 → 重训 → 上线,循环迭代。
1. 数据采集
Section titled “1. 数据采集”数据采集(Data Collection / Ingestion)是流水线的入口,决定了后续所有环节的天花板。
| 来源 | 典型方式 | 优点 | 风险与合规 |
|---|---|---|---|
| 公开互联网 | 爬虫(Scrapy、requests + BeautifulSoup)、Common Crawl | 量大、覆盖广 | 版权、robots.txt、隐私(GDPR / 个保法)、反爬 |
| API / 数据库 | Twitter/Reddit API、企业内部 DB、数据市场(Hugging Face Hub、Kaggle) | 结构化、稳定 | 配额限制、费用、服务条款变更 |
| 传感器 / 设备 | 摄像头、麦克风、IoT、车载雷达、医疗设备 | 真实世界分布、独家数据 | 噪声大、标注成本高、同步对齐难 |
法律与伦理红线:爬取个人数据需遵守《个人信息保护法》和 GDPR;商用数据需确认 license(CC-BY、MIT 还是 All Rights Reserved)。大模型时代,Common Crawl 里混入的受版权保护内容是诉讼高发区。合规采集是数据工程的第一准则。
采集的工程要点
Section titled “采集的工程要点”- 去重前置:采集时就做 URL 去重(布隆过滤器 Bloom Filter)、内容指纹去重(SimHash / MinHash),避免下游重复处理。大模型预训练数据集(如 Refined Web、RedPajama)的核心工作就是”海量去重”。
- 增量采集与断点续传:网络不稳定时要记录已采集位置,失败可重试。
- Schema 校验:每条数据落库前用 JSON Schema / Pydantic 校验字段完整性,坏数据进”死信队列”人工复核。
- 采样策略:全量数据往往有偏(互联网上英文/中文/技术内容偏多),需主动平衡领域、语言、年代分布。
大模型预训练数据配方示例
Section titled “大模型预训练数据配方示例”现代 LLM 的预训练语料通常是多源混合(以 LLaMA / Qwen / DeepSeek 为代表):
- 网页文本(~50%–70%):Common Crawl 清洗去重后。
- 代码(~5%–15%):GitHub、Stack Overflow,对推理能力至关重要。
- 书籍(~5%–10%):长文本、知识密集。
- 学术论文(~2%–5%):arXiv,提升科学素养。
- 对话数据(~2%–5%):论坛、问答。
配比直接决定模型的能力画像——代码多了逻辑强但文采弱,网页多了流畅但知识浅。
2. 数据清洗
Section titled “2. 数据清洗”采集来的原始数据是”脏”的,清洗(Data Cleaning)的目的是把它变成模型能消化的干净张量。这一步常常决定最终上限。详见 数据预处理 的更完整论述,这里聚焦清洗环节的关键操作。
缺失值处理(Missing Values)
Section titled “缺失值处理(Missing Values)”数据中字段缺失无处不在——用户没填年龄、传感器掉线、API 返回 null。处理策略:
- 删除:缺失比例高(
>50%)的列直接删;缺失样本少(<5%)的行也可删。 - 填充(Imputation):
- 数值型:用均值 / 中位数 / 众数填充,或用 KNN、回归模型预测填充。
- 类别型:用 “Unknown” 或众数填充。
- 时序型:前向填充(ffill)、后向填充(bfill)、线性插值。
- 标记缺失本身:新增一列
is_missing,有时”是否缺失”本身就是有信息量的特征。
大模型场景:LLM 训练数据里”缺失”表现为空文档、截断、乱码。清洗时要丢弃过短(
<50字符)、过长(超上下文)、重复、含大量特殊字符的文档。
异常值处理(Outliers)
Section titled “异常值处理(Outliers)”异常值(Outlier)是偏离正常分布的样本,可能来自传感器故障、录入错误或真实的”长尾”事件。检测方法:
- 统计方法:基于 z-score,,通常 视为异常。
- IQR 法:四分位距 ,超出 视为异常。比 z-score 更鲁棒(不受极端值影响)。
- 孤立森林(Isolation Forest):基于树的异常检测,适合高维数据。
- 领域规则:年龄 = 999、血压 = 0、坐标超出地球范围——硬规则直接过滤。
处理方式需谨慎:异常值不一定是错误。信用卡欺诈检测里,异常值恰恰是要抓的目标。删除前要先理解异常的语义。
去重(Deduplication)
Section titled “去重(Deduplication)”重复数据危害极大:让模型”以为”某些样本更重要(过拟合到重复项),虚高评估指标。大模型预训练尤其强调去重:
- 精确去重:对文档做哈希(MD5 / SHA),完全相同就删。简单但只能抓 100% 重复。
- 模糊去重(Near-dedup):
- MinHash + LSH(Locality-Sensitive Hashing,局部敏感哈希):对文档的 n-gram 集合做最小哈希,相似文档落到同一桶。CCNet / Refined Web 用它。
- SimHash:把文档映射成 64 位指纹,海明距离(Hamming Distance)小的视为近似重复。
- 段落级去重:不仅删整篇重复,还删跨文档的重复段落(如版权声明、模板 boilerplate)。
实证表明,去重能让 LLM 的困惑度(Perplexity)显著下降、泛化更好。
格式标准化(Normalization)
Section titled “格式标准化(Normalization)”- 文本:统一编码(UTF-8)、统一全/半角、去除不可见字符(零宽空格 U+200B)、统一换行符、HTML 转义还原。
- 图像:统一尺寸(resize + pad)、统一色彩空间(RGB / BGR)、归一化到 或标准化(减均值除标准差)。
- 数值特征:标准化(Z-score) 或归一化(Min-Max)。
- 时间戳:统一时区、统一格式(ISO 8601)。
# 文本清洗管道示例(大模型预训练常用)import re, unicodedata
def clean_text(text: str) -> str: # 1. Unicode 标准化(NFKC:兼容性分解+组合) text = unicodedata.normalize("NFKC", text) # 2. 去除不可见字符 text = re.sub(r"[\u200b\u200c\u200d\ufeff]", "", text) # 3. 合并连续空白 text = re.sub(r"\s+", " ", text) # 4. 去除 HTML 标签(如果是爬虫数据) text = re.sub(r"<[^>]+>", " ", text) # 5. 去除 URL(按需) text = re.sub(r"https?://\S+", "", text) return text.strip()
# 质量过滤:丢弃过短、过空、乱码占比高的文档def is_quality(text: str, min_len: int = 50) -> bool: if len(text) < min_len: return False # 字母/数字占比过低 → 可能是乱码 alpha_ratio = sum(c.isalnum() for c in text) / max(len(text), 1) return alpha_ratio > 0.53. 数据标注
Section titled “3. 数据标注”监督学习需要带标签的数据。标注(Annotation / Labeling)是人力密集、成本最高、最易出错的环节。
| 方式 | 做法 | 适用 | 成本/质量 |
|---|---|---|---|
| 人工标注 | 标注员逐条打标 | 高精度需求、复杂任务 | 高成本、高质量(需质检) |
| 半自动标注 | 模型预标 + 人工校验 | 大规模、模型已初版 | 中成本、中高质量 |
| 弱监督 | 用启发式规则/已有模型自动生成标签 | 海量、容忍噪声 | 低成本、标签有噪 |
| 主动学习 | 模型主动挑”最不确定”的样本请人标 | 标注预算有限 | 高性价比 |
| 众包 | Amazon MTurk、Scale AI、Labelbox | 量大、任务简单 | 低成本、需质检去噪 |
标注质量管控
Section titled “标注质量管控”人工标注最大的问题是标注者间一致性(Inter-Annotator Agreement, IAA)。同一条数据,两个标注员可能给出不同标签。常用度量:
- Cohen’s Kappa(两人)/ Fleiss’ Kappa(多人):修正随机一致性后的吻合度, 为优秀。详见 模型评估。
- 双标 + 仲裁:关键数据让两人独立标,分歧交第三人仲裁。
- 黄金集(Gold Set):混入已知正确答案的样本,用来监测标注员准确率,不合格者重训或淘汰。
主动学习(Active Learning)
Section titled “主动学习(Active Learning)”主动学习的核心思想:不是所有样本都一样有信息量。让模型主动挑出”最拿不准”的样本去标注,用更少的标注预算达到更好的效果。
挑选策略:
- 不确定性采样(Uncertainty Sampling):选预测概率最接近 0.5(最不确定)的样本。
- 熵最大: 最大。
- 边缘最小:正负两类预测概率差最小。
- 多样性采样:选能覆盖特征空间未探索区域的样本,避免挑一堆相似的。
- 期望模型改变:选能让模型参数变化最大的样本(计算开销大)。
与大模型的结合:2025 年的一个趋势是用 LLM 做”自动标注员”(LLM-as-Annotator),用 GPT-4 / Claude 给小模型生成训练数据。需注意:LLM 标注会引入其自身的偏见与错误,关键任务仍需人工复核。代表性工作如 Distilabel、Argilla。
4. 数据增强
Section titled “4. 数据增强”数据增强(Data Augmentation)通过对训练数据施加随机变换,等效扩充数据集规模,抑制过拟合。它在数学上是一种隐式正则化(详见 正则化、数据增强 的完整推导)。这里按模态归纳要点。
增强变换 以概率 采样,增强后的期望风险为:
等价于在”扩展分布” 上训练。当 足够丰富, 更接近真实分布,泛化误差下降。
CV 增强(计算机视觉)
Section titled “CV 增强(计算机视觉)”- 几何:水平翻转、随机裁剪、旋转、缩放、平移。
- 颜色:亮度/对比度/饱和度/色调抖动(Color Jitter)。
- 遮挡与混合:Cutout、MixUp(,)、CutMix、Mosaic(YOLO)。
- 自动化:AutoAugment、RandAugment、TrivialAugment——用搜索或随机策略组合变换,省去人工调参。
NLP 增强
Section titled “NLP 增强”- 回译(Back-translation):中→英→中,得到表达不同但语义相同的句子。
- 同义词替换:随机替换同义词(WordNet)。
- 随机插入/删除/交换:EDA(Easy Data Augmentation)。
- 上下文嵌入替换:用 BERT/Masked LM 在挖空处生成上下文合理的词。
- 大模型生成:让 GPT 改写、扩写、生成相似样本——2025 年主流方式。
- 加噪:叠加白噪声/环境噪声(SpecAugment 在频谱图上做时间/频率掩码)。
- 变速/变调(Speed/Pitch Perturb):改变语速和音高。
- 混响(Reverberation):模拟房间回声。
- 时移/音量扰动。
5. Hard Sample 挖掘
Section titled “5. Hard Sample 挖掘”不是所有样本对模型同样”难”。简单样本模型已经会了,反复训练是浪费;难样本(Hard Sample / Hard Negative)才是提升上限的关键。难例挖掘(Hard Sample Mining)专门把模型易错的样本挑出来重点训练。
难例挖掘(Hard Negative Mining)
Section titled “难例挖掘(Hard Negative Mining)”经典流程(源自目标检测,如 Fast R-CNN):
- 用当前模型对所有样本做预测。
- 挑出损失最高(最易错)的负样本,组成 “hard negative batch”。
- 只在这些难样本上继续训练几个 epoch。
OHEM(Online Hard Example Mining)
Section titled “OHEM(Online Hard Example Mining)”OHEM 把难例挖掘做到在线、端到端:每个 batch 里,对所有样本算 loss,只对 loss 最大的 top-k 样本回传梯度,简单的样本梯度置零。这样每个 batch 自动聚焦在难例上,无需额外离线挖掘。
数学上,对 batch 内 个样本的 loss ,OHEM 等价于:
与 Focal Loss 的关联
Section titled “与 Focal Loss 的关联”OHEM 是”硬”地丢弃简单样本,Focal Loss 则是”软”地降低简单样本的权重,二者哲学一致——把训练资源倾斜给难样本。Focal Loss 的形式(详见 损失函数):
其中 是模型对正确类的预测概率, 是聚焦参数。
- 简单样本():,loss 被大幅压低。
- 难样本():,loss 几乎不衰减。
直观理解 Focal Loss 与 OHEM 的关系:OHEM 是阶跃式的”全有或全无”,Focal Loss 是平滑的连续加权。 越大,越激进地忽略简单样本,越接近 OHEM 的效果。
# Focal Loss 实现import torchimport torch.nn.functional as F
def focal_loss(logits, targets, gamma: float = 2.0, alpha: float | None = None): # logits: [N, C], targets: [N] ce = F.cross_entropy(logits, targets, reduction="none") # -log(p_t) p_t = torch.exp(-ce) # 正确类的预测概率 loss = ((1 - p_t) ** gamma) * ce if alpha is not None: loss = alpha * loss return loss.mean()难负样本(Hard Negatives)在检索与 RAG 中的角色
Section titled “难负样本(Hard Negatives)在检索与 RAG 中的角色”在向量检索(Dense Retrieval)训练中,难负样本指”与 query 表面相似但实际不相关”的文档,用它们训练能让模型学会精细区分。代表性做法:用 BM25 或初版 retriever 召回 top-k 中非正例的作为难负样本(如 ANCE、RocketQA)。这是现代 RAG 检索质量的关键。
6. 数据集划分
Section titled “6. 数据集划分”划分数据集(Data Splitting)是为了诚实评估模型的泛化能力。最基本的是三划分:
- 训练集(Train):模型从中学习参数。
- 验证集(Validation / Dev):调超参、早停、模型选择。模型”看过”但不直接学参数。
- 测试集(Test):最终只跑一次,报告性能,模拟真实部署。
铁律:测试集在整个训练过程中绝对不能碰。一旦用测试集调参,就引入了信息泄漏(Data Leakage),报告的性能是虚高的。
随机划分与分层抽样
Section titled “随机划分与分层抽样”最简单的划分是随机抽样。但当类别不平衡时(如欺诈检测正例占 1%),随机划分可能让验证集几乎没有正例,指标失真。此时用分层抽样(Stratified Sampling):在每个类别内按比例划分,保证各集合的类别分布一致。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, stratify=y, random_state=42 # stratify 保证类别比例)时序数据划分
Section titled “时序数据划分”时间序列数据绝不能随机划分——会把未来信息泄漏到过去。必须按时间切:训练集用最早的数据,验证集次之,测试集最新。
时序划分的关键:训练集的时间必须严格早于验证/测试集,且不能有任何特征工程(如归一化均值)用了未来数据。
K 折交叉验证
Section titled “K 折交叉验证”数据量小时,单次划分方差大。K 折交叉验证(K-Fold CV)把数据均分 K 份,轮流用每份做验证集、其余做训练,K 次结果取平均,评估更稳健。详见 模型评估。
数据泄漏的常见来源
Section titled “数据泄漏的常见来源”- 特征泄漏:把”目标相关的未来信息”当特征(如用”是否违约”预测”是否贷款”,而违约只发生在贷款之后)。
- 划分泄漏:同一用户的多次记录分散到训练/测试集,模型记住用户 ID 而非学规律。要做 GroupKFold(按用户分组)。
- 预处理泄漏:在划分前对全量数据做归一化——均值/方差含测试集信息。正确做法:只在训练集上 fit,再 transform 验证/测试集。
7. SFT 数据构造
Section titled “7. SFT 数据构造”SFT(Supervised Fine-Tuning,监督微调)是把基座大模型(Base Model)变成”会对话、会遵循指令”的助手的关键步骤。SFT 数据的质量直接决定助手的表现——这是”对齐”工程的第一道关。
为什么需要 SFT
Section titled “为什么需要 SFT”基座模型(如 LLaMA-3-Base)只会”续写文本”——给它 “中国的首都是哪?“,它可能续写成 “中国的首都是哪?日本的首都是哪?……”(继续生成问题)。SFT 用”指令-回答”对教它:看到问题,就该停下并回答。
指令微调数据格式
Section titled “指令微调数据格式”SFT 数据本质是 (instruction, response) 对,加上可选的 input(输入上下文)和 system(系统提示)。几种主流格式:
Alpaca 格式(Stanford Alpaca 提出,最经典):
{ "instruction": "把下面的句子翻译成英文。", "input": "今天天气真好。", "output": "The weather is really nice today.", "system": "你是一个专业的翻译助手。"}ShareGPT 格式(多轮对话,源自 ShareGPT 社区分享):
{ "conversations": [ {"from": "human", "value": "解释一下什么是梯度下降。"}, {"from": "gpt", "value": "梯度下降是一种优化算法……"}, {"from": "human", "value": "它和随机梯度下降有什么区别?"}, {"from": "gpt", "value": "主要区别在于每次更新用的样本量……"} ]}OpenAI ChatML / Message 格式(现代主流,对应 chat/completions API):
{ "messages": [ {"role": "system", "content": "你是一个专业的翻译助手。"}, {"role": "user", "content": "把下面的句子翻译成英文:今天天气真好。"}, {"role": "assistant", "content": "The weather is really nice today."} ]}不同训练框架(LLaMA-Factory、Axolotl、TRL)接受的格式略有不同,但核心都是”指令-回答”对。ShareGPT 格式因支持多轮、结构清晰,逐渐成为事实标准。
如何构造高质量 SFT 数据
Section titled “如何构造高质量 SFT 数据”- 种子任务 + Self-Instruct:手写少量高质量种子指令,让强模型(GPT-4)按种子批量生成更多指令-回答对(Self-Instruct / Evol-Instruct 方法)。需严格去重、过滤低质量。
- 真实人机对话:收集真实用户与模型/产品的对话,人工改写成高质量回答(如 ShareGPT、OpenAssistant)。真实分布比合成更鲁棒。
- 领域专家标注:医疗、法律、代码等专业领域,必须请专家写回答。一条专家数据 > 一百条合成数据。
- 能力维度平衡:SFT 数据要覆盖多种能力——问答、写作、翻译、代码、推理、数学、安全拒答。配比失衡会让模型能力偏科。
- 数据质量控制:
- 长度过滤:过短(敷衍)、过长(啰嗦)的回答都剔除。
- 格式校验:代码块是否闭合、Markdown 是否合法、是否答非所问。
- 毒性/安全过滤:用安全模型过一遍,剔除有害内容。
- 多样性:去重(语义级),避免模型过拟合到几个模板。
SFT 数据量与质量的关系
Section titled “SFT 数据量与质量的关系”一个反直觉的经验:少量精标数据(几千~几万条)的效果往往优于海量低质量数据。LIMA 论文(2023)证明仅 1000 条精心标注的样本就能让模型获得强对话能力。Qwen、DeepSeek 的技术报告也强调”质量优先于数量”。2025 年的趋势是:用强模型蒸馏出高质量数据,再用人工精修,而非堆量。
与 RLHF 的衔接:SFT 教会模型”怎么回答”,RLHF(基于人类反馈的强化学习)教会模型”哪种回答更好”。二者配合完成对齐。详见 RLHF 与 LLM 训练。
- 数据质量 > 数量 > 架构。投入在数据清洗和标注上的回报远高于调模型。
- 尽早建立数据飞轮:上线即收集错例,定期回流重训,比一次性造数据更可持续。
- 去重贯穿全程:采集去重、清洗去重、SFT 去重——重复是性能与评估的双重杀手。
- 测试集神圣不可侵犯:任何用测试集调参的行为都会让评估失真,严格隔离。
- 时序数据按时间切,类别不平衡用分层抽样,用户级数据用 GroupKFold。
- SFT 数据贵精不贵多:几千条专家标注往往胜过几十万条合成噪声数据。
- 合规先行:版权、隐私、许可——数据合法是项目的生命线。
2025-2026 最新进展
Section titled “2025-2026 最新进展”- 合成数据成为主流:用 GPT-4 / Claude / 专门的蒸馏模型生成训练数据,配合”拒绝采样”(Rejection Sampling)筛高质量样本。代表:Microsoft Phi 系列、Qwen 的数学/代码数据合成管线。2025 年的关键问题从”数据从哪来”变成”如何验证合成数据不引入模型偏见”。
- 模型崩溃(Model Collapse)警示:用模型生成的数据再训练下一代模型,多代迭代后分布坍缩、多样性丢失(Shumailov et al., 2024)。这促使社区强调”必须保留真实人类数据作为种子”。
- 数据清洗管线工业化:Common Crawl 的清洗(如 Refined Web、FineWeb、RedPajama v2)形成标准流水线:去 HTML→语言识别→质量过滤(KenLM 困惑度/分类器)→模糊去重(MinHash LSH)→安全过滤。
- 主动学习 + LLM 标注:Argilla、Distilabel、Label Studio 集成 LLM 预标注 + 人工校验的工作流,标注效率提升 5–10 倍。
- DPO/RLHF 数据需求兴起:偏好对(preference pair,即同一问题的两个回答 + 人类标注哪个更好)成为新数据形态,催生 RLHF 数据标注平台。
- 数据估值与审计:Data Shapley、Influence Functions 等方法用于量化”每条数据对模型的贡献”,辅助去噪与版权追溯,2026 年在合规驱动下进入工业实践。
- 多模态数据构造:图文交错(interleaved image-text)数据(如 OBELICS、MMC4)成为多模态 LLM 预训练的关键,如何清洗、对齐、去重尚在快速演进。