Mindket

怎样测试 Claude 技能:触发检查、评测和不带技能的对照组

黑色横幅,标题是“Agent Skills 技能课”,下面一行写着“写好、测好、装好会按时触发的 SKILL.md 技能”。

测试技能有两种方式。触发检查问的是:智能体会不会在该用的提示上加载技能。评测问的是:带上技能之后,输出是不是比不带更好。两种都需要贴近真实的提示和全新的会话,Anthropic 的 skill-creator 插件能把这个循环的大部分自动化。

本节内容

  • 触发检查问技能会不会加载,评测问结果是不是因此更好,两者要用不同的测试。
  • 一套触发测试大约 20 条提示,一半该加载技能,一半是不该加载的近似提示,每条跑三遍。
  • 评测把每条贴近真实的提示各跑一遍:带技能和不带技能,每次都用全新的会话。
  • 带不带技能都能通过的断言,测的是模型,不是技能,把它删掉。
全部课程
本页目录
  1. 开始之前
  2. 六步做一次触发检查
  3. 写脚本跑测试,再改描述
  4. 评测:输出比不带技能更好吗?
  5. 让 skill-creator 来跑这个循环
  6. Boris Cherny 谈独立的上下文窗口,外加一段 skill-creator 演示
  7. 常见错误
  8. 自己试一试
  9. 下一课
  10. 自测一下
  11. 常见问题
  12. 资料来源

开始之前

你需要 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 }
]
  1. 先确认技能能被解析。运行 claude plugin validate ~/.claude/skills,再问 Claude Code:What skills are available?,看技能在不在列表里。
  2. 把大约 20 条提示按上面的格式写进 eval_queries.json:8 到 10 条该触发技能,8 到 10 条不该。措辞、详细程度、以及提示对技能所属领域的点名程度,都要有变化。
  3. 让提示读起来像真实的提示。指南建议加上文件路径、个人背景、具体的列名或公司名、随意的口语,偶尔再来一个错别字。
  4. 开始改之前先分组:大约 60% 用来训练,40% 留作验证,两组里都要有正例和反例。随机打乱一次,之后分组固定不变。
  5. 每条提示跑三遍,每遍都用全新的会话,记下技能有没有加载。指南认为三遍是个合理的起点,因为同一条提示这次能触发,下次也可能没触发。
  6. 打分。该触发的提示,触发率高于 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 '.'
Agent Skills 指南里的调优循环
  1. 评估

    在训练集和验证集上,分别给当前描述打分。

  2. 找失败项

    只看训练集里的失败,修改时不要参考验证集的结果。

  3. 修改

    放宽或收窄描述,让它覆盖一般情形,而不是失败提示的原话。

  4. 重复

    一直重复,直到训练集全部通过,或者不再有进步。

  5. 选出最好的

    选验证集通过率最高的那一轮,它不一定是最后一轮。

评测:输出比不带技能更好吗?

看到技能被触发,只说明 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 查看器,你在里面读每份输出,并为下一轮留下反馈。
技能测试工具的时间线
  1. skill-creator 学会评测

    Anthropic 给这个插件加上评测、基准测试和描述调优。

    来源:Claude blog: Improving skill-creator (2026年11月5日 查阅)

  2. 单独的技能文件夹也能校验

    Claude Code 2.1.233 让 claude plugin validate 检查 .claude/skills,列出头信息解析失败的 SKILL.md。

    来源:Claude Code changelog (2026年11月5日 查阅)

  3. claude plugin eval 上线

    Claude Code 2.1.269 能运行插件的评测集,把打分结果写成 JSON 和 HTML 报告。

    来源:Claude Code changelog (2026年11月5日 查阅)

  4. 被拒的运行让整套评测失败

    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 月写的测试和改进技能的指南。先手动做完一轮触发检查和评测再看,你就能分清这个插件替你接手了循环里的哪几步。

想让结果更好,一个办法是使用相互独立的上下文窗口。

Boris Cherny, Claude Code 的作者,Anthropic,引文为译文 · X (2026年11月5日 查阅)
Boris Cherny(@bcherny)2026 年 3 月 9 日在 X 上的帖子:大致来说,往一个编程问题上投入的 token 越多,结果越好,我们把这叫作测试时计算。想让结果更好,一个办法是使用相互独立的上下文窗口。
Boris Cherny 在 X 上,2026 年 3 月 9 日
Chase AI 的 YouTube 视频,配合它那篇用 skill-creator 测试和改进技能的指南。

