合成数据 Synthetic Data

Synthetic Data Generation

由 LLM、GAN、规则引擎或物理仿真器自动生成的人工训练数据,用于在真实标注数据不足、昂贵或存在隐私风险时扩展训练集并提升模型鲁棒性。

详细解释

Synthetic Data(合成数据 / 人工生成数据) 一句话定义:真实数据不够?买不起?有隐私拿不到?别等——让 LLM/仿真器自己跟自己下棋生成无限量的训练样本,用这些「人工造的数据」去 SFT 小模型/做 RAG 评测/微调检索器,成本是人工标注的 1/10 至 1/100,质量在很多任务上已经和人工打平甚至超过。合成数据不是什么新鲜事(ImageNet 时代 GAN 就在造图像了),但 LLM 时代它的重要性被无限放大——因为 LLM 既是合成数据的消费者(需要数据训练),也是合成数据的生产者(能自己写数据),形成了正向飞轮。

OpenAI 在 GPT-4o 之后的多个模型、谷歌 Gemini 2、以及国内的 Qwen 2.5 / DeepSeek V3 等 2024 年后发布的新模型,官方披露的训练数据里合成数据占比已经普遍达到 30% 至 50%,个别垂直能力(如代码、数学推理)的合成数据占比甚至超过 80%。学术界最著名的案例是斯坦福 2023 年的 “Textbooks Are All You Need” 系列:用 GPT-4 合成的 7B token 高质量代码教科书数据训练出的 1.3B 参数的 phi-1 模型,在 HumanEval 上和用 10 倍真实数据训练的 10B 参数模型打平,证明了「数据质量远大于数据数量,合成数据可以质量极高」。

唯元智创 的 Synthetic Data Studio 提供了三种开箱即用的生成流水线:(1) Teacher-Student 蒸馏模式——上传 100 条人工标注种子数据,自动让强模型(GPT-4o / Claude Opus)按风格扩写 1 万条带打分的合成样本;(2) 对抗自博弈模式——让两个模型互相当「出题老师」和「答题学生 + 评审」,自动生成越来越难的推理链样本;(3) 结构化表格模式——上传数据库 schema 和 10 条样例行,自动生成百万行符合统计分布的仿真数据库数据用于测试。

合成数据的四大主流生成范式对比

范式核心思路适合任务质量上限(相对人工)成本倍数(相对人工)典型工具
① 规则模板生成(Rule-based / Template)人工写 10-100 个 Jinja2 模板 + 变量槽位,按统计分布填充变量生成无限条意图分类、命名实体识别、FAQ、简单结构化60% 至 75%(格式完美但多样性差)1/50 至 1/100自研脚本、Faker、Snorkel
② Teacher-Student 知识蒸馏强模型(Teacher,如 GPT-4o)对「无标注输入」打标/写推理链/写完整回答 → 得到(输入, 强模型输出)对 → 训练小模型(Student)SFT 数据、推理链(CoT)、代码生成、RAG 评测集85% 至 95%(和 Teacher 质量正相关)1/20 至 1/5Distilabel、Argilla、SynthLab
③ 自博弈 / 对抗生成(Self-Play / GAN)两个模型/同一个模型两个角色互相对抗:A 出难题/难样本,B 解答/分类,A 再根据 B 的弱点出更难的样本,循环数学推理、代码、红队攻击样本、Guardrails90% 至 105%(可能超过人工——因为能生成人工想不到的边角样本)1/10 至 1/3AlphaZero 风格框架、LLM-Arena、Self-Instruct
④ 物理仿真 / 多模态渲染(Simulation)用 Unity/Unreal/Blender 或专用物理引擎(如 CARLA 自动驾驶)在虚拟环境中渲染图像/点云/视频 + 自动生成精确标签自动驾驶、机器人视觉、医疗影像、3D 物体识别90% 至 99%(标签精度 100% 完美无噪声)1/50 至 1/5(前期仿真环境搭建成本高)CARLA、Unity Perception、BlenderProc

合成数据落地的三个「质量控制」铁则(造垃圾数据不如不造)

铁则 1:永远用「种子集 + 质量过滤器 + 多样性校验」三段式流水线,不要把 LLM 随手生成的东西直接喂模型。90% 的团队第一次用合成数据都踩了这个坑——让 GPT-4 扩写了 1 万条 SFT 数据直接训练,结果小模型推理能力反而降了 5%,因为合成数据里有 15% 的错误样本和 30% 的重复模式。正确的三段式:

  • 第一段 种子集(Seed Set):人工高质量标注 50 至 200 条「黄金样本」,要求覆盖所有任务维度,且正确率 100%。这是 Teacher 学习的风格蓝本,种子脏了后面全废。
  • 第二段 生成(Generation):LLM 基于种子集风格扩写,但每次生成时必须同时输出「自评分 1-5 分 + 置信度」。
  • 第三段 过滤(Filtering):三层过滤:(a) 自评分 <4 的直接丢弃;(b) 输入和任何一条已有样本的 cosine ≥0.95(重复/近似重复)丢弃;(c) 随机抽 5% 让另一个强模型(不同厂商)独立打分,低于 4 分的整批打回重生成。过了这三层,合成数据的错误率通常能压到 2% 以内,和人工标注的 1% 至 3% 差不多。

铁则 2:合成数据和真实数据的混合比例要按任务类型调整,不是越高越好。经验推荐比例表:

  • 低阶任务(分类、NER、简单 FAQ):合成数据可以占 80% 甚至 90%,只要种子集够好,质量几乎不掉
  • 中阶任务(客服多轮对话、代码补全、长摘要):合成 40% 至 60% + 真实 40% 至 60%,合成比例再高会导致输出风格「太像机器人」缺少真实多样性
  • 高阶任务(复杂推理、创意写作、开放式咨询):合成 10% 至 30% 封顶,其余必须真实,合成比例过高会导致模型只会「套模板」而缺少真实创造力和多样性

