跳到主要内容

合成种子数据:在首批千名用户到来之前启动微调

· 阅读需 10 分钟
Tian Pan
Software Engineer

有数据时,微调模型很容易。残酷之处在于产品诞生之前的那个时刻:你需要个性化来吸引用户,但又需要用户才能积累个性化数据。大多数团队要么完全跳过微调("以后再加"),要么花数周手工收集标注样本。两种方式都行不通。前者产出一个用户一眼就能看穿的通用模型,后者慢到等你有了数据,任务早已演变。

合成种子数据能解决这个问题——但前提是你必须清楚它在哪里会失效。

冷启动问题比看起来更棘手

显而易见的问题是你没有任何训练样本。不那么显眼的问题是:即便你能从演示、内部试点或利益相关者的演练中凑出十到二十个样本,它们也往往存在覆盖坍塌:这些样本反映的是幸福路径,是你已经预料到的场景。真实的用户行为更杂乱、更多变,并且常常以你无法预见的方式出乎意料。

当你在一个狭窄的种子集上微调时,模型只学会了在这个分布的窄切片上表现优异。它能处理你演示过的场景,在其他相邻场景上全面失败。这个问题往往在上线六周后才暴露,用户开始抱怨模型"总是给出同一类答案"。

这就是合成种子数据的目标——不是简单地复制你已有的样本,而是生成一套多样化的样本,在你真正了解用户空间之前,就覆盖你预期用户会占据的那个空间。

生成你的前500–1,000个样本

基础技术是带显式多样性压力的少样本提示。取十到十五个手工制作或从早期测试者处收集的种子示例,提示一个有能力的前沿模型生成相同格式的新样本,但明确要求它系统性地变化:不同的用户意图、不同的措辞方式、不同的具体程度、不同的错误情形。

关键词是"系统性地变化"。若没有显式的多样性压力,大多数模型会聚集在它们与该任务关联的典型措辞上。你最终会得到五百个本质上是同一个样本加上细微词汇替换的结果——在此基础上微调,教出来的模型只是自信地平庸。

实践中,这意味着围绕变化轴来设计生成提示:

  • 意图变化:对于客服任务,分别生成表达沮丧、困惑、紧迫感和随意询问的样本。
  • 复杂度变化:将简单的单句查询与需要模型同时追踪多个约束的多从句请求配对。
  • 领域子覆盖:对于编程助手,明确覆盖不同语言、调试场景、架构问题和文档请求。

Self-Instruct方法论——斯坦福Alpaca等模型的基石——用175个种子样本生成了52,000个指令-回复对,成本不到500美元。质量参差不齐,但即使是5.2万个多样化的嘈杂样本,也明显优于在175个精良样本上微调的模型。在生成阶段,规模和多样性比完美更重要。完美来自过滤。

多样性采样:不要测量你以为自己在测量的东西

朴素的质量指标是覆盖率:你的生成样本是否跨越了预期输入空间?朴素的多样性指标可能是独特n-gram比率或词汇量大小。两种度量都会误导你。

问题在于LLM系统性地过度生成常见的、典型的措辞,同时生成边缘情况和低频模式不足——恰恰是区分有效微调与噪声的那些模式。一个数据集可以有很高的n-gram多样性,同时在语义空间的一个狭窄带中密集聚集。

自适应覆盖采样(ACS) 通过图方法解决这个问题:在生成样本上构建相似性图,然后用贪心最大覆盖来选择子集。反直觉的发现是,目标覆盖率低于1.0——通常是0.7–0.9——比使用全部生成样本产生更好的模型。原因是完整覆盖迫使你将低质量异常值和好样本一起纳入,而选择性覆盖让你能丢掉噪声。

一个实践中有效的更简单启发式方法:使用ROUGE-L相似度去重。丢弃任何与现有样本的最高ROUGE-L得分超过0.7的生成样本。这能消除近似重复,同时保留语义变化。虽不复杂,但快速、确定,能捕获最严重的同质化失败。

三层质量过滤器

原始生成输出不是训练数据,需要过滤后才能用于微调。

第一层:基于规则的过滤器。 删除过短(单词答案什么都教不了)、异常长(通常是幻觉螺旋的信号)或含格式违规的样本。这些过滤快速且免费。不要跳过。

第二层:LLM裁判打分。 提示一个模型——理想情况下是生成时用的同款前沿模型或更大的模型——按任务定制的评分标准对每个样本打分:准确性、帮助性、指令遵循、无幻觉。过滤掉最差的四分之一。斯坦福的AlpaGasus项目对此做了具体演示:用GPT-4作为裁判,将52,000个指令对过滤到9,000个高质量样本,产出的模型优于在全部52,000个样本上训练的模型。数据更少,模型更好。

