【学习笔记】训练数据工程:高质量数据的构建与清洗(10/35)
训练与微调篇已经走过四篇——预训练、SFT、对齐、垂直化。每一篇背后都藏着一个共同的隐形主角数据。这一篇我们要把这个隐形主角拎到台前作为训练与微调篇的收官之作。在大模型这件事上业界已经形成了一个被反复验证的判断数据 算力 算法。「模型架构上的差异远小于训练数据上的差异」---OpenAI Ilya。这句话听起来像废话但它定义了过去 5 年大模型工程的真实重心Meta 在 Llama 3 上烧的钱至少 50% 花在数据团队Anthropic 把数据团队规模做到和算法团队同级DeepSeek V3 的 557 万美元成本里相当大比例花在数据构造Phi-4 仅 14B 参数能在多个 benchmark 超越 70B 模型全靠数据如果你做过相关工作下面这些问题应该不陌生我有 50 GB 业务数据能直接拿来训吗网上爬的语料怎么清洗要不要去重怎么判断数据质量凭感觉吗用 GPT-4 / Claude 生成训练数据靠谱吗模型上线后怎么把用户反馈变成新一轮训练数据读完本文你将能理解预训练数据 pipeline 的完整 7 步流程掌握 SFT 数据构建的工程标准用工程化方式生成、过滤、利用合成数据设计数据飞轮让模型自我进化避免数据工程的 6 个最常见陷阱我们开始。一、数据是大模型的「真护城河」1.1 一句话被验证了无数次Garbage In, Garbage Out.这句话在大模型时代被放大了 1000 倍。预训练阶段一旦喂错了数据事后任何 SFT、对齐、RAG 都救不回来。来看几个典型对比对比 1Llama 2 → Llama 3架构改动几乎没有训练算力增加 5 倍训练数据从 2T → 15T tokens7.5 倍 质量大幅提升结果Llama 3-8B 在多数 benchmark 上超过 Llama 2-70B主要差距来自数据。对比 2Phi 系列的逆天表现Phi-4 只有 14B 参数训练 10T tokens其中40% 是 GPT-4 合成的教科书数据数学能力超越 Llama 3-70B证明质量远比数量重要。对比 3DeepSeek V3 的数据配方14.8T tokens看似不算多但数学和代码占比远高于普通预训练结果数学 / 代码能力直接进入第一梯队一句话总结架构是别人的数据是自己的。这是为什么所有大模型团队都把数据看作核心资产。1.2 数据团队的真实规模工业上数据团队的规模有多大参考团队数据团队人数估算算法团队人数比例OpenAI1002001 : 2Anthropic80100~ 1 : 1.2Meta AI2003001 : 1.5DeepSeek501001 : 2数据团队不亚于算法团队——这是工业大模型的真实样貌。1.3 工程师为什么也要懂数据工程你也许不在大模型核心团队但下面这些场景任何 AI 工程师都会遇到场景需要懂数据工程微调模型SFT 数据构建、清洗、评估做RAG文档切分、清洗、embedding上线应用收集反馈数据形成飞轮选模型看 base 模型训练数据配比评估效果测试集构造、质量评估数据合规PII 脱敏、数据治理数据工程不是大厂专属是 AI 工程师的基础能力。二、预训练数据 Pipeline 全景预训练数据 pipeline 的工业标准流程原始数据 → 解析提取 → 去重 → 质量过滤 → 安全/PII 过滤 → 配比 → tokenize → 打包 ↑ ↓ 来源管理 训练 ready下面逐步拆解。2.1 第 1 步数据来源主流预训练数据集数据集内容规模使用方CommonCrawl网页爬取250 TB压缩几乎所有大模型C4CC 清洗版750 GBT5、LlamaRefinedWebCC 高质量清洗5 TBFalconFineWeb-Edu教育类筛选1.3 T tokensHF 推荐The Stack v2GitHub 代码67 TB几乎所有 Code 模型arXiv学术论文1 TB推理类模型PubMed医学文献500 GB医疗模型Wikipedia百科100 GB全语种通用CCI3 / 悟道 / Wudao中文语料200 GB中文模型主流配方占预训练数据的近似比例通用网页 50-60% 代码 15-25% 学术 书籍 10-20% 对话/问答 5-10% 合成数据 5-30%视团队2.2 第 2 步解析提取爬下来的 HTML / PDF 不能直接用。需要提取干净的正文。HTML 提取去 boilerplate导航栏、广告、页脚保留语义结构段落、列表、表格主流工具trafilaturaPython 库工业标准resiliparse高性能 C 实现boilerpipe经典方案PDF 提取特别难文字识别OCR表格识别公式识别LaTeX 重建图片提取主流工具pdfplumber基础文本unstructured综合处理MinerU / Nougat学术 PDF 优化一个工程经验预训练数据 pipeline 中解析提取通常占用 30% 的算力——比训练本身贵。2.3 第 3 步去重CommonCrawl 中50% 内容是重复的。不去重训练效率极低。主流去重方法方法原理精度速度精确去重Hash 整段文本100%慢MinHash局部敏感哈希95%快 ⭐主流SimHash局部敏感哈希变种90%极快模糊去重n-gramn-gram Jaccard85%慢MinHash 算法核心思想1. 把每个文档切成 n-gram如 5-gram 2. 用多个 hash 函数对 n-gram 计算 min hash 3. 文档相似度 ≈ MinHash 一致的比例工业级去重的两层结构Stage 1精确 hash 去重去掉完全重复 Stage 2MinHash 模糊去重去掉相似度 0.8 的跑完这套原始数据通常保留 30-50%。2.4 第 4 步质量过滤去重后的数据质量仍然参差不齐。需要进一步筛选。Rule-based 过滤def is_low_quality(text: str) - bool: # 长度过短 iflen(text) 100: returnTrue # 特殊字符占比过高 special_ratio len(re.findall(r[^\w\s], text)) / len(text) if special_ratio 0.3: returnTrue # 重复短语过多 if has_repeated_phrases(text, threshold5): returnTrue # 平均行长过短爬虫残留 lines text.split(\n) if mean(len(l) for l in lines) 20: returnTrue return False经验数据rule-based 过滤后保留 60-80%。Perplexity 过滤用一个小的 LM 给文本打 PPL困惑度分。PPL 过高通常表示文本是噪声。# 用 Pythia-160m 等小模型给文本打分 ppl small_model.compute_perplexity(text) if ppl 500: filter_out() # 噪声 if ppl 5: filter_out() # 过于死板模板/广告分类器过滤Llama 3、DeepSeek 都用训一个二分类器「这段文本看起来像高质量教育内容吗」正样本维基百科、教科书、高质量博客 负样本垃圾邮件、SEO 文本、低质论坛 ↓ 训一个 fasttext / BERT 分类器 ↓ 对全量预训练数据打分保留 top 30-50%Llama 3 关键改进之一用 Llama 2 训了一个数据分类器再用它筛选 Llama 3 的训练数据。2.5 第 5 步安全 PII 过滤有害内容过滤类别说明暴力 / 自伤训出来模型可能教用户做坏事色情内容隔离与合规仇恨言论偏见与歧视误导信息阴谋论、伪科学工业做法关键词列表黑名单训一个分类器与质量分类器类似用 LLM 二次审核PII个人识别信息脱敏# 用正则 NER 识别 patterns { phone: r1[3-9]\d{9}, # 中国手机号 id_card: r\d{17}[\dXx], # 身份证 email: r[\w.-][\w.-]\.\w, credit_card: r\d{16}, url_secret: rsk-[A-Za-z0-9]{20,}, # API key } for name, pattern in patterns.items(): text re.sub(pattern, f{name.upper()}, text)注意医疗、法律数据的 PII 脱敏比通用爬取复杂得多——需要专门的 NER 模型识别病例号、案号、当事人姓名等。2.6 第 6 步配比清洗完的数据要按比例混合。Llama 3 经验配方Web 文本 50% 代码 17% 数学 / 推理 8% 书籍 5% 学术论文 5% 对话 5% 多语言 10%配比对效果的影响极其敏感——多 5% 代码可能让模型代码能力上一个台阶多 5% 噪声可能让模型整体退步。调配方的标准做法训一个小尺度代理模型如 1B用不同配比训在评估集上比较找到最优配比再训大模型这就是为什么 OpenAI / DeepSeek 都有大量小模型实验——它们其实是在用小模型搜索数据配方。2.7 第 7 步Tokenize 打包用模型的 tokenizer 把文本转 IDSequence Packing把多个短样本拼到一条长序列提高 GPU 利用率注意加 attention mask 防止跨样本注意力泄漏输出 .bin / arrow 格式给训练加载三、SFT / 微调数据工程SFT 数据要求质量远高于预训练——预训练能容忍 10% 噪声SFT 不能。3.1 数据格式标准化主流大模型已经收敛到ChatML 多轮格式{ messages:[ {role:system,content:你是一个有用的助手}, {role:user,content:...}, {role:assistant,content:...}, {role:user,content:...}, {role:assistant,content:...} ] }Function Calling / Tool Use 格式OpenAI 风格{ messages:[ {role:user,content:查天气}, {role:assistant,tool_calls:[{ id:call_1, type:function, function:{name:get_weather,arguments:{\city\:\上海\}} }]}, {role:tool,tool_call_id:call_1,content:晴 25°C}, {role:assistant,content:上海今天晴25 度} ] }3.2 SFT 数据来源 4 类来源优势劣势业务真实数据分布真实量少、需脱敏公开数据集量大与业务分布有差人工标注质量极高成本高合成数据量可控、便宜近亲繁殖风险主流 SFT 数据集英文OpenHermes 系列200K 高质量混合WizardLM Evol-Instruct~250KUltraChat1.5M 多轮对话Magpie自合成方法中文BELLE阿里开源中文 SFTAlpaca-ChineseFirefly中文情感问答3.3 数据质量评估LLM as Judge# 用 GPT-4 / Claude 给每条 SFT 数据打分 prompt f 你是一个数据质量评审专家。请给下面的训练样本打分1-5 分从这些维度 - 清晰度问题是否清晰具体 - 准确性回答是否事实正确 - 完整性是否回答了问题的核心 - 安全性是否有任何风险 - 有用性对真实场景是否有价值 样本 Q: {question} A: {answer} 请输出 JSON{{clarity: x, accuracy: x, ...}} 经验用 Claude / GPT-5 给 SFT 数据打分保留 score 4 的质量直接上一个台阶。人工 Spot Check即使有 LLM Judge也要人工抽样检查 1-2%——LLM Judge 有自己的盲点例如偏好长回复。四、合成数据新数据红利4.1 为什么合成数据是大趋势事实公开互联网高质量文本接近枯竭真实标注成本高专业领域 1 条 $5-50闭源 SOTA 模型生成质量已经够好结论合成数据是接下来 5 年大模型数据的主要来源。OpenAI、Anthropic 都公开承认大量使用合成数据。Phi 系列、DeepSeek 在公开论文里都详细讲过。4.2 三种合成方式方式 1Self-Instruct2022让模型自己生成新指令种子指令池200 条人工写的 ↓ 让 GPT-3.5/4 生成新指令 ↓ 过滤掉低质量/重复的 ↓ 回到指令池Alpaca 数据集就是这么来的——用 175 条种子生成了 5.2 万条指令。方式 2Evol-Instruct2023, WizardLM让简单指令进化成复杂指令简单指令求 2 3 ? ↓ (深化) 中等指令求 2 3 5 7 的和 ↓ (复杂化) 复杂指令求所有小于 100 的质数和 ↓ (推理化) 高级指令证明所有小于 100 的质数和是奇数方式 3蒸馏最当下主流用户问题 Claude/GPT-4 回答 ↓ SFT 数据 ↓ 训练小模型DeepSeek-R1-Distill 系列、Vicuna、Yi 等都用这种方式。4.3 Phi 系列的「教科书」实践微软 Phi 系列把合成数据做到了极致Textbooks Are All You Need —— 论文标题 核心思想 1. 给 GPT-4 一个种子写一段关于 X 的教科书风格内容 2. 让 GPT-4 生成几千字教科书级文本 3. 严格质量过滤 4. 用这些合成数据预训练 Phi结果3.8B 参数的 Phi-3 在数学上超过早期 Llama-2-70B。4.4 合成数据的风险近亲繁殖如果一个模型只学自己或自己家族生成的数据会发生模式坍塌mode collapse多样性下降重复模式增多长尾能力退化避免方法多 teacher 混合用 GPT-4 Claude Gemini 等多个模型生成混入真实数据合成数据占比 70%质量严格过滤用更强的模型作为 judge多样性度量用 embedding 看数据点分布剔除过密集区域4.5 实战用 Claude 生成 SFT 数据import anthropic import json client anthropic.Anthropic() SEED_TASKS [ 总结一段文章, 翻译中英文, 写一段 Python 代码, 解释技术概念, # ... ] defgenerate_sample(task: str): 让 Claude 生成一条 SFT 样本 response client.messages.create( modelclaude-sonnet-4-6, max_tokens2000, messages[{ role: user, content: f请生成一条高质量训练样本主题{task} 要求 1. 生成一个具体且有挑战性的用户问题 2. 给出专业、准确、完整的回答 3. 回答字数 200-800 字 输出 JSON 格式 {{question: ..., answer: ...}} }] ) return json.loads(response.content[0].text) # 批量生成 samples [] for task in SEED_TASKS * 100: # 共 N 条 try: sample generate_sample(task) samples.append(sample) except Exception as e: print(fskip: {e}) # 质量过滤 filtered [s for s in samples if100 len(s[answer]) 2000] print(f保留 {len(filtered)} / {len(samples)} 条)生产化加强加入 evol 步骤让 Claude 把简单问题改写得更复杂加入 cross-check让另一个模型验证答案加入去重embedding 相似度 0.9 去掉五、数据飞轮让模型持续进化模型上线不是终点而是数据循环的起点。5.1 数据飞轮的基本闭环模型部署 → 用户使用 → 收集反馈 → 数据加工 → 重新训练 ↑ ↓ └─────────────── 更好的模型 ──────────────────┘每跑一圈模型应该更好。这就是 ChatGPT 持续领先的核心机制之一——OpenAI 有几亿用户的真实反馈在持续优化它。5.2 反馈数据的来源类型收集方式价值显式反馈用户点赞 / 点踩直接偏好信号改写反馈用户重写模型回复DPO 数据来源行为反馈用户是否复制 / 继续追问隐式偏好降级反馈用户切回竞品失败 case人工 review客服 / QA 抽检高质量标注5.3 数据飞轮的工程化阶段 1日志埋点app.post(/v1/chat/completions) async def chat(request): response await model.generate(request) # 埋点 await event_log.write({ request_id: request.id, user_id: request.user_id, prompt: request.messages, response: response, model_version: model.version, timestamp: time.time(), }) return response阶段 2反馈收集app.post(/v1/feedback) async def feedback(request): await feedback_log.write({ request_id: request.request_id, rating: request.rating, # 1-5 rewritten: request.rewritten, # 用户改写 tags: request.tags, # 用户标记问题类型 })阶段 3数据加工定期 batch 处理# 每周一次 defbuild_dpo_dataset(): # 1. 从日志取出最近一周数据 logs load_logs(days7) # 2. 找出有用户改写的样本chosen rewritten, rejected response pairs [] for log in logs: if log.has_rewrite(): pairs.append({ prompt: log.prompt, chosen: log.rewrite, rejected: log.response, }) # 3. 加入 LLM Judge 评分作为辅助标签 for p in pairs: p[judge_score] llm_judge(p) # 4. 质量过滤 high_quality [p for p in pairs if p[judge_score] 4] return high_quality阶段 4增量训练# 每月一次 DPO 增量训练 new_data build_dpo_dataset() if len(new_data) 5000: new_model dpo_train( basecurrent_model, datanew_data, epochs1, ) new_model.deploy_canary(traffic0.1) # 灰度 if new_model.metrics current_model.metrics: new_model.deploy_full()5.4 数据版本管理随着数据 pipeline 复杂化数据也需要版本控制。工具推荐DVCData Version Control和 Git 集成管理大文件Hugging Face Datasets内置 push_to_hub便于分享和版本LakeFS / Pachyderm企业级数据 lineage 管理最基础的做法每个数据集都打 tagdataset_v1.0_2026-01-15_50k_general_sft.parquet dataset_v1.1_2026-02-20_60k_with_feedback.parquet模型训练时记录用的数据版本便于复现 回滚。六、六大数据工程陷阱 工具链6.1 六大陷阱陷阱 1测试集污染症状模型在 MMLU 上分数飞涨真实业务效果反而退步。原因训练数据里混入了测试集本身——很多公开 benchmark 已经被互联网抓取。对策用 13-gram 去重把已知 benchmark 从训练数据剔除。陷阱 2合成数据近亲繁殖症状用 GPT-4 合成数据训自己也是 GPT-4 系效果不进反退。对策多 teacher 混合 真实数据保底 20%。陷阱 3长尾数据被过滤掉症状质量过滤太狠模型变成只会标准答案。对策保留 10-15% 的边缘但有效数据比如方言、口语、特殊领域。陷阱 4PII 泄漏症状模型输出包含真实人名、电话、邮箱。对策严格 PII 过滤训练前做对抗性提取测试——尝试让模型吐出敏感信息陷阱 5数据偏见症状模型对某些群体有歧视性回答。对策公平性评测集FairBench、Bold偏见监控指标加入对抗微调数据陷阱 6忽视失败 case症状飞轮只收集成功反馈模型一直在舒适区。对策刻意关注 user complain / 用户切走的 case这些才是飞轮真正的金矿。6.2 工具链推荐任务推荐工具网页解析trafilatura, resiliparsePDF 解析unstructured, MinerU, Nougat文本去重datasketch (MinHash), text-dedup质量分类器fasttext, KenLM数据加工 pipelineDataTrove (HF), CCNetTokenize 工具tiktoken, sentencepiece数据版本DVC, HF Datasets合成数据DataDreamer, DistilabelSFT 数据集OpenHermes, UltraChat评估LM-Eval-Harness, OpenCompass七、结语数据决定上限工程决定下限读完本文你应该明白数据 算力 算法——这不是口号是工业事实预训练数据 pipeline 是一个完整的 7 步工程SFT 数据质量比数量重要 100 倍合成数据是接下来 5 年的主旋律关键是避免近亲繁殖数据飞轮是模型持续进化的核心引擎测试集污染、PII 泄漏、偏见是工程师必须主动避免的陷阱训练与微调篇第 6-10 篇至此正式收官。我们走过的路径篇号主题06预训练全流程07SFT 微调实战08RLHF 与 DPO09垂直领域大模型10训练数据工程从这五篇开始你已经具备了「训练一个大模型」的完整工程能力。参考文献训练数据工程高质量数据的构建与清洗