模板与程序化生成

本节目标

用因子矩阵、模板、模拟器和固定随机种子生成可解释的候选样本,并正确保留 family 与 provenance。

直觉解释

模板没有生成模型自然,但它像透明的实验夹具:每个变化来自哪个条件、正确答案为何成立、如何复现都很清楚。对 JSON、工具参数、权限边界和状态机任务,程序化生成往往是第一选择。

核心概念

  • factorial design:系统组合多个离散因子,显式检查覆盖。
  • template:把受控变量填入固定语言或结构。
  • simulator:根据状态和动作规则产生输入、轨迹与 outcome。
  • seed:让随机抽样和排列可重复;seed 不能修复错误逻辑。
  • family ID:标记同一模板/原始事件的变体,用于组级划分。
  • oracle:由规则或模拟器给出的期望答案/状态。
  • provenance record:模板版本、变量、seed、代码版本和生成时间。

全组合、约束组合与抽样

若有 6 个因子、每个 5 个取值,完整笛卡尔积已有 格,还未加入语言改写。先用业务规则删除不可能组合,再把安全/权限等高风险交互设为必须覆盖;资源有限时可采用 pairwise 等组合测试思想,但必须把未覆盖的高阶交互列为缺口。随机抽样只能在已定义的任务空间内分配预算,不能替代任务空间设计。

模板、模拟器和 property-based testing 可以分工:模板控制表述,模拟器决定状态转移,属性检查验证“不越权”“不会重复付款”“最终状态可复现”等不变量。对 Agent 数据,input + expected_text 往往不够,还要保存初始状态、允许工具、期望最终状态、禁止副作用和 reset 方式。

分步骤方法

  1. 从数据契约选 2~4 个关键因子,避免一开始组合爆炸。
  2. 为每个组合写可程序验证的 oracle。
  3. 每个语义 family 准备少量表述模板;先保证标签正确,再扩展语言变化。
  4. 生成稳定 ID,保留 family、模板 ID、变量和 generator version。
  5. 固定 seed 只用于排序、抽样或数值扰动;在 manifest 记录。
  6. 运行 schema、逻辑不变量和禁用值检查。
  7. 人工抽查每个条件格,而不是只随机看总体。

生成 ID 时不要把随机顺序当身份。稳定 ID 应来自 family、模板和变量的规范化表示;seed 只决定抽样/划分。这样更换顺序后仍能追踪同一候选,也能明确判断内容变化是否需要新版本。

示例

订单查询的三个因子:

language = {zh-CN, en}
scenario = {status, missing-id, write-request}
tool_state = {ok, timeout}

完整笛卡尔积有 个条件格。若 write-request 在 timeout 下没有业务意义,就在契约中明确排除,而不是生成后悄悄删除。

一个样本保留:

{
  "id": "syn-zh-status-ok-001",
  "family_id": "zh-status-ok",
  "template_id": "status-ask-v2",
  "variables": {"order_id": "SYN-001"},
  "synthetic": true,
  "generator_version": "template-pipeline-1.0.0"
}

使用明显的虚构 ID,避免误把真实标识符带入教程或共享数据。

常见错误与排查

  • 模板表面变化很多但语义相同:统计 family 与条件覆盖,不只数行。
  • 变量组合产生矛盾:写不变量,如 delivered 状态不能同时是 in-transit。
  • 每条变体随机划分:同一 family 会跨 train/test;按 family 划分。
  • 固定 seed 就称完全复现:还要冻结代码、模板和依赖。
  • 模板语言僵硬:把它作为可验证基线,再引入人工或模型改写并重新验收。

练习

  1. 为日历 Agent 设计“意图×时间表达×权限”矩阵。
  2. 写三个不变量和两个明确排除的组合。
  3. 设计不会泄露真实身份的变量池和 ID 规则。

自测

  1. 程序生成的标签一定正确吗?不一定,oracle 和模板代码也可能有 bug。
  2. 全因子组合一定必要吗?不一定,应按业务意义、风险和预算选择。
  3. 为什么保留 family ID?用于去重、分层诊断和防止变体跨划分。

小结与下一步

模板/模拟器提供透明可复现的骨架,但语言和开放任务覆盖有限。下一步进入 模型生成与条件覆盖,在不丢失契约和 provenance 的前提下扩展候选池。

参考资料