第三层:人工抽检。 抽取50–100个样本亲自检查。这里不是在验证统计质量,而是在捕捉规则和LLM裁判都会遗漏的系统性失败模式:文化不敏感、任务漂移、细微领域错误、技术上正确但实际上无用的样本。对100个样本进行一小时人工审查,能防止六周调试一个神秘表现不佳的模型。

过滤后,针对领域专项任务目标500–1,000个高质量样本。在这个规模上,对7B–13B模型进行LoRA微调将产生可测量的行为变化,无需昂贵的全量微调。如果你发现自己想要10,000+个合成样本,这通常是生成质量太低的信号,而不是需要更大量的信号。

会悄然毁掉你模型的失败模式

这是大多数合成数据教程跳过的部分。

模型坍塌。 如果你从模型A生成数据,在此基础上微调模型B,然后用模型B为下一轮迭代生成更多数据,你会观察到渐进式性能退化。每一代都放大了前一个模型的偏见和措辞模式。模型变得自信地狭窄:在见过的事物上高准确率,在任何相邻事物上灾难性失败。2025年ICLR发表的研究表明,即使后续训练轮次中只有10%的合成数据比例,也会明显增加测试损失。解决方法是永远不要用你微调后的模型作为生成器,始终使用外部的、无关的前沿模型来生成。

偏见放大。 你的种子示例中存在的任何系统性偏见都会在生成数据中复合。如果你的十个种子样本都展示正式、谨慎的回应风格,你的1,000个生成样本会更加正式和谨慎。如果你的种子偏向某个用户人群,生成数据将更强烈地代表该人群。对此没有自动化的解决方案——需要刻意构建跨越你关心的偏见轴的种子样本。

分布偏移。 LLM生成的文本有可测量的分布指纹:它倾向于更平滑的措辞、更少的不流畅、比真实用户输入更"教科书"的结构。在合成数据上微调的模型会遇到措辞笨拙、句子不完整、有拼写错误、表达意图模糊的真实用户——分布差距表现为鲁棒性降低。你无法消除这一点,但可以通过在生成时注入一些刻意不完美的样本来减少它:在种子集中包含拼写错误、截断的查询和模糊的措辞。

安全退化。 研究表明,即使合成数据本身不含任何有害内容,在合成数据上微调也会引入安全退化。机制是微调以部分覆盖安全训练的方式移动了模型的输出分布。一项研究发现,在小型合成数据集上微调导致几个测试模型的关键危害率超过50%。如果你的应用在敏感领域运行,需要在质量过滤中包含对抗样本,并在微调后运行有针对性的安全评估,而不仅仅是基准评估。

设计向真实数据的过渡

合成种子数据是脚手架,不是地基。目标是构建一个足够好的模型来部署,收集真实用户交互,然后逐步用人工生成的样本替换合成训练样本。

一个实际的过渡方案:

  1. 第0–4周:在500–1,000个合成样本上微调。部署时带保守的输出过滤。
  2. 第4–8周:收集真实用户交互。记录输入和输出。对10%的样本进行质量审查。
  3. 第8周+:开始以1:1的比例将真实样本混入训练集。重新训练。
  4. 第3个月+:随着真实数据量增长,减少合成数据比例。当你有了2,000个高质量真实样本时,你可以淘汰大部分合成数据。

在过渡期间需要关注的指标不是基准准确率——而是在实际生产分布上的行为一致性。合成数据对基准的提升幅度大于对生产行为的提升,真实数据则相反。真实数据明显主导的交叉点来得比大多数团队预期的更快。

不要做什么

不要用微调后的模型来生成更多训练数据。不要因为生成样本便宜就跳过质量过滤。不要把基准提升当作验证——在目标分布的真实样本留置集上评估。不要在合成数据上微调然后在没有针对合成数据引入的特定失败模式进行有针对性评估的情况下就上线。

不要把合成数据当作真实用户数据的永久替代品。它是一座桥。快速建好,穿过去,然后随着真实数据的增长把它烧掉。

刻意从小处着手

微调中的冷启动问题是真实存在的,但用十到十五个精心构建的种子示例、不到100美元的生成预算和严格的三层过滤流程就能解决。做得好的团队不是那些拥有最复杂生成流水线的团队——而是那些对放入种子集的内容最谨慎、对通过质量过滤的内容最偏执的团队。

在种子样本上花一天时间。这是你在微调过程中投入的最高杠杆的时间。

Let's stay in touch and Follow me for more thoughts and updates