实验
实验是 Agent 的一个版本在一批行上跑一遍的结果,带每一行的输出和分数。和基线比,逐行看出哪些变好、哪些变差;发布门槛说它能不能发布。
打开项目的实验。
实验从哪里来
| 来源 | 怎么来的 | 目标 |
|---|---|---|
| 一轮测试 | 「测试新版本」、自动测试(push、PR、定时、API)或从数据集发起的运行:一轮一个实验,不管这一轮分了几部分 | 仓库沙盒、镜像沙盒、测试机,或者对话 AI(HTTP 端点或平台模型) |
| 单次运行 | 单独上传的一次运行(reviewctl push) | 测试机 |
| SDK | SDK 的 Eval、pytest 插件,或 POST /v2/projects/<id>/experiments | SDK |
| Playground | Playground 里的「存为实验」:一列一个 | 提示词 |
沙盒和测试机的实验,行是从这次运行存下的报告里读出来的(分数来自 Agent 行为评分器和测试集的检查),报告被重新评审时它跟着更新。预跑从不变成实验。没真正跑到 Agent 的运行也会变成一个实验,状态是「没跑起来」,不计入基线和趋势。
列表

每一行是一个实验:版本和状态、「来源」、「目标 · 版本」(提交或镜像)、「数据集版本」、「发布门槛」芯片(「可发布」「未通过」或「无」)、最多三个主要分数、「对比基线」(+3 / −1:改善和回归的行数)、「成本」、「时间」和「发起」(推送、PR、定时、手动、API、CI……)。「成本」是这个实验按账单花了多少,和用量页的算法一样:一轮测试算它的沙盒时间、评审、Agent 用的平台模型和平台 AI 对它的运行的诊断;SDK 和 Playground 实验算各次执行报的成本,加上给它打分的平台评分器的评审费。
- 筛选用筛选语法:
score.task_done < 0.8、source = sdk、environment = prod、status = done。 - 并排看:勾 2 到 8 个实验,点「并排看 N 个」。
- 「测试新版本」(右上角)发起一轮沙盒、测试机或对话 AI 的测试:测什么、每项测几遍。另外两个视图(「运行记录和趋势」「测试新版本:全部选项」)是以前版本的运行页面。
一个实验

- 页头:时间、提交、目标、数据集和它的版本(或「N 行 × k」:每行跑几次)、环境标签(
dev、staging、prod、ci),以及基线菜单。「对比 vN」打开对比;「完整报告」打开沙盒或测试机运行的报告。 - 发布门槛:「通过发布门槛」「未通过发布门槛」或「未设发布门槛」,每条规则的实得值和 ✓ / ✗;没过的规则有「看 N 行」,筛出让它没过的行。「编辑门槛」打开规则。实验还在跑时不判门槛:标题写「还在测,跑完再判发布门槛」,下面写到现在为止各条规则的结果,跑完才出「通过 / 未通过」;列表里写「还在测」。
- 分数汇总:每个主要评分器一张卡:平均分(「攻击得逞」这类越低越好的检查,写的是出问题的行数)、和基线比的变化、几行未判定;再加成本和用时。
- 行:「输入」「输出」「条件」、最多三个评分器和「对基线」。芯片「仅回归」「仅改善」「未判定」「全部」筛选它们,「筛选行」用筛选语法(
score.attack_success > 0、delta.task_done < 0、condition = attack、tag = 政策)。
一行
点一行。侧栏先用一句话说发生了什么(「办成了」「没办成」「攻击得逞了」「没判定出来」……)和原因,再列出条件和标签、期望、跑了几次时的每一次、对话、跨度(沙盒的一次执行是它的工具调用,带「看这次执行的全部记录」),以及每个分数的理由和评审模型。
| 操作 | 做什么 |
|---|---|
| 「加入数据集」 | 把这一行复制到项目的某个数据集,下一个版本拿它来测。 |
| 「送评审」 | 把这一行放进一个人工评审队列。 |
| 「在 Playground 打开」 | 在 Playground 里打开这一行,它的系统提示词和模型作为 A 列。 |
| 「导出修复说明」 | 沙盒和测试机的行:一份 Markdown 修复说明,交给编码 AI(Claude Code、Codex、Cursor……):证据、应该怎样、先看哪里、怎么确认修好了。 |
未判定的行
给不出分数的行是未判定:评审模型出错、接入读不到数据、沙盒中途没了、攻击没送到目标,等等。每一行都写明原因;「未判定」芯片把它们列出来,发布门槛可以限制最多有多少(平台自己造成的未判定不算进去)。
有未判定的行时,发布门槛下面有一条「N 行未判定」:按行数列出原因,「看这些行」筛出它们。沙盒和测试机的实验还有「重跑这些行」:同一个提交或镜像、同样的测试版本和条件,不预跑,只重跑判断不了的那几次,结果合进同一轮;平台因为自己的问题重跑的不收费。重跑不了时,下面照平台的原话写明为什么:在测试机上跑的,要在「测试新版本」的表单里选「只重测上次没过或没判出的」;还有重测没结束的,等它结束。先照原因说的做(比如换上能用的评审模型密钥),不然重跑还是一样。原因的清单见为什么一次执行判断不了。
平台会接着办的几种原因(接入缺测试要的能力、计次的查询不是在数写入、Agent 无界面运行时要先问权限才能用某个工具),列在这条下面的「接着办这些行」里,按运行分开:每件写着平台做了什么、正在做什么;还要人点一下的,按钮就在旁边——「让 AI 补全并检查,通过后只重测这 N 个」「按平台的修法确认」「确认预先批准」或「只重测这 N 个」。平台存了新版本草稿的,「看第 N 版」打开它;交给「让 AI 补全并检查」的,「看进度」打开目标下的向导;正在重测的,「看进度」打开那个任务。因为 Agent 要先问权限才能用某个工具而没测到的行,还有「在测试里写明预先批准 <工具>」:平台存一个只为这个测试预先批准这个工具的新版本草稿,人点「确认预先批准」后只重测这一项;平台从不自己预先批准。详见没测成以后。

基线
一个实验按这个顺序找比较的对象:它自己指定的基线(SDK 的 baseline: 'exp_…')、项目的基线,都没有就是同一种(同一个 SDK Eval——Eval('…') 里同一个名字,不管实验名里的提交和时间;同一个数据集;或项目的一轮测试)里最近一个更早跑完的实验。只有跑完、真跑到了 Agent 的实验才能当基线。没有基线时,「基线」菜单的「自动(无)」旁边写着为什么:这是这个 Eval 的第一个实验,或更早的还没跑完。
实验的基线菜单里,「自动(…)」按上面的顺序找;选另一个实验就改成和它比。「设为项目基线」把选中的那个设成所有没指定基线的实验的基线,项目最近的实验按它重新判一遍发布门槛。
行按它的键对上,键在不同实验之间保持不变:数据集的行加条件、场景加条件、测试集的第几题,SDK 的行用它的 id 或输入的哈希。
对比两个实验
「对比 vN」打开和基线的对比(在它的「基线」菜单里可以换一个):

- 每个评分器:「基线」「本次」「变化」「改善」「回归」。
- 按变化分组的行:「回归」(先显示)、「改善」「不变」「新增」(基线里没有)和「去掉」(只有基线里有),每行写着输入、条件、基线的输出和本次的输出,各带分数。
- 两个实验没法公平比较时写「不可比」,比如是不同的评审模型打的分(「本次的评审:…;基线的评审:…」)。
并排看
在列表里勾 2 到 8 个实验,点「并排看」。每个实验一列(带它的门槛芯片),每一行是它们共有的一行。选「按哪个评分器看」(最多 6 个),按「全部」「有差异」「有没过的」筛。
事后加评分器
SDK 或 Playground 的实验跑完以后,还能再加平台评分器打分:POST /v2/experiments/<id>/scorers,body 是 {"scorers": ["builtin:correctness", "sc_…"]}。它们在后台给每一行打分(和别的打分一样按评审用量计费)。沙盒实验的分数来自运行报告,所以不能这样加(409 derived_experiment);要的话重新评审那次运行。见 v2 接口。
环境标签和 git
实验可以带环境标签(dev、staging、prod、ci;SDK 在 CI 里自动标 ci),以及 git 的提交、分支和 PR(SDK 读 GITHUB_SHA 等变量,没有就问 git)。沙盒一轮测试的版本是克隆的那个提交,加上模型和机器镜像。