X 官方嵌入卡片的截图,拍摄于 2026 年 11 月 5 日,时间为 UTC。X 用“Show more”截断了帖子后面的内容。点击截图可到 X 上打开原帖。

常见错误

  • 在写技能的那个会话里测试。你自己的上下文会把指令留下的缺口补上。
  • 只信一次运行。同一条提示可能这次加载技能,下次就没有。
  • 写太容易的反例。“今天天气怎么样?”和技能没有任何关键词重叠,什么也证明不了。
  • 拿手上所有的提示去调。没有留出的验证集,描述只会贴合你调过的那些提示,最好的一轮也可能是更早的一轮。
  • 只在一个模型上测。Anthropic 的指南说,打算用的每个模型都要试,因为在 Opus 上好用的写法,换到 Haiku 可能要写得更细。

自己试一试

把第 1 课的六条提示扩成一套完整的触发测试,近似提示的数量要和该加载技能的提示一样多。每条跑三遍,把触发率写在旁边。再给这个技能写两个评测用例,每个都带技能和关掉技能各跑一遍,标出哪些断言的结果变了。

留下你的发现。只在带技能时才通过的断言,让你看到技能的价值。两边都通过的断言,让你看到什么可以删掉。

  • 每条该触发的提示,是否在一半以上的运行里触发?
  • 每条近似提示,是否都低于一半?
  • 每个评测用例,是否至少有一条不带技能就失败的断言?

下一课

能测试的技能,才值得分享。第 4 课讲怎样把技能装进 Claude Code、Codex 和其他智能体:个人文件夹、项目文件夹,以及插件。

Mindket 讲 Claude Code 子智能体的那篇文章,讲的就是 skill-creator 用来让每次评测运行保持上下文干净的子智能体。触发检查的精简版,提示数量相同,在讲怎样创建 Agent Skill 那篇文章的触发测试部分。

自测一下

  1. 评测能衡量、而触发检查衡量不了的是什么?

    查看答案

    C. 带上技能之后,输出是不是比不带更好 触发检查问技能会不会加载,评测问结果是不是因此更好,两者要用不同的测试。

  2. 每条触发提示该怎么跑?

    查看答案

    A. 跑三遍,每遍都用全新的会话 同一条提示这次能触发,下次也可能没触发,而你自己的会话会补上说明里的缺口。

  3. 一条断言带不带技能都能通过,你该怎么处理它?

    查看答案

    D. 删掉或替换它 带不带技能都能通过的断言,测的是模型,不是技能。

  4. 下面哪种提示最适合做“不该触发”的反例?

    查看答案

    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 还会自动读取技能的修改,没生效的话,重启一次即可。

资料来源

  1. Agent Skills: Optimizing skill descriptions (2026年11月4日 查阅)https://agentskills.io/skill-creation/optimizing-descriptions
  2. Agent Skills: Evaluating skill output quality (2026年11月4日 查阅)https://agentskills.io/skill-creation/evaluating-skills
  3. Claude Code docs: Skills (2026年11月4日 查阅)https://code.claude.com/docs/en/skills
  4. Anthropic skills repository: skill-creator (2026年11月4日 查阅)https://github.com/anthropics/skills/blob/main/skills/skill-creator/SKILL.md
  5. Claude blog: Improving skill-creator (2026年11月4日 查阅)https://claude.com/blog/improving-skill-creator-test-measure-and-refine-agent-skills
  6. Claude Platform docs: Skill authoring best practices (2026年11月4日 查阅)https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices
  7. OpenAI: Build skills (Codex) (2026年11月4日 查阅)https://learn.chatgpt.com/docs/build-skills
  8. Claude Code changelog (2026年11月5日 查阅)https://code.claude.com/docs/en/changelog
  9. Boris Cherny on X: separate context windows, 9 March 2026 (2026年11月5日 查阅)https://x.com/bcherny/status/2031151689219321886
  10. Chase AI on YouTube: Claude Code Skills Just Got a MASSIVE Upgrade (2026年11月5日 查阅)https://www.youtube.com/watch?v=UxfeF4bSBYI

分享本节课

拿别人写的技能来测

Mindket 上的套件里有技能文件夹,你可以拿自己的提示去试。

浏览套件

本节课的 Markdown 版本 · Agent Skills 课程:写好、测好、装好 SKILL.md 技能 · 全部课程