开始之前
你需要 Claude Code,第 1、2 课的 reviewing-api-changes 技能(任何技能都行),以及运行脚本用的 jq。下面用到的 validate 命令,需要 Claude Code v2.1.233 或更高版本。能不靠人工运行一条提示、又能看到用了哪些技能的智能体,方法都一样。Agent Skills 指南说,多数客户端都提供日志、工具调用记录或详细输出来做这件事。
示例提示和测试用例是为这门课写的。脚本和文件格式来自 Agent Skills 指南,命令来自 Claude Code 文档,见来源列表。
这里的每个事实都来自来源列表里的页面,阅读日期为 2026 年 11 月 4 日。本课不是实测。
六步做一次触发检查
触发检查只问一个问题:智能体会不会在该用技能的提示上打开它,在不该用的提示上放过它?Agent Skills 指南说,最有用的正例,是技能能帮上忙、但从字面上看不出联系的提示,因为这时候该由描述来决定结果。
反例比看上去更重要。拿“写一个斐波那契函数”去测一个 API 审查技能,什么也测不出来。和它用词相近的提示,比如让它新写一份规范,才测得出来。
[
{ "query": "my teammate renamed /users/{id} to /accounts/{id} in api/openapi.yaml, is that safe to merge?", "should_trigger": true },
{ "query": "can you diff v1.yaml and v2.yaml of our payments API before we release", "should_trigger": true },
{ "query": "i changed a field from string to integer in the swagger file, anything i should worry about", "should_trigger": true },
{ "query": "write an OpenAPI spec for a new /orders endpoint", "should_trigger": false },
{ "query": "convert this OpenAPI yaml file to json", "should_trigger": false },
{ "query": "explain what a breaking change is in semantic versioning", "should_trigger": false }
]
- 先确认技能能被解析。运行
claude plugin validate ~/.claude/skills,再问 Claude Code:What skills are available?,看技能在不在列表里。 - 把大约 20 条提示按上面的格式写进
eval_queries.json:8 到 10 条该触发技能,8 到 10 条不该。措辞、详细程度、以及提示对技能所属领域的点名程度,都要有变化。 - 让提示读起来像真实的提示。指南建议加上文件路径、个人背景、具体的列名或公司名、随意的口语,偶尔再来一个错别字。
- 开始改之前先分组:大约 60% 用来训练,40% 留作验证,两组里都要有正例和反例。随机打乱一次,之后分组固定不变。
- 每条提示跑三遍,每遍都用全新的会话,记下技能有没有加载。指南认为三遍是个合理的起点,因为同一条提示这次能触发,下次也可能没触发。
- 打分。该触发的提示,触发率高于 0.5 才算通过。不该触发的提示,触发率低于 0.5 才算通过。
写脚本跑测试,再改描述
这么多提示各跑三遍,就是 60 次调用,所以指南说要写成脚本。它的示例在开头设好运行次数和技能名,让 Claude Code 输出 JSON,再用 jq 找有没有 Skill 工具调用。把 SKILL_NAME 改成你的技能名。用的是别的客户端,就替换 check_triggered 里的检测部分。
有提示没通过的话,只根据训练集里的失败去改描述。该触发的提示没触发,说明描述可能写窄了。不该触发的提示触发了,说明可能写宽了,办法是写明技能不做什么。把失败提示里的词照搬进去就是过拟合,要找出它代表的那一类请求。
要留意长度,因为描述在调优过程中总会越写越长,而规范给它设了上限。几轮下来都没变化,就换一种句子结构。指南还说,五轮通常就够了,分数一直不动的话,问题可能出在提示上,而不在描述上。
#!/bin/bash
QUERIES_FILE="${1:?Usage: $0 <queries.json>}"
SKILL_NAME="my-skill"
RUNS=3
# This example uses Claude Code's JSON output to check for Skill tool calls.
# Replace this function with detection logic for your agent client.
# Should return 0 (success) if the skill was invoked, 1 otherwise.
check_triggered() {
local query="$1"
claude -p "$query" --output-format json 2>/dev/null \
| jq -e --arg skill "$SKILL_NAME" \
'any(.messages[].content[]; .type == "tool_use" and .name == "Skill" and .input.skill == $skill)' \
> /dev/null 2>&1
}
count=$(jq length "$QUERIES_FILE")
for i in $(seq 0 $((count - 1))); do
query=$(jq -r ".[$i].query" "$QUERIES_FILE")
should_trigger=$(jq -r ".[$i].should_trigger" "$QUERIES_FILE")
triggers=0
for run in $(seq 1 $RUNS); do
check_triggered "$query" && triggers=$((triggers + 1))
done
jq -n \
--arg query "$query" \
--argjson should_trigger "$should_trigger" \
--argjson triggers "$triggers" \
--argjson runs "$RUNS" \
'{query: $query, should_trigger: $should_trigger, triggers: $triggers, runs: $runs, trigger_rate: ($triggers / $runs)}'
done | jq -s '.'
评估
在训练集和验证集上,分别给当前描述打分。
找失败项
只看训练集里的失败,修改时不要参考验证集的结果。
修改
放宽或收窄描述,让它覆盖一般情形,而不是失败提示的原话。
重复
一直重复,直到训练集全部通过,或者不再有进步。
选出最好的
选验证集通过率最高的那一轮,它不一定是最后一轮。
评测:输出比不带技能更好吗?
看到技能被触发,只说明 Claude 找到了它,不说明它做了你想要的事。Claude Code 的文档说,这两件事要分开测。输出质量的检验是基线对比:每条提示在全新的会话里带技能跑一遍,关掉技能再跑一遍,然后比较。每次运行都要从干净的上下文开始,这样智能体只会照技能里写的去做,而不是照你写技能时记得的东西去做。
个人技能或项目技能,第二遍要关掉的话,在 skillOverrides 里把它设成 "off"。这个设置对插件里的技能无效,插件技能要用 claude plugin eval,它会在不加载插件的情况下重复每次运行。改进已有技能时,评测指南用旧版本做基线:先把它复制到一个快照文件夹,让基线那一遍指向那里。
先在 evals/evals.json 里写两三个测试用例。每个用例有一条贴近真实的提示、一段用大白话写的成功标准,还有需要的输入文件。断言等第一轮跑完再写,那时你才看得出好的输出是什么样。“输出文件是合法的 JSON”可以检查,“输出很好”没法检查,必须出现某个固定短语的断言,又会让措辞不同的正确答案也被判错。语气和设计,用眼睛判断。
{
"skill_name": "reviewing-api-changes",
"evals": [
{
"id": 1,
"prompt": "I renamed the status field to state in api/openapi.yaml and made customer_id required on POST /orders. Is this safe to ship?",
"expected_output": "A review that flags both changes as breaking for existing clients and suggests a safer rollout.",
"files": ["evals/files/openapi-before.yaml", "evals/files/openapi-after.yaml"],
"assertions": [
"The review names the renamed status field as a breaking change",
"The review flags the new required customer_id field",
"The review lists each change with a suggested fix"
]
}
]
}
| 结果 | 它说明什么 | 该怎么做 |
|---|---|---|
| 带不带技能都通过 | 模型自己就能做到 | 删掉或换掉这条断言 |
| 两边都不通过 | 断言本身有问题、用例太难,或者查的东西不对 | 在下一轮之前修好它 |
| 带技能通过,不带技能不通过 | 技能在这里创造了价值 | 找出是哪条指令或哪个脚本起了作用 |
| 只在部分运行里通过 | 用例不稳定,或者指令有两种读法 | 补一个例子,或写得更具体 |
让 skill-creator 来跑这个循环
手动的版本跑通之后,Anthropic 的 skill-creator 插件能在 Claude Code 里把对比自动化。在终端里,用下面第一行从官方插件市场安装,然后用自己的话请它做评测。Claude Code 提示找不到这个市场的话,运行 /plugin marketplace add anthropics/claude-plugins-official 再重试。
它自己的描述调优循环用的就是指南里的数字:按 60 和 40 分组,每条提示跑三遍,最多迭代五轮,按留出的验证集得分选描述。Anthropic 的发布文章说,在它的文档创建类技能上跑描述调优,6 个公开技能里有 5 个触发得更准。文章还附了一条值得记住的提醒:不带技能,基础模型也能通过你的评测的话,技能教的东西可能已经进了模型,这个技能也许不再需要。
Anthropic 为此提供了两个工具,它们的文件格式不能互换。skill-creator 插件在对话里迭代单个技能。针对随插件发布的技能,claude plugin eval 用评分器给每次运行打分,低于阈值就以非零状态退出,所以 CI 任务可以据此判定失败。
/plugin install skill-creator@claude-plugins-official
evaluate my reviewing-api-changes skill with skill-creator- 测试用例存在
evals/evals.json里,每个用例一个子智能体,保证每次运行都从干净状态开始。 - 每条断言的评分写进
grading.json,每个通过或失败都附带证据。 - 带技能和不带技能的通过率、耗时和 token 数,汇总进
benchmark.json。 - 两个版本的技能之间的盲评 A/B 对比,在保留一次修改之前,先确认它有帮助。
- 描述调优,外加一个 HTML 查看器,你在里面读每份输出,并为下一轮留下反馈。
skill-creator 学会评测
Anthropic 给这个插件加上评测、基准测试和描述调优。
来源:Claude blog: Improving skill-creator (2026年11月5日 查阅)
单独的技能文件夹也能校验
Claude Code 2.1.233 让
claude plugin validate检查.claude/skills,列出头信息解析失败的 SKILL.md。来源:Claude Code changelog (2026年11月5日 查阅)
claude plugin eval 上线
Claude Code 2.1.269 能运行插件的评测集,把打分结果写成 JSON 和 HTML 报告。
来源:Claude Code changelog (2026年11月5日 查阅)
被拒的运行让整套评测失败
Claude Code 2.1.299 把因 API 错误中断的运行记为 0 分,整套评测以 1 退出。
来源:Claude Code changelog (2026年11月5日 查阅)
Boris Cherny 谈独立的上下文窗口,外加一段 skill-creator 演示
Claude Code 的作者、Anthropic 的 Boris Cherny,2026 年 3 月在 X 上解释了为什么第二个上下文窗口能发现第一个漏掉的问题。一个智能体写出的 bug,另一个用同一模型的智能体可能找得出来,就像同事审你的代码,能看出你自己看不到的地方。这正是本课每个评测用例都在新会话里跑的原因,也是 skill-creator 给每个用例单独一个子智能体的原因。
Chase Hannegan 的 Chase AI 频道发了一段讲 skill-creator 这次更新的视频,配合他 2026 年 3 月写的测试和改进技能的指南。先手动做完一轮触发检查和评测再看,你就能分清这个插件替你接手了循环里的哪几步。
想让结果更好,一个办法是使用相互独立的上下文窗口。

