Skill 测试入门:从使用场景出发,搞清楚怎么验证你的 AI 技能

最近在项目里密集使用 Skill,踩了几个坑,让我开始认真思考「怎么测试 Skill」这件事。

一个是 Code Review Skill。我让它审查一个涉及业务规则变更的 PR,它把代码风格问题列了一堆,但真正影响业务逻辑的改动反而没提。换个 PR,它又把正常的防御性编程当 Bug 报了出来。

另一个是文档一致性检测 Skill。我用 Claude Code 跑的时候效果还行,换了个模型再跑,输出格式和检测粒度都偏了,像是完全不同的 Skill。

还有一个更头疼的。项目里的业务 Agent 会自动调用流程化 Skill 处理用户请求,有一次中间步骤的脚本报错了,Agent 直接把堆栈信息原封不动吐给了用户,没有重试也没有降级。

这三个场景让我意识到一件事:这些虽然都叫 Skill,但它们干的活完全不同。Code Review 测的是「代码理解准不准」,流程 Skill 测的是「编排稳不稳」。用同一套思路去测试,肯定不行。

于是我开始系统地研究 Skill 测试这件事。下面是我整理出来的东西,从类型分类到文件夹结构,再到测试策略和开源工具,一步步讲清楚。

Skill 有哪些类型

① 从「谁在调用它」出发来分类

一开始我也按安装位置来分 Skill——内置的、用户装的、项目级的。后来发现这么分对测试没什么指导意义。

真正决定测试策略的,是「谁在调用它」和「它在干什么」。从这个角度,Skill 大体可以分成两类:开发期编码辅助 Skill业务期 Agent 流程工具 Skill

开发期的 Skill 是你主动调用的。你在写代码的时候让 Claude Code 帮你做 Code Review,或者让它检测文档和代码是不是一致,这些是你在开发过程中有意识地使用的工具。

业务期的 Skill 是 Agent 自动调用的。用户在使用你的产品时,Agent 根据业务逻辑自动触发某个 Skill,走一套固定流程,调用外部 API 或脚本,最后把结果返回给用户。

这两类 Skill 的测试重心完全不同:前者测「代码质量和语义理解」,后者测「流程稳定性和工具编排」。

② 开发期三种常见 Skill

开发期的编码辅助 Skill,我在项目里主要用三种:

Code Review Skill:审查代码变更,发现潜在 Bug、规范问题、安全风险。核心能力是理解代码语义,不只是做语法检查。

文档一致性检测 Skill:检查代码变更后,相关的接口文档、README、设计文档是不是同步更新了。核心能力是同时理解代码和文档的语义,判断它们是否对齐。

清理冗余 Skill:找出项目里的死代码、重复逻辑、未使用的依赖,然后清理掉。核心能力是在不破坏功能的前提下识别「可以删」的代码。

③ 业务期两种常见 Skill

业务期的 Skill 跟着 Agent 走,用户触发、Agent 调用、自动执行:

流程化 Skill:多步骤编排,比如「接收需求 → 生成 Spec → 拆分 Task → 执行开发 → 跑测试 → Code Review → 归档」。每个步骤可能调用不同的子 Agent 或工具。

工具调用 Skill:调用外部 API、数据库、Shell 脚本等。比如「查用户订单状态」「调用支付接口」「执行数据库迁移脚本」。

④ 一张表看清区别
类型调用方式核心能力测试重心
Code Review你主动调用代码语义理解漏报率、误报率
文档一致性你主动调用代码+文档语义对齐变更同步检测、语义对齐
清理冗余你主动调用死代码识别安全性、功能等价性
流程化Agent 自动调用多步骤编排状态机流转、异常处理
工具调用Agent 自动调用外部系统交互权限控制、幂等性

主动调用

自动调用

业务期 Agent 流程工具 Skill

流程化 Skill

工具调用 Skill

开发期编码辅助 Skill

Code Review

文档一致性检测

清理冗余

Agent

