说明:本文讨论的是合成数据从生成到进入生产链路的来源、过滤与使用边界,属于数据工程与模型训练话题,不涉及具体模型版本与价格。AI 领域版本迭代极快,凡涉及版本号、价格、可用性,请以你阅读时的官方页面为准。文中代码为结构示意,请按自己的技术栈调整后再上生产。
一、合成数据现在进了哪些环节
1.1 四个落点,验收口径各不相同
合成数据不是一件事,它在生产链路里至少有四个落点,每个落点要解决的问题不同。
第一个落点是后训练样本。真实业务里那些「模型当前答不好」的样本天然稀少,靠人工标注去凑,代价高、周期长。合成数据在这里的作用是补上这类样本的密度,让训练信号能覆盖到长尾。
第二个落点是评测集的困难样本补充。公开评测集的题目长期在社区流传,用久了区分度会下降——关于污染,那是另一个问题,本文不展开。合成困难样本的价值在于可以按人为设定的难度梯度现造,且不进入公开语料。
第三个落点是检索与工具调用的场景覆盖。检索链路要的是「问法多样、指向同一知识」的样本,工具调用要的是「参数组合完整、边界值齐」的样本。这两类样本都能用规则或模板批量造。
第四个落点是冷启动阶段。系统刚上线,真实日志几乎为零,此时没有日志可分析、没有失败样本可回灌。合成数据是唯一能立刻拿到的初始燃料。
落点不同,验收口径也不同:
| 落点 | 要解决的问题 | 验收口径 | 主要风险 |
|---|---|---|---|
| 后训练样本 | 长尾样本密度不足 | 训练后目标能力是否改善 | 偏差被放大 |
| 评测困难样本 | 区分度下降 | 人工抽查是否判定合理 | 与真实分布偏离 |
| 检索与工具覆盖 | 问法与参数覆盖窄 | 覆盖矩阵缺口是否补齐 | 模板痕迹过重 |
| 冷启动填充 | 没有真实日志 | 上线后首周失败率变化 | 与真实分布错位 |
1.2 先想清楚它替代的是哪一段真实数据
拿到一个合成任务,第一个该问的不是「用什么生成」,而是「它替代的是哪一段真实数据」。
如果它替代的是「真实数据里根本没有的部分」,那合成的目标是扩边界;如果它替代的是「真实数据里有、但采不到或不能用的部分」,那合成的目标是补密度;如果它替代的其实是「真实数据里已经足够多的部分」,那合成只是把已有的分布又摊平了一遍,收益很低。
这两种目标对应的过滤松紧完全不同:扩边界时可以容忍单条样本不够干净,补密度时必须保证与原分布不打架。
一个可操作的做法是把这三个问题列成一张核对表,让写合成任务的人在开工前逐条回答:这批样本对应哪个线上场景、该场景当前的真实样本有多少、合成之后哪一类输入会被覆盖到。三条答不上来,说明这批数据的目标本身还没定清楚。
1.3 每条样本从出生就带一条记录
不管落在哪个环节,合成样本从生成那一刻起就该带一条记录。没有这条记录,后面过滤、追溯、回滚都没法做。最小字段如下:
⚠️ 代码待验证
{"sample_id":"syn_0001","source_type":"strong_model","generator_params":{"temperature":0.9,"n":4},"prompt_template_id":"tpl_tool_args_v3","filter_verdict":"pass","self_consistency":0.75,"judge_scores":[4,4,3],"human_reviewed":false,"created_at":"2026-09-30"}注意这里没有把生成内容本身塞进记录,而是存了能复现这条样本的参数与模板标识。原因在第六章讲留痕时展开。
二、四类来源与各自的成本结构
合成数据按生成方式分四类,成本结构差别很大,选型时要看的不是「哪类更好」,而是「这一批要什么」。
2.1 强模型生成:质量高,暗成本在核验
用能力更强的模型生成,是长尾样本最直接的来源。它的显性成本是调用开销,但真正的大头是暗成本——生成的每一条都要被核验,而核验通常又要花一次调用。
这类来源的产出特点是:单条可用性高度依赖提示设计,且分布容易聚集在生成模型自身的偏好上。
2.2 规则模板批量合成:可控但天花板低
模板合成的显性成本极低,几乎只有计算资源的开销。它的优势是可控:参数空间、边界值、异常组合都能显式枚举,覆盖面是「算出来的」而不是「生成出来的」。
天花板在于模板只能生成「你已经想到的形态」。真实用户那种夹带错别字、隐含上下文、跨轮省略的问法,模板写不出来。
模板的设计要点是枚举而非描述:把可枚举的维度(业务类型、状态流转、数值区间、时间先后)显式列出来做笛卡尔组合,再配一组非法组合作为负样本。这样造出来的样本集合,覆盖度是可以算出来的——知道枚举了多少组,就知道漏了哪些组。
2.3 真实数据增强与轨迹回放
真实数据增强指在已有真实样本上做改写、加噪、跨语言转换。它保留了真实分布的骨架,成本主要在改写质量把控上——改得轻没效果,改得重语义就漂了。
轨迹回放指把一次真实交互的完整步骤(观察、动作、结果)拆成过程数据。它的成本在采集与脱敏:要记录全,又要删掉不该留的内容。它的价值是四类来源里唯一能提供「过程监督」的一类。
| 来源 | 成本主要在哪 | 覆盖能力 | 主要风险 |
|---|---|---|---|
| 强模型生成 | 调用 + 逐条核验 | 长尾语义与推理 | 分布聚集在生成者偏好 |
| 规则模板 | 模板设计与维护 | 参数与边界组合 | 形态单一、模板痕迹 |
| 真实数据增强 | 改写质量把控 | 真实分布在邻域的扩展 | 语义漂移 |
| 轨迹回放 | 采集与脱敏 | 过程与步骤监督 | 记录不全或泄露 |
四类来源通常混用:模板铺量、增强保底、强模型补难点、轨迹回放提供过程信号。一条轨迹记录的最小形态大致如下:
⚠️ 代码待验证
{"trajectory_id":"traj_0007","steps":[{"role":"observe","content":"...","masked":["phone","id_card"]},{"role":"action","tool":"query_order","args":{"order_id":"..."}},{"role":"result","status":"ok","content":"..."}],"outcome":"resolved","desensitized":true}masked字段是轨迹回放能不能用的前提:任何未脱敏的轨迹都不该进入合成池,这条在讲留痕时会再出现一次。
三、为什么长尾场景离不开它
3.1 长尾的真实数据在量上见顶
真实业务数据的分布极不均匀:常见场景的样本多到用不完,长尾场景可能一年也就那么几次。而模型能力的分水岭恰恰在长尾——常见场景的样本早被喂饱了,剩下的提升空间全落在长尾上。
于是出现一个反常现象:越需要的那类样本,真实数据里越少。合成数据在这里不是锦上添花,而是长尾覆盖唯一能规模化推进的手段。
长尾清单不要凭想象列,从三个现成的来源里捞更靠谱:线上失败请求的聚类结果、客服与工单里的高频抱怨、以及搜索或检索里长期零结果的查询。这三处指向的都是「真实存在但当前系统答不好」的场景,比拍脑袋想出来的场景清单可靠得多。
3.2 隐私与采集成本把可用样本又压掉一层
即使真实数据里存在长尾样本,它也未必能用。含个人信息、含敏感字段、含第三方内容的样本,要么被脱敏到失去训练价值,要么根本不能出域。
采集成本也是硬约束:为了收集某个罕见场景,可能要等很久,或者专门设计埋点,而收益迟迟看不到。这两个约束叠加,把「可用样本」从真实数据里又筛掉一层。
3.3 长尾恰恰决定可用性
一个系统的「可用」不是看它在常见场景上的表现,而是看它遇到长尾时会不会突然崩掉。常见场景的错误用户可能忍,长尾场景的错误常常直接导致整个流程失败。
| 场景类型 | 真实样本可得性 | 合成能补什么 | 不能补什么 |
|---|---|---|---|
| 高频标准问法 | 充足 | 无必要 | — |
| 低频专业问法 | 稀少 | 语义与术语覆盖 | 真实的口语化偏差 |
| 边界与异常 | 极稀少 | 参数与状态的组合枚举 | 真实系统的偶发行为 |
| 跨轮指代 | 稀少 | 结构化指代样本 | 真实用户的省略习惯 |
把这张表反过来读,就是合成数据的使用边界:它能补覆盖,补不了真实分布里那些随机、脏、不规整的部分。这也是第七章落地顺序里「先评测、后训练」的原因。
四、质量过滤的最小管用做法
合成数据的可用性几乎完全取决于过滤。过滤不是一道,是几道串联,顺序本身也是设计的一部分。
4.1 格式与可执行性过滤
第一道是格式过滤:结构能不能解析、字段齐不齐、枚举值是否在允许集合内。这一道是确定性的,跑起来便宜,能拦掉相当一部分明显不合格的样本。
第二道是可执行性过滤。对话、工具调用这类样本可以直接「跑一遍」:工具调用的参数能不能被真实接口接受,代码能不能执行,检索样本能不能命中预期条目。跑不通的直接丢,不需要人去判断。
判据要落到具体形态上:接口调用看返回状态与必填字段是否非空,代码看能否跑通并产出预期形态的结果,检索样本看命中的条目是否与问题语义相关。凡是要靠人眼判断的,说明这条判据还不够硬,应该再往下拆一层。
4.2 自洽性与规则校验
自洽性检查的思路是:同一个问题用同一模型采样多次,看结论稳不稳定。结论稳定的样本更可能是有明确答案的;结论在多次采样间来回摇摆的样本,要么问题本身有歧义,要么生成过程不稳定,两类都不适合直接进池。
规则校验处理那些有客观约束的样本:数值范围、单位一致、引用可追溯、日期先后合理。这类约束由规则判定,不引入模型,因此判定结果可复现、可审计。
4.3 多裁判交叉打分取交集
对于「好不好」这类主观判定,单个裁判容易有偏好。做法是让几个独立的裁判分别打分,只保留全部通过的样本——取交集而不是取平均。
取交集的代价是过滤率明显升高,好处是留在池子里的样本,多个独立视角都认可。这种「宁可少、不愿脏」的取向,在进入训练之前尤其重要。
过滤流水线大致按下面的顺序串起来:
⚠️ 代码待验证
deffilter_sample(s,pipeline):# 一道不过即淘汰,不进入下一道ifnotpipeline.format_ok(s):return"drop","format"ifnotpipeline.executable_ok(s):return"drop","executable"ifpipeline.self_consistency(s)<pipeline.min_consistency:return"drop","inconsistent"ifnotpipeline.rules_ok(s):return"drop","rule_violation"verdicts=pipeline.judge_ensemble(s)# 取交集:全员通过才算通过ifnotall(v.passedforvinverdicts):return"drop","judge_split"return"keep","ok"自洽性检查本身的采样与比对逻辑,是这条流水线里最容易写错的一环:
⚠️ 代码待验证
defself_consistency(s,sample_n:int,extractor):answers=[]for_inrange(sample_n):raw=generate(s.prompt,temperature=0.9)answers.append(extractor(raw))# 归一化:抽结论,不比对原文main=most_common(answers)returnanswers.count(main)/sample_n两个坑:一是比对前必须先归一化,抽取结论而不是直接比字符串,否则同义表述会被误判为不一致;二是采样温度要固定并留档,换温度等于换了一批数,前后不可比。
五、多样性比正确性更难管
5.1 过滤太狠会退化成高分但同质
过滤的力度和多样性是反向的。判据定得越严,能通过的样本越集中在「规整、标准、没有争议」的那一类。结果就是数据集在各项过滤上表现都好,但内部高度同质。
同质数据的危害在训练上很具体:模型在这批数据上表现好,遇到真实分布里那些不规整的输入就退化。因为同质数据没有教它「怎么应对变化」,只教了它「标准答案长什么样」。
5.2 用哪些量看多样性
正确性可以靠裁判和规则判,多样性没有单一指标,要看一组量。
| 指标 | 定义 | 异常信号 |
|---|---|---|
| 模板覆盖率 | 命中不同模板的样本占比 | 少数模板贡献大部分样本 |
| 结论分布熵 | 答案与分类标签的分布集中度 | 熵偏低说明答案趋同 |
| 句式长度分布 | 样本长度与句式的分布 | 长度高度集中 |
| 与真实集的距离 | 合成集与真实小样本集的分布距离 | 距离持续拉大 |
| 参数组合覆盖 | 工具与检索样本的参数组合覆盖 | 新组合长期不增长 |
这几个量要一起看:单看结论分布熵,可能被「答案本来就该集中」误导;单看模板覆盖率,又可能被「模板故意写得很散、但句式仍同质」误导。任何单指标都能被针对性地刷高。
5.3 阈值该松在哪一头
一个可操作的取向是:正确性相关的那几道从紧,多样性相关的那几道从松。格式、可执行性、规则校验这类硬约束不放松;裁判打分这类主观判定,可以对「边界样本」留一个复审缓冲,而不是直接淘汰。
换个说法:不要用主观裁判的高分门槛去换同质。真正需要严格的是「这条样本是不是真的成立」,而不是「这条样本是不是足够漂亮」。
复审缓冲的具体做法:把多裁判打分不一致的样本单独放进一个队列,按比例抽检,而不是直接判死。抽检通过的样本回灌进池;长期不通过的样本,回头看是不是判据本身定得太紧。这样处理,分歧样本既没有污染主池,也没有被无谓丢掉。
完整版资料清单:本文用到的数据过滤检查清单与术语对照都整理在里面了,扫码即可获取:
六、自产自用的三类风险与来源留痕
用自己的模型生成数据、再用这批数据训练或评测同一个模型,是合成数据里最需要警惕的用法。
6.1 偏差放大
生成者自身的偏差会以两种方式被放大。
一是「错的被反复生成」。如果生成模型在某个知识点上系统性出错,它合成出来的同类样本会带着同样的错误,而过滤救不了——因为过滤用的裁判如果是同族模型,它也会认为这个错误是对的,两道一起错。
二是「对的被过度复制」。模型偏好的表达方式反复出现,数据里这类模式越来越多,训练继续强化它。
6.2 模式塌缩与评测自证
模式塌缩是偏差放大的另一种表现:生成来源单一、模板有限时,输出的句式和结构会趋同。数据越长越大,但信息量并没有同比例增长。
评测自证更直接:用生成数据的模型去评判它自己生成的数据,两者共享同一套偏好,评分自然偏高。这种自证不会体现在单条样本上,而是体现在整批结论上——内部看着齐整,一换外部视角就露馅。
规避方式不是在评测阶段补救,而是在生成阶段就做隔离:生成用的模型与评测用的模型分开,裁判至少有一部分来自不同来源。若资源只允许用一个模型,那就把人工抽查的比例提上来,作为唯一的外部视角。
6.3 来源留痕与可追溯
留痕的目的很朴素:任何一个批次出问题时,能回答「这条数据哪来的」。
| 留痕字段 | 记什么 | 用来回答什么 |
|---|---|---|
| 来源类型 | 四类来源之一 | 这批是生成的还是增强的 |
| 生成者标识 | 模型与参数指纹 | 出问题时能不能定位到生成端 |
| 生成参数 | 温度、采样数、模板标识 | 这条能不能复现 |
| 过滤链 | 每道过滤的判定与分数 | 是谁放它进池的 |
| 人工复核 | 是否复核、谁复核、结论 | 有没有人看过 |
| 批次血缘 | 生成批次与训练批次 | 上游出问题能不能反查下游 |
落到表结构上,大致是下面这样:
⚠️ 代码待验证
CREATETABLEsynthetic_sample(sample_idTEXTPRIMARYKEY,source_typeTEXTNOTNULL,-- 生成 / 模板 / 增强 / 轨迹generator_idTEXT,-- 生成者标识generator_params JSON,-- 温度、采样数等template_idTEXT,-- 模板标识filter_trace JSON,-- 每道过滤的判定self_consistencyREAL,judge_scores JSON,human_reviewedBOOLEANDEFAULTFALSE,batch_idTEXT,-- 批次血缘created_atDATE);留痕不是「存档越多越好」。存了没法用,等于没存。判据是:拿到一个下游问题,能不能在几分钟内通过这几个字段定位到上游的哪一批、哪一次生成。
七、落地顺序与观测
7.1 落地顺序
合成数据的落地不要一上来就进后训练,按风险从低到高推进:
- 先用在评测集的困难样本补充。这一步只影响评测,出问题范围可控,还能顺便验证合成与过滤这条链路本身。
- 再用在冷启动的场景填充。新系统没有真实日志,用它顶上,同时把线上失败样本尽快回灌,逐步替换合成样本。
- 然后用在检索与工具覆盖。这类样本有可执行性校验兜底,跑不通的直接拦掉。
- 最后才考虑进后训练。到这一步,前面几轮的过滤与留痕数据已经攒够,才谈得上配比与混训。
这个顺序的反面是「先把合成数据丢进训练」——那样一旦分布偏离,问题会以「模型行为变得奇怪」的形式出现,而根因在一批看不清来源的数据上,排查极难。
数据集版本与配比要显式配置,不能进了训练阶段之后再随手改:
⚠️ 代码待验证
dataset_version:v7composition:real:0.6synthetic_strong:0.2synthetic_template:0.1augmented:0.1filters:min_self_consistency:0.6judge_pass_all:truelineage:synth_batch_id:b_20260930keep_trace:true配比里有一条纪律:合成数据的占比要能追溯到具体批次,任何一次配比上调都要有对应的过滤与抽检记录,否则就是凭感觉往训练里加东西。
7.2 观测记什么
合成数据进链路之后,要盯的量和只用真实数据时不一样,核心是四类:
合成样本占比。每个环节里合成样本的比例,以及这个比例的变化趋势。占比持续上升而真实样本没跟上,说明长尾覆盖在依赖合成,要警惕分布偏移累积。
过滤通过率与淘汰原因分布。每一道过滤淘汰了多少、为什么淘汰。通过率突然上升或下降,通常是上游生成变更的信号。
多样性指标。第五章那组量的变化。多样性单调下降,说明过滤或生成正在往同质方向收。
来源分布。四类来源的占比。某一类长期占绝对多数,意味着覆盖是偏的。
阈值的定法建议用历史分位数,而不是拍一个绝对值。先跑一段时间积累基线,再拿分位数当告警线;绝对阈值的问题在于,它不随数据规模变化,样本量一涨,同样的绝对值含义就变了。基线未攒够之前,宁可只记录、不告警。
| 指标 | 定义 | 异常信号 |
|---|---|---|
| 合成样本占比 | 合成 / 全量 | 持续上升且真实样本停滞 |
| 过滤通过率 | 通过 / 输入 | 突升突降 |
| 淘汰原因分布 | 各道过滤的淘汰占比 | 某一道突然主导 |
| 多样性指标 | 见第五章那组量 | 单调下降 |
| 来源分布 | 四类来源占比 | 单类长期占绝对多数 |
完整版资料清单:本文用到的数据过滤检查清单与术语对照都整理在里面了,扫码即可获取:
附表 A:关键取舍一览
本文涉及的工程判断集中在这里,方便按需回看。
| 取舍 | 本文结论 | 判断依据 | 位置 |
|---|---|---|---|
| 合成数据先用在谁身上 | 评测集与冷启动 | 出问题范围可控 | 第七章 |
| 它替代的是哪段数据 | 先问清,再选生成方式 | 扩边界与补密度松紧不同 | 第一章 |
| 四类来源怎么分工 | 模板铺量、增强保底、强模型补难、轨迹供过程 | 成本结构各不相同 | 第二章 |
| 长尾覆盖靠什么 | 合成,但要认清它补不了脏分布 | 真实长尾样本稀少 | 第三章 |
| 过滤怎么排 | 格式 → 可执行 → 自洽 → 规则 → 裁判 | 一道不过即淘汰 | 第四章 |
| 主观判定怎么定 | 多裁判取交集,不取平均 | 单裁判有偏好 | 第四章 |
| 阈值松在哪 | 正确性从紧,多样性从松 | 严门槛会换同质 | 第五章 |
| 生成与评测能否同源 | 尽量分开 | 同源会自证 | 第六章 |
| 留痕留多少 | 能几分钟定位来源即可 | 存了没用等于没存 | 第六章 |
| 配比能不能凭感觉调 | 不能,须可追溯到批次 | 否则是往训练里加黑盒 | 第七章 |
| 最该盯的指标 | 合成占比 + 多样性 + 来源分布 | 比单条质量更能反映偏移 | 第七章 |
附表 B:术语速查表
| 术语 | 含义 |
|---|---|
| 合成数据 | 由模型、模板或增强手段生成的、非真实采集的样本 |
| 后训练样本 | 训练收尾阶段用于对齐目标能力的样本 |
| 困难样本 | 模型当前答不好、用于拉开评测区分度的样本 |
| 规则模板合成 | 按预定义模板与参数空间批量生成的样本 |
| 真实数据增强 | 在真实样本上做改写、加噪、跨语言转换 |
| 轨迹回放 | 把一次交互的观察、动作、结果拆成的过程数据 |
| 可执行性过滤 | 用真实接口或执行环境跑一遍来验证样本 |
| 自洽性检查 | 同题多次采样,看结论是否稳定 |
| 裁判交叉 | 多个独立裁判分别打分,取交集 |
| 模式塌缩 | 生成来源单一时输出句式与结构趋同 |
| 评测自证 | 用生成数据的模型评自己生成的数据 |
| 来源留痕 | 记录每条样本的来源、参数与过滤过程 |
| 批次血缘 | 从生成批次到训练批次的上下游对应关系 |
写在最后:这篇用到的资料
写这篇文章时,我把几个模型的官方文档、参数表和实测记录都对了一遍,顺手整理成几份配套的东西:
- 大模型学习路线图:从 LLM 基础到 Agent 开发,各阶段该学什么、用什么资料
- 大模型全套教程:按主题分好的视频与文档清单
- 大模型实战好书:24 本,附每本适合的阶段
资料是我自己整理的,放在下面这个码上,扫码即可获取:
添加时备注「大模型」,优先通过。
拿到之后建议先看学习路线图那一份,先定位自己在哪个阶段,再决定学什么,比一上来就啃框架效率高得多。