Skill
评估 Skill
测试 Skill 是否在正确的请求上激活,并且真的提高了结果质量。
评估两件事
Skill 评估有两个层面:Agent 有没有加载 Skill,以及加载之后有没有让执行效果变好。
触发质量
描述是否会在该处理的任务上激活?
不触发质量
是否能在无关任务上保持不激活?
输出质量
激活后,Agent 的结果是否更好、更稳定?
构建触发查询
准备两组真实用户请求:应该触发的例子和不应该触发的例子。最好单独保留一组验证集,别让描述修改只针对一个小列表过拟合。
应触发: - 清洗这个 CSV,并报告无效行。 - 规范这些表格列以便导入。 - 按我们的 schema 校验这个客户导出文件。 不应触发: - 解释 CSV 是什么意思。 - 写一封产品发布邮件。 - 总结这段会议纪要。
隔离运行测试
每次评估都应该从干净上下文开始。如果之前的尝试或隐藏指令还留着,就没法判断是 Skill 本身导致的结果。
- 使用真实文件和真实提示词,不要只测玩具案例。
- 记录
SKILL.md是否被加载。 - 保存最终输出、错误、耗时和工具行为。
- 当任务不是确定性的时候,跨多次运行比较结果。
写断言
断言能让评估可重复。尽量用确定性检查,判断性强的输出再交给人工复核。
存在性必须的章节、字段、文件或引用存在。
正确性计算值、分类或转换结果符合预期。
格式输出符合规定的表格、JSON、markdown 或报告模板。
安全性避免禁用动作、错误假设或缺失提示。
可复制的评估脚本思路
对于结构化输出,一个小脚本就能在人工检查前先挡掉明显失败。
// scripts/check-release-notes.js
import fs from "node:fs"
const file = process.argv[2]
const text = fs.readFileSync(file, "utf8")
const required = ["### Highlights", "### Fixes", "### Docs", "### Open questions"]
const missing = required.filter((heading) => !text.includes(heading))
const forbidden = ["JIRA-", "internal refactor", "billing worker"]
const leaked = forbidden.filter((term) => text.toLowerCase().includes(term.toLowerCase()))
console.log(JSON.stringify({
ok: missing.length === 0 && leaked.length === 0,
missing,
leaked
}, null, 2))
process.exit(missing.length === 0 && leaked.length === 0 ? 0 : 1)简单评分表
用小表格让不同的人对同一个 Skill 的评估保持一致。
| 区域 | 通过条件 | 常见修法 |
|---|---|---|
| 激活 | 能在发布说明请求上触发。 | 用更贴近用户动词的描述重写。 |
| 不激活 | 不会在无关总结上触发。 | 加上“不适用”边界。 |
| 流程 | 遵守分组和排除规则。 | 把工作步骤写得更具体。 |
| 输出 | 包含必需标题且没有内部术语。 | 补模板或校验脚本。 |
从失败中迭代
当运行失败时,检查问题来自发现、指令、参考资料、脚本还是输出预期。然后只做最小但有用的修改,再用同一批评估集重跑。
有效循环 先评估,再看失败,更新
SKILL.md,重新跑训练集,最后确认验证集仍然正常。