X 官方嵌入卡片的截图,拍摄于 2026 年 11 月 5 日,时间为 UTC。X 用“Show more”截断了帖子后面的内容。点击截图可到 X 上打开原帖。
常见错误
- 在写技能的那个会话里测试。你自己的上下文会把指令留下的缺口补上。
- 只信一次运行。同一条提示可能这次加载技能,下次就没有。
- 写太容易的反例。“今天天气怎么样?”和技能没有任何关键词重叠,什么也证明不了。
- 拿手上所有的提示去调。没有留出的验证集,描述只会贴合你调过的那些提示,最好的一轮也可能是更早的一轮。
- 只在一个模型上测。Anthropic 的指南说,打算用的每个模型都要试,因为在 Opus 上好用的写法,换到 Haiku 可能要写得更细。
自己试一试
把第 1 课的六条提示扩成一套完整的触发测试,近似提示的数量要和该加载技能的提示一样多。每条跑三遍,把触发率写在旁边。再给这个技能写两个评测用例,每个都带技能和关掉技能各跑一遍,标出哪些断言的结果变了。
留下你的发现。只在带技能时才通过的断言,让你看到技能的价值。两边都通过的断言,让你看到什么可以删掉。
- 每条该触发的提示,是否在一半以上的运行里触发?
- 每条近似提示,是否都低于一半?
- 每个评测用例,是否至少有一条不带技能就失败的断言?
下一课
能测试的技能,才值得分享。第 4 课讲怎样把技能装进 Claude Code、Codex 和其他智能体:个人文件夹、项目文件夹,以及插件。
Mindket 讲 Claude Code 子智能体的那篇文章,讲的就是 skill-creator 用来让每次评测运行保持上下文干净的子智能体。触发检查的精简版,提示数量相同,在讲怎样创建 Agent Skill 那篇文章的触发测试部分。
自测一下
评测能衡量、而触发检查衡量不了的是什么?
查看答案
C. 带上技能之后,输出是不是比不带更好 触发检查问技能会不会加载,评测问结果是不是因此更好,两者要用不同的测试。
每条触发提示该怎么跑?
查看答案
A. 跑三遍,每遍都用全新的会话 同一条提示这次能触发,下次也可能没触发,而你自己的会话会补上说明里的缺口。
一条断言带不带技能都能通过,你该怎么处理它?
查看答案
D. 删掉或替换它 带不带技能都能通过的断言,测的是模型,不是技能。
下面哪种提示最适合做“不该触发”的反例?
查看答案
B. 和技能用词相近的近似提示,比如让它新写一份规范 毫不相关的反例什么也证明不了,和技能用词相近的提示,才测得出描述写得准不准。
常见问题
触发检查的提示和评测用例可以是同一批吗?
不可以。触发检查的提示只需要一个 should_trigger 标签,通过与否看技能有没有被加载。评测用例带着预期输出和输入文件,衡量的是技能加载之后做了什么。两份指南都把它们放在不同的文件里。
Claude Code 能告诉我技能被用了多少次吗?
能。运行 /skill-doctor(v2.1.252 或更高版本),可以看到每个技能的开销和使用频率,它还会标出列表里从未被调用过的技能。随插件发布的技能,可以写一个带 tool_used: Skill 评分器的评测用例,测量多条提示上的触发率。
什么算基线运行?
新技能就是同一条提示不带技能,改进已有技能时,则是带上旧版本的快照。评测指南的做法是,编辑之前先把旧版本复制到一个快照文件夹,这一遍的结果保存在 old_skill/outputs/ 下,代替 without_skill/。
不带我的技能,输出也一样好,怎么办?
保留之前先比较成本。指南里的基准测试,会把技能花掉的时间和 token,与它提高的通过率放在一起比,并说明 token 用量翻倍却只提高 2 个百分点,可能不值得。Anthropic 补充说,不带技能也能通过,可能意味着模型已经吸收了技能原先教的东西。
触发检查怎样跑得便宜一点?
客户端支持的话,结果一明朗就可以提前停掉这次运行:智能体要么查阅了技能,要么没有查阅就开始干活了。指南说,这能大幅减少整套测试的时间和成本,按起步的数字算,整套测试要调用几十次。
在 Codex 或别的智能体里怎么测试技能?
方法一样,每个客户端展示技能使用情况的方式不同。OpenAI 的 Codex 指南说,要用提示对照描述来确认触发行为,还提供 /skills 或 $ 来显式调用技能。Codex 还会自动读取技能的修改,没生效的话,重启一次即可。
资料来源
- Agent Skills: Optimizing skill descriptions https://agentskills.io/skill-creation/optimizing-descriptions
- Agent Skills: Evaluating skill output quality https://agentskills.io/skill-creation/evaluating-skills
- Claude Code docs: Skills https://code.claude.com/docs/en/skills
- Anthropic skills repository: skill-creator https://github.com/anthropics/skills/blob/main/skills/skill-creator/SKILL.md
- Claude blog: Improving skill-creator https://claude.com/blog/improving-skill-creator-test-measure-and-refine-agent-skills
- Claude Platform docs: Skill authoring best practices https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices
- OpenAI: Build skills (Codex) https://learn.chatgpt.com/docs/build-skills
- Claude Code changelog https://code.claude.com/docs/en/changelog
- Boris Cherny on X: separate context windows, 9 March 2026 https://x.com/bcherny/status/2031151689219321886
- Chase AI on YouTube: Claude Code Skills Just Got a MASSIVE Upgrade https://www.youtube.com/watch?v=UxfeF4bSBYI

