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等运行参数:怎么跑、跑多少。完整字段见编写实验。
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。