这个分类不是学术上的严格划分,而是在实际项目中摸出来的。你可能还会遇到其他类型,但大部分 Skill 都能归到这两类五种里。

一个 Skill 文件夹里都有什么

① 目录结构长什么样

从 skill-creator 的官方定义看,每个 Skill 就是一个目录,核心是 SKILL.md,其他都是可选的:

skill-name/
├── SKILL.md              # 必需,核心文件
├── agents/
│   └── openai.yaml       # 可选,UI 展示元数据
├── scripts/              # 可选,可执行脚本
│   └── validate.py
├── references/           # 可选,按需加载的参考文档
│   └── style-guide.md
└── assets/               # 可选,模板、图标等资源
    └── template.md
② SKILL.md 是关键

SKILL.md 分两部分:YAML frontmatter 和 Markdown body。

Frontmatter 里只有两个字段是必须的:namedescription。这两个字段是 Skill 的触发机制——Agent 靠它们来决定要不要加载这个 Skill。

Body 是具体的指令和指南,告诉 Agent 拿到这个 Skill 后怎么干活。但 body 只在 Skill 被触发后才会加载,不是一开始就塞进上下文的。

这个设计叫渐进式披露。Agent 先看 description 决定要不要用,用了才读 body。这样能省不少上下文空间。

③ Sub-agent 怎么调用 Skill

这里有个细节值得讲。Sub-agent 调用 Skill 的过程分三步:

  1. 系统提示词里注入了一份 Skill 索引,包含所有启用 Skill 的名称和描述,最多 20 个,总大小不超过 4KB
  2. LLM 判断当前任务和某个 Skill 的描述匹配,调用内置的 load_skill 工具
  3. Skill 完整内容写入上下文缓冲区,下一轮 LLM 请求时自动注入到用户消息前面

有个关键设计:每个 Sub-agent 有独立的 Skill 缓冲区,用 LRU 策略最多缓存 3 个 Skill。因为 Skill 内容注入后会从缓冲区清空(drain 操作),如果多个 Sub-agent 共享同一个缓冲区,一个 Worker 的 drain 会把另一个 Worker 还没读到的内容清掉。

④ Skill 怎么匹配

用户输入一段话,系统怎么知道该加载哪个 Skill?打分制

每个 Skill 的得分由四个维度加权计算:

  • 精确名称匹配:直接加 10000 分,确保用户点名的 Skill 一定排第一
  • 名称词项命中:权重 ×12
  • 标签词项:权重 ×6
  • 描述词项:权重 ×2

中文分词不走传统分词器,而是取单个汉字加上 2 字和 3 字的滑动窗口。比如「代码审查」会生成「代」「码」「审」「查」「代码」「码审」「审查」「代码审」「码审查」这些特征。这样能覆盖大部分中文短语。

⑤ 三层覆盖体系

Skill 有三层,按优先级从低到高:

项目级  .paicli/skills/    最高优先级,同名覆盖
用户级  ~/.paicli/skills/  中等优先级,同名覆盖
内置    程序打包           最低优先级

同名 Skill,优先级高的整体覆盖低的。为什么这么分?内置 Skill 提供开箱即用的基础能力,用户级满足个人工作流定制,项目级承载团队约定。离项目越近,优先级越高。

Claude Code 的设计也是一脉相承:内置 Skill、用户 Skill、项目 Skill 三层。

为什么不能纯手工测试

① 大模型的非确定性

传统软件测试是确定性的。给一个输入,得到一个固定的输出,跑一万次都一样。但大模型不一样,同样的 Prompt,温度参数、上下文长度、甚至服务端负载不同,都可能导致输出不同。

这意味着你不能用「跑通了没」这种二元判断来测试 Skill。得用概率思维:跑通了多少次

② 玄学调试的陷阱

很多开发者(包括我)写 Skill 的时候容易陷入一种状态:改一句 Prompt,试十次看效果。这次跑通了就觉得 OK,下次跑挂了再改一句。这就是「玄学调试」。

玄学调试的问题在于:你看到的一两次成功可能是偶然,一两次失败也可能是偶然。没有足够的样本量,你分不清「这个 Skill 真的好用」还是「这次碰巧跑对了」。