铁则 3:合成数据必须通过「数据污染检测」,绝不允许把测试集/评测集的信息泄露进合成训练集。这是很多团队训练出「Benchmark 分数虚高、上线就崩」的根本原因——合成数据的 Teacher 模型在生成时,因为它本身见过 MMLU / GSM8K 等 Benchmark 的题目,生成时会无意识泄漏出来,导致 Student 模型在这些公开 Benchmark 上分数暴涨,但实际能力没涨。防污染做法:每条合成数据生成后,必须和你所有评测集(内部+公开)做 n-gram 重叠率检测,任何 13-gram 重合就整段删除;更狠的做法是「合成数据 Teacher 用老版本模型,评测用最新版本模型」,确保 Teacher 生成时不可能见过新评测集。

常见问题

合成数据会不会有「模型坍缩」问题?即小模型学大模型输出,一代一代传下去能力越来越差?
会,这个现象在 2024 年初被多篇论文正式命名为「Model Collapse(模型坍缩)」或「Inbreeding Depression(近交衰退)」——当第二代模型用纯第一代模型的合成数据训练,不再引入任何真实世界数据时,第二代的分布尾部(罕见情况、创造性输出、长尾事实)会严重萎缩,两代之后模型只会输出千篇一律的套话,逻辑推理能力暴跌 30% 以上。但完全可以通过工程手段避免,三条预防措施:(1)永远保持「真实数据打底比例」——无论合成数据多好用,训练集中真实数据比例绝不低于 15% 至 20%,真实数据的分布多样性是防止坍缩的锚点;(2)每一代蒸馏都升级 Teacher 模型或引入「跨家族交叉蒸馏」——如果上一代用的是 OpenAI 模型当 Teacher,这一代就换 Anthropic 或 开源强模型当 Teacher,打破同一家族模型的分布内循环;(3)用「任务相关真实指标」而不是「合成数据内部自评分」监控每一代 Student 的真实能力——每训完新一代,必须在和训练数据完全无关的、真实用户数据构成的 held-out 测试集上跑分,真实分数没涨就停止下一代蒸馏,不要为了生成更多数据硬做。这三条严格执行,连蒸三代以内模型坍缩的影响能控制在 1% 至 3%,完全可接受。
合成数据涉及用户隐私吗?比如用真实用户对话当种子集再扩写,会不会泄露 PII?
会有风险,尤其是用真实用户数据作为种子集时,很容易出现「合成数据里保留了真实用户的姓名/手机号/地址等 PII」的泄漏事故。但通过「PII 脱敏 → 语义去标识化 → 生成后再校验」三层清洗可以把风险压到合规要求以内:(1)第一层 硬 PII 脱敏——进入合成流水线前,所有种子数据里的姓名、身份证、手机号、邮箱、地址、银行卡号等用 NER 模型 + 正则自动替换成占位符([NAME]、[PHONE] 等),这一层能解决 90% 的显式 PII;(2)第二层 语义去标识化——用 LLM 重写整段种子数据,保留意图、任务结构和推理逻辑,但彻底改写所有实体信息,比如把「北京朝阳区用户张三投诉订单 12345 退款」改写成「华东地区用户李某投诉订单 98765 售后」,语义结构完全一样但 PII 全换,这一层解决剩下 9% 的隐式 PII;(3)第三层 生成后反向校验——合成数据生成完后,再跑一次 PII 检测器 + 和原始种子数据做「实体指纹比对」,如果发现任何实体指纹(姓名拼音、地址编码、手机号段等)和真实种子重合,立即丢弃。欧盟 GDPR 和国内的《个人信息保护法》目前普遍接受「经过完全去标识化的合成数据不属于个人信息」,可以自由用于模型训练,这三层全部合规审计通过的合成数据是安全的。
小团队没有强模型 Teacher,能用开源 7B 模型自己造合成数据吗?
可以,但要选对任务和方法,不能硬上。四个实用建议:(1)不要指望 7B 开源模型自己造复杂推理数据,它的能力上限在那,造出来的数学/代码推理数据错误率会很高(20% 以上),别浪费时间;7B 适合造「低阶任务 + 垂直领域风格适配数据」——比如你要做一个客服 8B 小模型,用公司已有的 1000 条真实客服对话当种子,让 7B 模型扩写「相同意图、相同产品、不同用户措辞」的变体,这种任务 7B 足够胜任,错误率能压到 5%;(2)用「Self-Consistency 自验证 + 多采样投票」弥补 Teacher 能力不足——同一个输入让 7B 模型用 5 个不同 temperature 独立生成 5 条输出,只保留 3 条以上一致的输出(或者让另一个同样的 7B 模型当裁判选最好的一条),一致性过滤后错误率直接减半;(3)混合「API 强模型廉价版」——如果预算允许,花 100 至 500 元预算用 GPT-4o-mini / Claude Haiku 级别(约 ¥1/百万 token)生成 1 万条「关键种子样本」,剩下的 9 万条让开源 7B 基于这些种子做风格扩展,10% 强模型 + 90% 开源组合,成本是纯强模型的 1/10,质量是纯开源的 1.5 倍;(4)务必做「合成数据准确率 A/B」——训练完后对比「只用真实数据」和「真实+合成数据」两组模型在 held-out 真实测试集上的分数,确认合成数据真的带来了 +2% 以上的提升再扩大规模,别瞎忙活一圈发现合成数据全是噪声。