SuperAPI AI 工具集

generate-synthetic-data

测试与质量

查看项目

更新于 10-29 09:40

技能介绍

用途

该技能用于为 LLM 流水线评估生成多样化、贴近真实的合成测试输入,目标是覆盖流水线可能失败的场景空间。它适合在引导评估数据集时使用,也适合在真实用户数据不足、需要补充覆盖时使用。

前置准备

在生成合成数据之前,需要先识别流水线可能在哪里失败。可以询问用户已知的易失败区域、查看现有用户反馈,或从可用轨迹中形成假设。第一步定义的维度必须针对预期失败点,而不是任意变化。

核心流程

第一步:定义维度

维度是特定于应用的变异轴,应根据预期失败点来选择。

格式示例:

Dimension 1: [Name] — [What it captures]
  Values: [value_a, value_b, value_c, ...]

Dimension 2: [Name] — [What it captures]
  Values: [value_a, value_b, value_c, ...]

Dimension 3: [Name] — [What it captures]
  Values: [value_a, value_b, value_c, ...]

以房地产助手为例:

  • Feature(用户想要的任务):[property search, scheduling, email drafting]
  • Client Persona(用户服务的对象):[first-time buyer, investor, luxury buyer]
  • Scenario Type(查询清晰度):[well-specified, ambiguous, out-of-scope]

建议从 3 个维度开始。只有当初始轨迹揭示出新的失败轴时才增加维度。

第二步:与用户一起草拟 20 个元组

元组是维度值的一种组合,定义一个具体测试用例。向用户展示 20 个草拟元组并迭代,直到用户确认这些元组反映真实场景。用户的领域知识在此至关重要——他们知道哪些组合实际会发生、哪些不现实。

示例:

(Feature: Property Search, Persona: Investor, Scenario: Ambiguous)
(Feature: Scheduling, Persona: First-time Buyer, Scenario: Well-specified)
(Feature: Email Drafting, Persona: Luxury Buyer, Scenario: Out-of-scope)

第三步:用 LLM 生成更多元组

使用如下提示词生成 10 个随机组合:

Generate 10 random combinations of ({dim1}, {dim2}, {dim3})
for a {your application description}.

The dimensions are:
{dim1}: {description}. Possible values: {values}
{dim2}: {description}. Possible values: {values}
{dim3}: {description}. Possible values: {values}

Output each tuple in the format: ({dim1}, {dim2}, {dim3})
Avoid duplicates. Vary values across dimensions.

第四步:将每个元组转换为自然语言查询

此步骤使用单独的提示词。单步生成(元组与查询一起生成)会产生重复的措辞。

We are generating synthetic user queries for a {your application}.
{Brief description of what it does.}

Given:
{dim1}: {value}
{dim2}: {value}
{dim3}: {value}

Write a realistic query that a user might enter. The query should
reflect the specified persona and scenario characteristics.

Example: "{one of your hand-written examples}"

Now generate a new query.

第五步:质量过滤

审查生成的查询。出现以下情况时丢弃并重新生成:

  • 措辞生硬或不真实
  • 内容与元组意图不符
  • 查询之间过于相似

可选:使用 LLM 按 1-5 分评估真实度,低于 3 分丢弃。

第六步:将查询跑通流水线

将所有查询通过完整的 LLM 流水线执行。捕获完整轨迹:输入、所有中间步骤、工具调用、检索到的文档、最终输出。

目标:约 100 条高质量、多样化的轨迹。这是一个粗略的经验值,用于达到饱和(即新轨迹不再揭示新的失败类别)。具体数量取决于系统复杂度。

采样真实用户数据

当有真实查询可用时,不要随机采样,而应使用分层采样:

  1. 识别高方差维度——通读查询,找出它们在长度、主题、复杂度、是否含约束等方面的差异。
  2. 分配标签——小数据集与用户一起完成;大数据集使用查询嵌入上的 K-means 聚类。
  3. 从每组中采样——确保覆盖各类查询,而不仅仅是最常见的类型。

当真实数据和合成数据都可用时,用合成数据填补覆盖不足的查询类型。

反模式

  • 无结构生成。在没有维度/元组结构的情况下提示“给我测试查询”,会产生通用、重复、只走顺利路径的示例。
  • 单步生成。在一个提示词中同时生成元组和查询,多样性不如两步分离。
  • 任意维度。不针对易失败区域的维度会浪费测试预算。
  • 跳过用户对元组的审查。没有用户先验证元组,就无法判断 LLM 生成的元组是否真实。
  • 无人能判断真实度时使用合成数据。如果没有人能判断合成轨迹是否真实,应改用真实数据。
  • 复杂领域特定内容(法律文件、医疗记录)使用合成数据,LLM 会遗漏结构性细微差别。
  • 低资源语言或方言使用合成数据,LLM 生成的样本不真实。