用途
generate-synthetic-data 用于为 LLM 流水线评估创建多样化、逼真的测试输入,覆盖流水线的失败空间。其适用场景是引导评估数据集,或真实用户数据不足时。
该技能强调:在生成合成数据之前,必须先识别流水线可能失败的位置。需要询问用户已知的易失败区域、审阅现有用户反馈,或从可用轨迹中形成假设。维度(第 1 步)必须针对预期失败,而非任意变化。
主要能力
- 基于维度的元组生成:维度是特定于应用的变异轴。根据预期失败选择维度。示例(房地产助手):
- Feature(用户想要的任务):[property search, scheduling, email drafting]
- Client Persona(用户服务的对象):[first-time buyer, investor, luxury buyer]
- Scenario Type(查询清晰度):[well-specified, ambiguous, out-of-scope] 建议从 3 个维度开始,仅当初始轨迹揭示新轴上的失败模式时才添加更多。
- 元组:元组是定义具体测试用例的维度值的一种组合。
- 两阶段生成:先由 LLM 生成元组组合,再单独将每个元组转换为自然语言查询。
- 质量过滤:审查生成的查询,丢弃措辞不自然、内容与元组意图不符或彼此过于相似的查询。可选:使用 LLM 对真实感按 1-5 分评分,丢弃低于 3 分的。
- 流水线执行与轨迹捕获:将所有查询执行通过完整 LLM 流水线,捕获完整轨迹:输入、所有中间步骤、工具调用、检索文档、最终输出。目标约为 100 条高质量、多样化的轨迹。这是一个用于达到饱和(新轨迹不再揭示新失败类别)的粗略启发式,具体数量取决于系统复杂度。
- 真实用户数据分层采样:当有真实查询可用时,不要随机采样。步骤:1)识别高方差维度(阅读查询,找出其差异方式:长度、主题、复杂度、约束存在与否);2)分配标签(小集合与用户共同完成;大集合使用查询嵌入上的 K-means 聚类);3)从每组采样,确保覆盖各类查询类型,而不仅仅是最常见的类型。当真实与合成数据都可用时,用合成数据填补代表性不足的查询类型。
使用方式
该技能本身不提供安装命令或代码。其核心流程分六步:
第 1 步:定义维度
维度是特定于应用的变异轴。根据预期失败位置选择维度。格式如下:
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, ...]
第 2 步:与用户共同起草 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)
第 3 步:借助 LLM 生成更多元组
提示词模板(保留原文,未改动):
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.
第 4 步:将每个元组转换为自然语言查询
此步骤使用单独的提示词。单步生成(元组与查询一起生成)会产生重复措辞。提示词模板(保留原文,未改动):
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.
第 5 步:质量过滤
审查生成的查询。出现以下情况时丢弃并重新生成:
- 措辞不自然或不真实
- 内容与元组意图不符
- 查询彼此过于相似
可选:使用 LLM 对真实感按 1-5 分评分,丢弃低于 3 分的。
第 6 步:将查询运行通过流水线
将所有查询执行通过完整 LLM 流水线。捕获完整轨迹:输入、所有中间步骤、工具调用、检索文档、最终输出。目标:约 100 条高质量、多样化的轨迹。这是用于达到饱和(新轨迹不再揭示新失败类别)的粗略启发式。具体数量取决于系统复杂度。
采样真实用户数据
当有真实查询可用时,不要随机采样。使用分层采样:
- 识别高方差维度——阅读查询,找出其差异方式(长度、主题、复杂度、约束存在与否)。
- 分配标签——小集合与用户共同完成;大集合使用查询嵌入上的 K-means 聚类。
- 从每组采样——确保覆盖各类查询类型,而不仅仅是最常见的类型。
当真实与合成数据都可用时,用合成数据填补代表性不足的查询类型。
适用场景
- 引导评估数据集。
- 真实用户数据不足或需要覆盖预期失败场景时。
- 系统可用轨迹有限,需要从假设出发生成测试输入。
限制与反模式
- 无结构生成:在没有维度/元组结构的情况下提示“给我测试查询”会产生泛化、重复的 happy-path 示例。
- 单步生成:在一个提示词中同时生成元组和查询,比两步分离的多样性更差。
- 任意维度:不针对易失败区域的维度会浪费测试预算。
- 跳过用户对元组的审查:如果用户未先验证元组,就无法判断 LLM 生成的元组是否真实。
- 无人能判断真实性时使用合成数据:如果没人能判断合成轨迹是否真实,应改用真实数据。
- 将合成数据用于复杂的领域特定内容(法律文件、医疗记录),这些场景下 LLM 会遗漏结构细微之处。
- 将合成数据用于低资源语言或方言,这些场景下 LLM 生成的样本不真实。
该技能未提供安装命令、代码、收费信息或平台要求。