③ 需要工具和方法论

正确的做法是:

  • 先写测试,再写 Skill:定义功能时就同步写下 10-20 个核心测试用例
  • 引入 A/B 测试:每次修改 description 或指令,跑一遍 Benchmark,看哪一版胜率更高
  • 建立数据飞轮:线上真实流量采样 → 标注 → 加入数据集 → 评测 → 优化 → 上线,形成闭环

说白了,得有工具帮忙。纯靠人工点,效率太低,结论也不可靠。

开发期编码辅助 Skill 怎么测

这类 Skill 的核心是「理解代码语义」,测试重点在于准确率、误报率和安全性。

① Code Review Skill

测试点:漏报率(真实 Bug 没发现)、误报率(正常代码当 Bug 报)、规范符合度(是否遵循团队编码规范)。

关键步骤

  1. 构造黄金数据集:准备 20-30 个 PR 片段,包含真实漏洞(空指针、SQL 注入、并发问题)和正常代码,作为「标准答案」。
  2. 差异比对测试:把 Skill 的输出和资深开发者的真实 Review 意见比对,计算召回率(Recall,该发现的 Bug 发现了多少)和精确率(Precision,报出来的问题有多少是真的)。
  3. 上下文感知测试:传入跨文件的调用链,测试它能不能发现跨模块的逻辑缺陷,而不是只盯着单文件看。

推荐工具:Diff 工具比对输出;结合 SonarQube 等静态分析工具的结果做交叉验证。如果 Skill 的 Review 结果和 SonarQube 的报告高度一致,说明它的基础能力没问题;如果 Skill 能发现 SonarQube 漏掉的问题,那才是真正的价值。

② 文档一致性检测 Skill

测试点:变更同步检测能力(代码改了文档没改,能不能发现)、语义对齐能力(文档描述和实际逻辑是不是一致)。

关键步骤

  1. 变更注入测试:手动改代码逻辑(比如改 API 参数、字段名),但保持文档不变,验证 Skill 能不能精准定位不一致的地方。
  2. 反向验证测试:改文档描述,保持代码不变,验证 Skill 能不能识别出文档和代码的语义冲突。
  3. 多文档关联测试:测试 Swagger/YAPI 接口文档、README、内部设计文档与代码的多维一致性。很多 Skill 只能检测一对关系(代码 vs README),碰到多文档场景就歇菜了。

推荐工具:写脚本自动对比 Git diff 中的代码变更与文档变更;用 LLM-as-Judge 做语义相似度打分——让一个更强的模型来判断「这段文档描述的是不是这段代码的功能」。

③ 清理冗余 Skill

测试点:安全性(有没有误删核心逻辑)、代码瘦身效果、功能等价性(清理前后代码行为是不是一致)。

关键步骤

  1. 沙箱执行测试:在 Docker 隔离环境里运行清理后的代码,确保单元测试 100% 通过,功能没受损。这是最基础的保底测试。
  2. 死代码边界测试:构造包含条件编译、动态反射、插件化加载的代码,测试 Skill 会不会误删「看似冗余实则必要」的代码。比如 Java 里通过反射调用的方法,静态分析看是「没用到」,但删了就炸。
  3. 幂等性测试:对同一份代码连续运行多次清理 Skill,确保结果稳定,不会越删越少。跑第一次删了 10 个文件,跑第二次又删了 3 个,这就说明 Skill 的判断不够确定。

推荐工具:JUnit/pytest 做回归验证;JaCoCo/Istanbul 等代码覆盖率工具验证清理后覆盖率没下降——如果覆盖率反而上升了,说明删掉的确实是没用的代码。

业务期 Agent 流程工具 Skill 怎么测

这类 Skill 的核心是「状态机流转」和「外部交互」,测试重点在于流程稳定性、异常处理和防死循环。

① 流程化 Skill(多步骤编排)

测试点:状态机流转正确性、中间产物完整性、死循环检测。

