1. 技能为什么会悄悄过期:一个真实场景
你三个月前写了一个 Claude Skill,专门教模型怎么生成落地页文案。当时模型确实不擅长这件事,你写了详细的步骤、语气要求、结构模板,效果立竿见影。然后 Anthropic 发布了新模型,新模型自己就能把落地页写得很好,甚至比你那个技能指导下的表现还强。但你的技能还在那儿,每次调用都固执地告诉 Claude「按我说的步骤来」,结果反而拖累了输出质量。
这种情况最麻烦的地方在于:技能不会报错,不会崩溃,它只是安静地让你的结果变差。你如果不做对比测试,根本发现不了。这就是 AI 时代的「技术债务」——技能也会过期,而且你往往后知后觉。
Claude Skills 2.0 引入的 Comparator Agents 和 Skill Creator 的 benchmark 模式,就是来解决这个问题的。它让你能像做产品 A/B 测试一样,用数据判断一个技能到底还在不在起作用。这篇文章会给你一套可复制的技能基准配置骨架,以及完整的 A/B 测试验证动作,让你在本地就能复现技能对比流程,判断技能是否已经失效。
适合谁看:已经在用 Claude Skills 做工作流的人、维护多个技能库的团队、以及任何想知道「我的技能是不是在帮倒忙」的开发者。核心检索词就三个:Claude Skills、技能基准、A/B 测试。
2. 前置准备:TaoToken 接入与 Skill Creator 环境
2.1 为什么需要 TaoToken
Comparator Agents 的 A/B 测试需要同时跑两个版本的技能对比,这意味着 API 调用量会翻倍。如果你直接用官方 API,成本和速率限制都会成为瓶颈。TaoToken 提供了兼容 Anthropic 接口的接入方式,你可以在不改变代码结构的前提下,把请求指向 TaoToken 的端点。
官网地址:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
API 端点:https://taotoken.net/api
注意:API 地址后面不加 UTM 参数,直接使用即可。
2.2 获取 API Key
进入控制台创建密钥:
https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
在 API Keys 页面生成一个新的 key:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
拿到 key 之后,设置环境变量。我习惯用.env文件管理,避免 key 泄露到代码仓库:
# .env ANTHROPIC_BASE_URL=https://taotoken.net/api ANTHROPIC_API_KEY=sk-你的key如果你用的是 Claude Code 或者 Anthropic SDK,这两个环境变量会被自动读取。不需要改任何业务代码。
2.3 安装 Skill Creator
Skill Creator 是 Anthropic 官方提供的技能创建与测试工具。如果你还没装,用 npm 全局安装:
npm install -g @anthropic-ai/skill-creator安装完成后验证版本:
skill-creator --version确认输出包含 benchmark 模式支持。如果版本太旧,benchmark 子命令可能不存在,需要升级到最新版。
3. 可复制的技能基准配置骨架
3.1 目录结构
一个标准的技能基准测试项目长这样:
skill-benchmark/ ├── skills/ │ ├── landing-page-v1/ │ │ └── SKILL.md │ └── landing-page-v2/ │ └── SKILL.md ├── evals/ │ └── landing-page-eval.yaml ├── benchmark.config.yaml └── .envskills/下放你要对比的两个技能版本。evals/下放评测用例。benchmark.config.yaml是核心配置文件。
3.2 benchmark.config.yaml 配置骨架
# benchmark.config.yaml benchmark: name: "landing-page-skill-ab" description: "对比 landing-page 技能 v1 与 v2 以及无技能基线" variants: - name: "no-skill" skill_path: null description: "不加载任何技能,测试基础模型能力" - name: "skill-v1" skill_path: "./skills/landing-page-v1" description: "三个月前的旧技能" - name: "skill-v2" skill_path: "./skills/landing-page-v2" description: "优化后的新技能" eval: file: "./evals/landing-page-eval.yaml" runs_per_case: 3 temperature: 0.7 comparator: enabled: true model: "claude-sonnet-4-20250514" blind: true criteria: - "文案说服力" - "结构清晰度" - "语气一致性" - "CTA 有效性" output: format: "markdown" path: "./reports/landing-page-ab-report.md" include_raw: false关键参数说明:
variants里定义你要对比的版本。no-skill这一项很重要,它是基线,用来判断基础模型是否已经能独立完成这个任务。如果no-skill的得分接近甚至超过skill-v1,说明你的技能可能已经多余了。
runs_per_case: 3表示每个评测用例跑三次取平均,减少随机性带来的误判。
comparator.blind: true开启盲评,评判代理不知道哪个输出对应哪个版本,消除偏见。
3.3 评测用例文件
# evals/landing-page-eval.yaml cases: - id: "lp-001" prompt: "为一款面向开发者的 API 监控工具写落地页首屏文案,包含标题、副标题和 CTA 按钮文字" expected_traits: - "标题不超过 12 个字" - "副标题说明核心价值" - "CTA 使用动词开头" - id: "lp-002" prompt: "为一款团队协作笔记应用写落地页的价值主张部分,三个要点" expected_traits: - "每个要点一句话" - "包含具体使用场景" - "避免空洞形容词" - id: "lp-003" prompt: "为一款 AI 代码审查工具写落地页的社会证明部分,包含两条客户评价" expected_traits: - "评价包含具体数字或结果" - "语气真实不浮夸"评测用例不需要多,5 到 10 条就能看出趋势。关键是expected_traits要写清楚你关心的维度,Comparator Agents 会围绕这些维度做对比评判。
4. 运行 A/B 测试并验证结果
4.1 执行 benchmark
配置好之后,一行命令启动:
skill-creator benchmark --config ./benchmark.config.yaml如果你用的是 TaoToken 的端点,确保.env已经加载。可以用dotenv或者直接在 shell 里 export:
export $(cat .env | xargs) skill-creator benchmark --config ./benchmark.config.yaml运行过程中你会看到每个 variant 在每个 case 上的执行进度。三个 variant 乘以三个 case 乘以三次运行,一共 27 次调用。根据网络情况,大概需要几分钟。
4.2 理解 Comparator Agents 的输出
跑完之后,报告会输出到./reports/landing-page-ab-report.md。核心部分长这样:
## 对比结果 | Case | no-skill | skill-v1 | skill-v2 | 胜出 | |------|----------|----------|----------|------| | lp-001 | 7.2 | 6.8 | 8.1 | skill-v2 | | lp-002 | 7.5 | 7.0 | 7.9 | skill-v2 | | lp-003 | 6.9 | 6.5 | 7.4 | skill-v2 | ## 综合评分 - no-skill: 7.2 - skill-v1: 6.8 - skill-v2: 7.8 ## 关键发现 skill-v1 在三个用例上均低于 no-skill 基线,说明该技能可能已经过期。 基础模型在 landing page 任务上的能力已经超过旧技能的指导效果。这里最重要的信号是:skill-v1的得分低于no-skill。这意味着你的旧技能不是在帮忙,而是在拖后腿。基础模型自己就能做得更好,你的技能反而限制了它的发挥。
4.3 判断技能是否失效的决策规则
根据多轮实测,我总结了一个简单的判断规则:
| 场景 | 判断 | 动作 |
|---|---|---|
| no-skill 胜出 | 技能已过期 | 考虑退役或重写 |
| skill 险胜(差距 < 0.5) | 技能边缘化 | 保留但持续监控 |
| skill 大比分胜出(差距 > 1.0) | 技能有效 | 保持并优化 |
| skill-v2 胜出 skill-v1 | 新版本更好 | 替换旧版本 |
关注趋势比关注单次分数更重要。如果你每次模型更新后都跑一遍 benchmark,把每次的分数记录下来,就能看到技能的「健康曲线」。一条持续下降的曲线,比一次低分更能说明问题。
4.4 用模型对话快速验证单个技能
如果你不想跑完整的 benchmark,只想快速验证某个技能在当前模型下是否还有效,可以直接用模型对话做一次手动对比:
https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite
在对话界面里,先不加载技能问一次,再加载技能问一次,对比两次输出。虽然不如 Comparator Agents 严谨,但能快速给你一个直觉判断。
5. 本篇常见错排查
5.1 benchmark 报错「skill_path not found」
检查benchmark.config.yaml里的路径是相对路径还是绝对路径。Skill Creator 默认以配置文件所在目录为基准解析相对路径。如果你在项目根目录运行命令,但配置文件在子目录里,路径就会错位。统一用相对于配置文件的路径,或者直接写绝对路径。
5.2 Comparator Agents 评判结果不稳定
如果你发现每次跑出来的胜出方不一样,说明评测用例的区分度不够。expected_traits写得太模糊,评判代理就没有明确的对比维度。把 traits 写具体,比如「标题不超过 12 个字」比「标题简洁」好得多。另外,runs_per_case可以调到 5,用更多次运行取平均来降低方差。
5.3 API 调用超时或速率限制
三个 variant 同时跑,并发量是单次调用的三倍。如果你用的是免费额度或者低配 key,很容易触发速率限制。两个解决办法:一是把runs_per_case降到 1 先跑通流程,二是用 TaoToken 的 Coding Plan 获得更稳定的调用配额:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
5.4 技能加载了但没生效
检查SKILL.md的格式是否符合 Claude Skills 2.0 的规范。常见问题是 frontmatter 缺少必要字段,或者技能描述和触发条件写得太窄,导致模型没有正确加载。用skill-creator validate命令可以检查技能文件的合法性:
skill-creator validate ./skills/landing-page-v1如果输出有 warning 或 error,按提示修正。
5.5 报告里 no-skill 得分异常高
这通常说明你的评测用例太简单了,基础模型随便就能做好。这种情况下技能的价值本来就有限。你需要设计更有区分度的用例,比如加入团队特定的流程要求、特殊的语气规范、或者复杂的多步骤任务。技能的价值在于「教模型做它本来做不好的事」,如果任务本身不难,技能自然就没有存在感。
6. 把技能体检变成常规动作
技能基准测试不是跑一次就完事的事情。每次模型大版本更新后,你都应该重新跑一遍 benchmark,记录分数变化。我自己的做法是在项目里建一个reports/目录,每次跑完把报告按日期存档,这样就能看到技能的健康趋势。
如果你维护的技能比较多,建议用 Coding Plan 来支撑批量 benchmark 的调用量:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
接入文档在这里,里面有完整的 SDK 配置示例和 Comparator Agents 的进阶用法:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
如果你用 Claude Code 做日常开发,也可以把 benchmark 命令挂到 pre-commit hook 里,每次修改技能文件后自动跑一次快速验证:
https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code-anthropic&utm_campaign=rewrite
真正的问题从来不是「能不能写技能」,而是「写了之后它还在不在起作用」。会维护技能的人,比会写技能的人更有价值。