跳转到主要内容
Experiment 说明对着哪个 Agent、用哪个模型、开哪些 flags、跑几次。它用来比较模型、prompt 和功能开关:flags 就是 A/B 测试里的 feature flag,一个 Experiment 是一组 flag 取值。

一个 Experiment 里有什么

Experiment 是 experiments/ 下可签入的 TypeScript 文件,核心就几个字段:
  • agent:评谁。这里放已经配置好的 Adapter 实例。被测系统的地址和鉴权在创建实例时传给 Adapter,不写进 Experiment 的其它字段。
  • model / flags:交给 Adapter 的实验条件。flags 只接受扁平的字符串、有限数字或布尔值,NiceEval 不解释它们的含义。Adapter 声明了 parseFlags 时,先校验和规范化,再经 ctx 交给 Adapter;Adapter 随请求转发,应用按值切换行为。模型对比(Tier 1)和功能 A/B(Tier 3)都走这条路,见接入等级。
  • attempts、budget、并发、sandbox 等运行参数:怎么跑、跑多少。完整字段见编写实验。
Experiment 还有一对实验级 Hook setup / teardown:整个实验只跑一次,在你自己的机器上执行,用来起停所有 Attempt 共享的服务(比如一条到内网服务的隧道、一个实验专用的 mock server)。 setup 在这个实验的第一个 Attempt 开始前执行。teardown 在全部 Attempt 结束后执行,运行被中断时也会执行;但只有 setup 已经执行过,teardown 才会执行。 要在 Sandbox 里为整个实验准备环境,把准备步骤挂在 sandbox 字段的 .before() 上。内容不变的步骤下次可以直接沿用;动态回调可以用 context.onCleanup() 登记收尾。写法见启动实验共享服务与Sandbox · 按顺序准备 Sandbox。 同一个实验里,不同评估用例需要不同的预制环境时,把指定预制环境的 sandbox 配置写在各评估用例上,Experiment 就不再指定。重复的配置用普通的 TypeScript 函数复用,不需要额外注册。同一个 Experiment 仍然能覆盖全部评估用例,NiceEval 会逐条把评估用例的配置和 Experiment 的配置合在一起。写法见编写实验 · 不同评估用例需要不同环境。

矩阵对比

要比较的每个变体写一个 Experiment 文件:两个模型就是两个文件,只差 model 一行。prompt A/B 就是只差一个参数。同一批评估用例在多个 Experiment 下各跑一遍,再比较同一时刻已发布的结果。每个 Experiment 按自己跑的评估用例计算分母,不会硬凑一个共同的交集。适合比什么、结果怎么读,见编写实验。 只用于报告归类、不影响运行过程的值写进 labels。它们记在 Run 上,不会传给 Adapter 或评估用例。改了 labels 再运行,会建立一个带新标注的 Run,没受影响的旧结果照常沿用;历史 Run 保留当时的 labels。

相关阅读

  • 编写实验 — 比较模型和 prompt、读对比结果,以及常用字段。
  • 启动实验共享服务 — setup / teardown 的写法与时序。
  • 评估 — 另一半:评估用例是什么、生命周期与判定。
  • Tier — model / flags 各在哪一档生效。