关键步骤

  1. 状态机断点测试:在流程的每个阶段(比如 plan → dev → test → review)插入断点,验证上游输出是不是完整传递给了下游。很多 Bug 不是单步骤的问题,而是步骤之间上下文截断导致的。
  2. 异常中断与恢复测试:模拟某一步骤失败(API 超时、脚本报错),验证 Skill 有没有重试机制或优雅降级。直接崩溃把堆栈吐给用户是最差的体验。
  3. 人工介入模拟:在流程中间强制打断,模拟用户修改中间产物,验证下游能不能正确感知变更并继续执行。比如用户在 plan 阶段手动改了需求,dev 阶段的 Agent 应该能感知到变化,而不是按旧 plan 继续跑。

推荐工具:LangSmith 或 LangFuse 做全链路追踪。这两个工具能记录每个 Skill 调用的输入、输出、Token 消耗、延迟和工具调用链,排查多 Agent 协作时的「断链」问题特别好用。

② 工具调用 Skill(调用外部 API/脚本)

测试点:权限控制(有没有越权)、异常处理(API 挂了怎么办)、数据脱敏(有没有泄露敏感信息)、脚本执行的幂等性。

关键步骤

  1. Mock 依赖测试:用 Mock 服务器模拟外部 API 的各种返回——正常返回、超时、500 错误、非法数据格式,验证 Skill 的容错能力。不能假设外部依赖永远正常。
  2. 权限边界测试:构造越权请求(比如未授权访问数据库、删除非当前目录文件),验证 Skill 有没有拦截机制。这个在生产环境里是安全底线。
  3. 敏感数据扫描:检查 Skill 的输入输出日志,确保没有硬编码的 API Key、密码、用户隐私数据。有些 Skill 开发时图方便把密钥写死在脚本里,上线后就是安全事故。

推荐工具:WireMock 或 MockServer 做 API 模拟;Semgrep 做敏感信息静态扫描。Semgrep 能在代码提交前就扫出硬编码的密钥和敏感信息。

开源测试工具全景

① 工具一览

测试 Skill 不能从零造轮子,得借助成熟的工具。下面是我在调研过程中整理的主流工具:

工具定位适用场景链接
anthropic skill-creatorSkill 创建+验证+改进写 Skill 时同步测试https://github.com/openai/skills
PromptfooPrompt/Skill 评测框架批量跑用例、A/B 测试https://github.com/promptfoo/promptfoo
SkillgradeAI Skill 单元测试框架Docker 环境自动评测开源项目
LangSmithAgent 全链路追踪生产级监控和调试https://smith.langchain.com
LangFuse开源 Agent 可观测性本地调试、可视化分析https://langfuse.com
Playwright + MCP前端/UI 自动化测试涉及 Web 交互的 Skillhttps://playwright.dev
Agent Evaluation开源 Agent 测试框架LLM 当考官自动打分开源项目
WireMock/MockServerAPI Mock模拟外部依赖https://wiremock.org
Semgrep静态代码扫描敏感信息检测https://semgrep.dev
SonarQube静态分析平台代码质量交叉验证https://www.sonarqube.org

工具和 Skill 类型的对应关系:

通用工具

创建加验证

A/B 测试

自动评测

skill-creator

所有 Skill

Promptfoo

Skillgrade

业务期测试

全链路追踪

Mock + 扫描

LangSmith / LangFuse

流程化 Skill

WireMock + Semgrep

工具调用 Skill

开发期测试

交叉验证

语义打分

回归验证

SonarQube

Code Review Skill

Git diff + LLM-as-Judge

文档一致性 Skill

pytest + JaCoCo

清理冗余 Skill

② 重点工具展开

