
图片:METAL
摘要
- Anthropic 从 Claude Code v2.1.269 起开放 claude plugin eval,让插件和技能的作者能给自己的成果打出分数。
- 每个用例默认跑三次,同样的次数再在不加载插件的情况下重跑一遍,两个分数之差以 delta 呈现。
- 六种评分器里有四种只读取运行记录和文件、不产生额外费用,另外两种要调用裁判模型,会算进账单。
Anthropic 给 Claude Code 的插件挂上了成绩单。9 月 11 日由官方开发者账号公布的 claude plugin eval 命令,会把插件或技能放进一套测试用例里跑并打分。该账号写道,作者应该"看看你的插件到底增加了什么价值,或者它是否还需要再打磨"。不过这件工具的重量不在分数本身,而在紧挨着它打出来的那个对照分数。
要用这条命令,需要 Claude Code v2.1.269 或更高版本。在插件根目录敲 claude plugin eval init 会打开一个交互式会话,Claude 读过插件之后反问作者什么才算好结果。接着它会分别提出应当触发插件的请求和不该触发插件的请求,为每一条设计评分器,先试跑一次,然后在 evals 目录下按用例写出各自的目录。想自己动手写用例的人,可以用 init --bare 拿到一份空白模板。
一个用例由一段真人可能真的会敲下的请求,加上一个或多个评分器组成。每次运行,Claude Code 都会新起一个隔离的非交互式会话,只加载这一个插件,让 Claude 一直干到自己收工或者撞上该用例的轮次与时间上限。评分器随后查看最后的回复、运行记录,或者 Claude 生成的文件,判定通过与失败。据文档记载,一个用例默认跑三次,单次运行的分数是通过的评分器所占比例,用例分数是这些运行的平均值。通过线默认是 1.0,所以只要有一个评分器出岔子,这个用例就不及格。
到这里都还是常见的评测工具。分岔出现在下一步。同一个用例会在完全不加载插件的状态下,用同样的次数再跑一遍,然后把开着插件的分数和关掉插件的分数并排摆出来。汇总表里打出 WITH 和 W/OUT,两者之差以 delta 呈现。
文档写道,"单凭一个高分,你无法判断插件是否真的起了作用"。开着是 1.0、关掉也是 1.0,那么让这个用例通过的就不是插件。这跟试药时必须同时设一组安慰剂是同一个结构。
文档给出的示例表里,某个用例开着插件是 1.00、关掉是 0.33、delta 为 +0.67,运行次数是 6 次。也就是说一个用例要跑六次,十个用例就是六十次。使用这件工具的人面对的第一重限制,就是每一次运行都是会计入自己账户的真实模型调用。Anthropic 也把这件事摆在文档最前面,同时给出了以美元设定费用上限的选项和关掉对照组的选项。关掉对照组,费用减半,delta 也随之消失。
评分器共有六种。其中四种不产生额外费用,因为它们只凭运行记录和文件判定:用正则匹配回复或文件内容、数某个工具被调用了几次、看两个工具的调用先后、确认文件是否生成。另外两种要调用裁判模型。其中 llm 评分器要三票里至少两票判定通过才算通过。没有让人自己写代码接进去的评分器。
Anthropic 在文档里预告的第一次结果才是有意思的地方。第一次跑下来,最常见的情形是 delta 在 0 附近,而检查技能是否被调用的那个评分器判为失败。这意味着面对自然措辞的请求,Claude 并没有选中这个技能,而解法不是改技能正文,而是改它的说明文字。METAL 曾报道过一项研究,发现在智能体技能上拉开性能差距的是流程而不是知识,而这件工具让人能先测出那套流程究竟有没有被叫起来。
为了让对照组诚实,Anthropic 还特意把一部分评分器从分数里剔除。检查技能是否被调用的评分器,在没有插件时绝无可能通过,照数就会把关掉插件那一侧的分数压向 0,把 delta 撑大。因此这类项目在两侧都不计入分数,只在开着插件的一侧留下通过或失败的标记。作者自己标为 with-only 的评分器同样处理。这相当于在设计阶段就把评测工具的手绑住,让它没法造出对自己有利的数字。
运行环境比想象的空得多。每次运行都会新建一次性的主目录、工作目录和 Claude Code 配置,而用户设置、钩子、CLAUDE.md、MCP 服务器、其他插件、记忆、技能全都不在场。Shell 环境变量也大多被挡掉,只有白名单和以 EVAL_ 开头的变量进得去。Artifact 工具是关的,测试用例的定义本身智能体也读不到。这有点像把厨房整个腾空,只把这道菜要用的食材摆出来。
权限设计是工程师接着该看的地方。运行不会停下来问许可。因此 Bash、Write、Edit、WebFetch、WebSearch 这类下手重的工具,没有授权就直接从会话里被移除,Claude 连调用的机会都没有。用例要求了而作者没有授权的工具,会在标准错误里打出 not granted。MCP 服务器默认不会真的启动,而是在按服务器划分的目录里,每个工具放一份 Markdown 充当假响应。在那份文件里写明期待的输入,插件一旦送出别的值,运行就会以 0 分中断,并记下原因。
接到 CI 上时,文档建议把通过线从 1.0 往下调,并把受测模型和裁判模型都固定住,免得把模型换版误认成插件变差。退出码也分得很清楚:0 是全部通过,1 是有用例低于通过线或用例文件加载失败,2 是撞上费用上限或凭据被拒的部分运行,130 是中断,143 是被强制终止,例如 CI 超时。写入或上传 HTML 报告时出的问题,不会改变退出码。
结果会留下一份自我完备的 HTML。它一个外部请求都不发,所以既能作为 CI 产物附上,也能直接从磁盘打开,而最上方用一句话打出插件效果比基线高出多少、有几个用例变好、几个持平、几个变差。delta 为负的用例左边缘会标红,光是滚动也会撞进眼里。若以 claude.ai 订阅身份登录,同一份报告还会作为私有 artifact 上传,地址一并输出。
Anthropic 也把这件工具量不到的东西写了下来。隔离机制收窄的是受测智能体能触及的范围,而不是给插件自己的代码围上栅栏,而通过测试这件事并不等于说这个插件是安全的。文档里还有一条建议:先怀疑裁判。技能被调用了而 delta 是负的,那就先看是不是小裁判模型把一个格式不同的正确答案判错了。量东西的装置和被量的对象出自同一个模型家族,这是这套做法要背的代价。
疑难排解那一节也把控制权在谁手上写得明白。出现命令不可用的提示,意味着 Anthropic 在服务端关掉了这项功能,文档明说自己机器上没有任何办法把它救回来。要把通过线接到 CI 上的团队,得把"量东西的装置本身挂在对方的开关上"这件事算进去。
METAL 确认文档中有一项写着并发可以从 1 调到 8,同时注明这些运行共用账户的速率限制,所以只会缩短挂钟时间,并不会把吞吐量往上抬。把一个插件接到 CI 关口上,意味着费用和时间都要事先算清。METAL 曾介绍过把团队设置打包成一个插件分发出去的做法,而这样分发出去的一包东西究竟有没有真的起作用,在此之前只能靠感觉。
插件生态因为这条命令往前走了一级。作者过去用来自夸的分数旁边,一旦并排放上关掉插件跑出来的分数,说明文字漂亮的技能和真正改变结果的技能就会分开。Anthropic 在自家文档里率先预告的结果是 delta 为 0,这本身就指明了方向。如今分发出去的插件里,相当一部分有没有都一样,而现在最先知道这件事的会是作者本人。





评论