Skip to content

Agent Skill 最佳实践:写给 AI 的「操作手册」该怎么写 #232

Description

@QingyaFan

Agent Skill 最佳实践:写给 AI 的「操作手册」该怎么写

Skill 是什么

Skill 最早由 Anthropic 在 Claude Skills 规范中提出,后来被 Qoder、Claude Code 等多个 AI Coding Agent 采纳,逐步成为社区通用的能力扩展模式。简单说,Skill 是你给 AI 写的一份「操作手册」。当用户的请求匹配到某个 Skill 时,Agent 会把这份手册注入到上下文中,让 AI 按照你定义的规范和流程来执行任务。

Skill 跟 Agent 不一样:Agent 是一个独立的执行体,有自己的目标和工具集;Skill 更像是「给 AI 加了一段专业记忆」,在合适的场景被自动唤起。Skill 跟 Hook 也不同:Hook 是事件驱动的自动化脚本,Skill 是知识驱动的行为引导。

为什么要自己写 Skill?通用模型不了解你团队的规范、你项目的约定、你踩过的坑。把这些写成 Skill,AI 就能按你的标准干活。

命名这件小事

这是写第一个 Skill 时最容易踩的坑。

很多人会自然地用下划线命名,比如 api_standard_check。但社区规范要求 Skill 名称必须是 kebab-case

  • 只能用小写字母、数字和连字符(-
  • 不能有下划线、空格、大写字母
  • 不能包含 claudeanthropic 这类保留词(不同 Agent 的保留词清单略有差异,但避免使用厂商名是通用做法)

更重要的一点:name 字段必须和文件夹名完全一致。如果文件夹叫 api-standard-check,那 SKILL.md 里的 name 也必须是 api-standard-check,一个字符都不能差。

# 正确
api-standard-check/
└── SKILL.md  →  name: api-standard-check

# 错误:下划线
api_standard_check/
└── SKILL.md  →  name: api_standard_check  ← 加载失败

# 错误:名称不匹配
api-check/
└── SKILL.md  →  name: api-standard-check  ← 加载失败

少数 Agent 平台支持以 zip 包形式上传 Skill(不是按目录路径加载),这种场景下文件夹名和 name 字段可以不一致。但 name 字段本身的字符规则没有差异——无论本地、社区还是云端,都是 kebab-case,不能有下划线

目录结构极简版

一个 Skill 最少只需要一个文件:

my-skill/
└── SKILL.md    ← 唯一必须的文件

需要的时候可以加:

my-skill/
├── SKILL.md           # 主文件,入口
├── examples.md        # 详细示例(避免主文件太长)
├── reference.md       # 参考规范
└── scripts/           # 可执行脚本
    └── validate.sh

建议是:先只写 SKILL.md,等内容多到影响阅读了再拆分。过早拆分反而增加维护成本。

SKILL.md 怎么写才好用

Frontmatter:两个字段就够

---
name: api-standard-check
description: |
  检查 API 接口是否符合团队规范。当用户新增、修改 API 接口,
  或提到 RESTful 规范、接口命名、请求响应格式时使用。
---

name 没什么好说的,跟文件夹同名。重点在 description

Description 里埋触发词

Description 不是给人看的文档说明——它是 AI 用来判断「要不要激活这个 Skill」的依据。所以你要在里面埋入触发关键词

# 不好:太笼统,AI 不知道什么时候该触发
description: API 相关的检查工具

# 好:列出了具体的触发场景和关键词
description: |
  检查 API 接口是否符合团队规范。当用户新增、修改或删除 API 接口,
  提到 RESTful 规范、接口命名、请求响应格式、HTTP 方法选择、
  状态码使用时触发。

注意 description 有 1024 字符的上限(这是 Claude Skills 规范的限制,多数兼容平台沿用),超了会被截断。不需要面面俱到,抓住核心触发场景就行。

Body 推荐的章节组合

看了十几个写得好的 Skill 后,可以总结出一个比较通用的章节模板:

## 适用场景
(什么时候用,什么时候不用)

## 核心流程
(1-2-3 步骤,用 checkbox)

## 关键约束
(必须遵守的硬规则)

## 常见错误
(正反示例对比)

## 校验清单
(完成前的自检项)

不需要全写,根据 Skill 的复杂度取舍。简单的 Skill 可能只需要「流程 + 约束」就够了。

几个实用技巧

用 checkbox task list 让 AI 按步骤执行

这是最有用的技巧之一。AI 在执行多步任务时容易跳步或遗漏,给它一个 checkbox 列表效果非常好:

## 执行流程

- [ ] 检查接口 URL 是否符合 RESTful 命名
- [ ] 验证 HTTP 方法是否正确(GET 查询、POST 创建...)
- [ ] 确认请求/响应 Body 的 JSON 字段命名风格为 camelCase
- [ ] 检查错误码是否在团队错误码表中注册
- [ ] 生成检查报告

AI 会逐项完成,不会漏掉。

正反示例比文字描述有效 10 倍

与其写一段话解释规则,不如直接给正反示例:

## 接口命名规范

❌ 错误:
- `GET /getUserInfo` — 不要用动词
- `POST /api/v1/delete-user` — 方法和 URL 语义冲突

✅ 正确:
- `GET /users/{id}` — 资源名词 + 路径参数
- `DELETE /users/{id}` — HTTP 方法表达操作意图

AI 对这种格式的理解和执行效果远好于纯文字规则。

内容太多就拆 companion files

当 SKILL.md 超过 5000 词,就该考虑拆分了。把详细的参考资料和扩展示例放到单独的文件:

<!-- 在 SKILL.md 中引用 -->
详细的 JSON Schema 定义见 [reference.md](./reference.md)。
更多示例见 [examples.md](./examples.md)

主文件保持精炼,让 AI 快速抓住核心;需要细节时再加载 companion files。

踩过的坑

改了 Skill 必须重启 session

这个坑容易反复踩。修改了 SKILL.md 的内容后,当前会话通常不会自动重新加载(不同 Agent 的缓存策略略有差异,但稳妥起见都应当假设需要重启)。开一个新的 session 才能看到效果。调试的时候特别容易忘记这一点,然后以为自己的修改没生效。

Description 超长被静默截断

没有报错,没有警告,就是不触发。后来发现是 description 写太长被截断了,截断后的内容丢失了关键触发词。控制在 1024 字符以内,宁可精简也不要超。

触发词不精确导致误匹配

写过一个 Skill 的 description 里包含「代码检查」,结果用户随便提一句「帮我检查一下这段代码」就触发了,完全不是预期的场景。

解决办法:触发词要具体到业务场景,而不是泛泛的动作词。比如用「API 接口规范检查」而不是「代码检查」。

流程写得太抽象,AI 不知道怎么执行

早期写的流程类似「检查代码质量」「确保符合规范」,AI 每次执行的方式都不一样,结果不稳定。

后来改成具体的、可操作的步骤,效果好很多:

  • 不好:「检查代码质量」
  • 好:「运行 eslint --fix,确认无 error 级别告警」

最后

写 Skill 本质上是在给 AI 写 SOP(标准作业程序)。你的团队有什么重复性的规范检查、有什么容易出错的流程、有什么新人经常踩的坑——这些都是好的 Skill 素材。

写好一个 Skill 不需要很长,但需要够具体。与其写一个大而全的万能 Skill,不如写几个小而精的专项 Skill,各司其职。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions