评估用例:什么算做对
评估用例写在evals/*.eval.ts 里,说明发什么、检查什么。它不写对着哪个 Agent、用哪个模型跑,所以同一条评估用例可以换着被测对象跑。
检查分两类。确定的事实用确定的规则检查,例如调用了哪个工具、测试有没有通过。开放式的质量交给 Judge,也就是裁判模型,由它按你写的标准打分。见评估用例和 Judge。
Experiment:对着谁、怎么跑
Experiment 写在experiments/ 里,说明用哪个 Adapter、哪个模型、开哪些 flags、每条评估跑几次。要比较两个模型,就写两份只差 model 的 Experiment,对着同一批评估用例各跑一遍。见 Experiment。
Adapter 和 Sandbox:怎样连上被测对象
Adapter 是你写的连接代码。它把评估用例里的动作发给被测对象,再把返回翻译成 NiceEval 能读的事件,例如回复、工具调用和用量。接入可以从只实现send 开始,需要时再加 OTel 或 flags,见 Adapter 和接入等级。
Coding Agent 要在真实文件系统里改代码、跑命令,NiceEval 先创建一个隔离的 Sandbox,再在里面启动 Agent。直连的 Web Agent 和业务应用不需要 Sandbox。
Runner 和 Attempt:为什么同一条评估要跑多次
LLM 的输出不确定,同一个问题这次答对,下次可能答错。只跑一次,说明不了改动是否真的有效。所以 Experiment 用attempts 指定每条评估用例跑几次,每一次叫一个 Attempt。
Runner 按 Experiment 选出评估用例,展开成一批 Attempt,按并发限制调度执行。每个 Attempt 得到一个判定:passed、failed、errored 或 skipped。一批 Attempt 汇总起来,就是这条评估在这个配置下的通过率。计分制评估累计分数而不是读通过率,见通过制与计分制。
failed 和 errored 要分开看。failed 是被测对象正常回复了,但没做对。errored 是没能拿到可信的结果,例如服务没启动或凭据失效,它说明的是环境问题,不是被测对象的能力。
Record:结果留下来,供对比和追查
每个 Attempt 跑完,结果连同对话、工具调用、文件改动、耗时和花费,一起保存在项目的.niceeval/record.sqlite,这就是 Record。
结果留下来有两个用处。一是追查:回到某一次失败,看被测对象实际做了什么。二是沿用:再次运行时,没受改动影响的结果直接沿用,只重跑受影响的部分,见重跑与沿用。
读结果有三个入口:show 在终端逐层查看,你和 Coding Agent 都用它排查;view 在浏览器里翻对话和耗时;query 输出 JSON,给脚本和 CI 读取。三处读到的结论一致,见运行结果的数据流。