开源工具skilleval通过真实调用Agent并断言工具调用、成本、激活技能等指标,为提示词工程提供可量化验证的测试框架。
Agent skills 是 prompts,不是代码,没有编译器来 catch 坏掉的那些。
Agent skills 靠荣誉制度发布。你重写一个,跑两遍,在 Slack 发点有说服力的东西,这就是 review。它更快吗?更可靠吗?会更贵吗?这不是策略。这是给 prompts 看的占星术。
这让我很困扰。不是因为我觉得人们不知道自己在说什么,而是因为他们无法证明自己知道。我改个按钮颜色都得经过 design review 和两次审批。Greg 可以因为喝了几杯咖啡感觉良好就在周五下午推送一个新的 database-migration skill。"相信我,"他说。"它出错少多了。"
所以我给它们写了测试。skilleval 接收一个 SKILL.md、一个 prompt、也许还有一个 fixture 给 agent 去处理,然后运行一个真实的 agent。接着你断言实际发生了什么:工具、文件、成本、skill 是否真正启动了、最终消息。通过或失败。不需要第二个模型来评分第一个。我不够聪明,无法调试两个 LLM 互相争吵。
expect(result).costUSD.toBeLessThanOrEqual(2)
expect(result).skills.activated.toInclude("refactor-code")
expect(result).toolsUsed.toInclude("read", "edit").not.toInclude("web")
expect(result).toolCalls.toIncludeInOrder([
{ name: "edit", args: { path: "src/foo.ts" } },
{ name: "shell", args: { command: /git commit/ }, exitCode: 0 },
])
expect(result).toolCalls.not.toIncludeInOrder([
{ name: "shell", args: { command: /rm -rf/ }, exitCode: 0 },
])
expect(result, workspace).file("src/foo.ts").toHaveBeenModified().toContain(/function Foo/)
expect(result).finalMessage.toMatch(/foo.ts refactored/)
结果被保存为 artefacts,所以如果你编辑了 skill 再运行就能看到 delta。skill 不会做完全相同的事两遍,这就是为什么测试要放在它留下的痕迹上。如果你够偏执,跑 N 次然后算通过率。
这阻止不了 Greg。但"它出错少多了"现在背后有了一个 result.json,或者没有。和按钮同等的标准。这是我想要的一切。
这是测试 skills 的一种方式。我相信还有其他的,我很想了解人们已经在做什么了。Repo 在这里,如果你试了,告诉我你的想法!