anthropic skill-creator(https://github.com/openai/skills)

这个工具不只是创建 Skill,还内置了验证和测试机制。三个核心模式:

  • Eval 模式:验证 Skill 的触发是否准确,检查 description 会不会在不该触发的时候误触发
  • Benchmark 模式:A/B 测试不同版本的 description,看哪个版本的胜率更高
  • Improve 模式:根据失败案例自动改进 Skill 的指令

它还内置了 forward-testing 机制:启动 Subagent 作为「不知情的测试员」,给它一个任务让它用 Skill 来完成,然后检查输出质量。关键设计是 Subagent 不知道在测试 Skill,只当是普通任务,这样测出来的结果更真实。

验证脚本 scripts/quick_validate.py 可以检查 YAML frontmatter 格式、必填字段和命名规则。

Promptfoo

适合做批量评测和 A/B 测试。你可以定义一组测试用例(输入 + 期望输出),然后跑不同版本的 Skill,自动生成胜率对比报告。对于优化 description 和指令特别有用。

LangSmith / LangFuse

这两个工具功能类似,都是做 Agent 全链路追踪的。区别是 LangSmith 是商业产品,LangFuse 是开源的。核心能力:

  • 记录每个 Skill 调用的完整链路(输入 → 推理 → 工具调用 → 输出)
  • 统计 Token 消耗和延迟
  • 排查多 Agent 协作时的信息丢失和断链

对于流程化 Skill 的调试,这两个工具几乎是必备的。

Playwright + MCP

如果你的 Skill 涉及前端页面验证或 Web 交互,可以让 Claude Code 通过 MCP 集成 Playwright,自动启动浏览器、模拟点击、截图对比、捕获 JS 错误。测试 Webapp Testing Skill 或 UI 自动化验收特别好用。

5 个核心测试维度

不管是哪种类型的 Skill,开发者视角的测试都可以从 5 个维度来衡量。这不是我拍脑袋想的,是实际项目中反复验证出来的:

① 触发精准度(目标 ≥90%)

准备 20-30 条测试查询,包含应触发场景(「帮我做代码审查」)和不应触发场景(「这段代码什么意思」)。如果 Skill 在不该触发的时候强行介入,用户体验会很差。

② 任务完成率(目标 ≥85%)

设计 5-10 个典型任务场景,每个场景定义清晰的「完成标准」(比如文档包含所有必需章节、代码无报错)。记录独立完成、需人工干预或完全失败的比例。

③ 上下文效率

观察从初始版本到可用版本需要多少轮迭代。3-5 轮迭代后质量趋于稳定是健康信号;如果 10 轮以上还不稳定,说明 Skill 设计过于复杂,需要拆分或重新设计。

④ 用户满意度(目标 ≥80%)

通过评测界面收集反馈,或者记录用户手动修改输出结果的比例。如果用户每次都得大改,说明 Skill 的实际价值有限。

⑤ 时间效率(目标 ≥2x)

对比使用 Skill 和人工完成相同任务的时间。如果 Skill 还没人工快,那自动化的意义就不大了。

9 大评估指标

上面 5 个维度是宏观的,落到具体执行层面,还有 9 个量化指标可以参考:

指标及格线优秀线
任务完成率(TCR)≥90%>98%
工具调用准确率(TCA)≥95%≥99%
幻觉率≤5%≤1%
P95 延迟<10s<5s
Token 效率<5000/任务<2000/任务
平均交互步数<8 步<4 步
安全通过率100%100%
回归通过率≥98%100%

安全通过率是唯一不能妥协的指标。其他指标可以逐步优化,但安全问题没有「及格线」,只有「全过」和「全不过」。

用户视角和软件测试视角

① 用户怎么验证 Skill 好不好用

如果你是普通用户,装了 Skill 但不确定有没有用,可以试三种方法:

  1. 明确调用测试:不要只靠 AI 自动触发,测试时明确告诉模型「这次只使用指定的 Skill」。这样你才能清楚看到它到底有没有生效。
  2. AB 对比测试:拿一个真实任务,一次不用 Skill,一次明确调用 Skill,对比结果稳定性、是否需要重复说明背景、后续修改成本。
  3. 输入输出验证:检查 Skill 的输入要求是不是清晰,输出结果是不是符合预期格式。靠谱的 Skill 必须能明确说出「需要你给我什么」和「最后交付什么」。
② 用 Skill 来生成测试用例

还有一种用法:不是测试 Skill 本身,而是用 Skill 来辅助软件测试。常见的实战项目:

  • 生成测试用例:上传需求文档或截图,让 Skill 自动生成包含正常、异常、边界场景的结构化测试用例,支持导出 Markdown
  • 生成测试脑图:上传 PRD 文档,让 Skill 自动解析业务逻辑,生成 XMind 测试用例脑图
  • 性能数据分析:上传性能测试原始数据(响应时间、并发数),让 Skill 提炼核心指标,生成专业分析报告
  • 需求风险分析:上传产品原型截图,让 Skill 输出核心业务目标、关键用户场景和潜在风险

分层测试金字塔

测试不是一层的,得分层来做:

         ┌─────────────┐
         │  回归测试 10% │  历史 Badcase + 黄金数据集
         ├─────────────┤
         │ 集成测试 30%  │  多 Skill 协作、Agent 编排
         ├─────────────┤
         │ 单元测试 60%  │  单个 Skill 输入输出
         └─────────────┘

单元测试层(60%):针对单个 Skill 的输入输出,用脚本和 Mock 环境跑自动化测试。这是基础,投入最多,回报也最大。

集成测试层(30%):针对多 Skill 协作和 Agent 编排,用状态机脚本跑端到端流程,验证流程连通性。流程化 Skill 和工具调用 Skill 的主要测试阵地。

回归测试层(10%):每次上线前,用历史 Badcase 和黄金数据集跑一遍,防止「修了一个 Bug,引入两个新 Bug」。

落地建议:先从单元测试层开始,把单个 Skill 的脚本在本地沙箱里跑通,确保输入输出符合预期,再往上叠加集成和回归测试。

我的收获和还没想明白的事

① 三个收获

第一个收获:开发期 Skill 测「语义理解」,业务期 Skill 测「流程稳定性」。这两类 Skill 的测试方法论完全不同,不能混着来。Code Review 的黄金数据集对流程 Skill 没用,流程 Skill 的状态机断点测试对 Code Review 也没用。

第二个收获:从真实 Case 抽数据,不要自己编测试用例。直接从线上跑过的真实任务日志里,挑出 10-20 个典型场景(包括成功的和失败的)作为「黄金数据集」。自己编的用例容易脱离实际。

第三个收获:先跑通单个 Skill 的最小闭环,再叠加 Agent 逻辑。很多人上来就测整个 Agent 流程,出问题了不知道是哪个 Skill 的锅。先把每个 Skill 单独跑通,再测它们之间的协作。

② 还没想明白的事

大模型的非确定性怎么彻底解决?概率思维能缓解,但不能根治。同一个 Skill 跑 100 次,95 次 OK 5 次挂,那 5 次在生产环境里就是事故。

Skill 之间互相干扰怎么检测?多个 Skill 共享同一个上下文窗口,一个 Skill 的输出可能影响另一个 Skill 的行为。目前没看到好的隔离测试方案。

涉及写数据库、发生产消息、调用支付接口的 Skill,怎么设计安全拦截和熔断机制?这是下一步需要重点考虑的。

写在最后

Skill 测试这件事,说复杂也复杂,说简单也简单。核心就一句话:搞清楚你的 Skill 属于哪一类,然后用对应的策略去测它。

开发期的 Skill 测语义理解,准备黄金数据集,用 Recall 和 Precision 量化。业务期的 Skill 测流程稳定性,用状态机断点和 Mock 测试覆盖异常场景。工具方面,skill-creator 帮你验证结构,Promptfoo 帮你做 A/B 测试,LangSmith/LangFuse 帮你追踪链路。

不用一步到位。从 10-20 个真实 Case 开始,先跑通最小闭环,再逐步完善。

对了,如果你的业务 Agent 涉及比较敏感的外部操作(写数据库、发生产消息、调用支付接口),一定要在关键步骤加人工确认或权限拦截,别让它全自动乱跑。这个比 Skill 本身的测试更重要。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