Skill 是 AI Agent 的能力扩展单元。把它理解为工具箱里的工具:每把工具只做一件事,但每把都要好用到极致。

本文分两部分:Anthropic 官方设计原则,以及在 OpenClaw 场景下的实践经验。本文默认你会写 Skill。


Skill 旨在解决模型上下文长度问题+能力复用

模型上下文长度有限,Skill 通过渐进披露大幅减少上下文占用,通过 skill 规范让 skill 可打包,可分享,成为所有 bot 的 skill。

一、Skill 设计原则(Anthropic 官方)

1.1 每个 Skill 只做一件事,可组合

为什么这样要求?

  • AI 每调用一个 Skill,系统会注入该 Skill 的全部上下文。如果一个 Skill 塞了太多功能,token 会被稀释,真正需要的知识反而被冲淡。

  • 更关键的是:单一职责的 Skill 更容易测试、复用和调试。多个简单 Skill 可以自由组合,复杂的工具链由调用方(Agent 或工作流)负责编排。

反面例子:

  • 一个 Skill 既能"查询数据库"又能"发送邮件"还能"生成报告"。三个功能绑在一起,description 没法写清楚触发条件,模型也不知道什么时候该调用。

正面例子:

  • 三个独立 Skill——query-database、send-email、generate-report,由工作流按顺序调用。description 写得精准,模型只在相关场景才触发。

举例子:

elastic-debug 这个 Skill 只负责一件事:根据 task_id 或场景关键词,查内部服务的日志和监控数据,输出结论。它不负责修复、不负责发送告警、不负责创建工单。这些能力由其他 Skill 负责,或者由调用它的 Agent 自己判断下一步。

description 写的是:

触发场景:(1) 给出 task_id 要求排查 (2) 询问某服务/场景的失败率、产能、吞吐 (3) 要求查某场景的失败原因 (4) 提到 ai 平台等关键词。自动执行查询,直接输出结论。

四个字说明触发条件,模型一看就知道什么时候该用它。


1.2 渐进披露:Metadata(~100词元)→ Instructions操作说明(<5k)→ Resources附件(按需)

Metadata(description)是触发条件,必须简短。

Instructions 是使用说明,控制 Skill 的调用方式。

Resources 是附件,在确实需要时再加载。

这个三层结构的本质是:把决策信息放在前面,把执行细节放在后面。

模型决定"要不要调用",只需要看 description,不需要读完整份 SKILL.md。description 读完了再读 Instructions,了解怎么用。Resources 只有在前两步确定需要时才加载。

反面例子:

Description 写了两百字,把 API 参数、返回格式、错误码全塞进去。description 过长,模型反而抓不住重点。

正面例子(elastic-debug):

description 只有上面引用的四行。Instructions 写的是具体的查询命令和决策逻辑。references/ 目录下有 fields.md 等参考文档,详细列出了字段和场景的对应关系。

SKILL.md 主文件读下来不到 100 行,但核心指令全在里面。查某个字段的细节时,Agent 自己去 references/ 下找。


1.3 Description 是触发器:写"什么时候用",不写"做什么"

这是最容易犯的错误。

反例:

Description: "这个 Skill 可以查询知识库文档、创建文档、修改权限。"

这个描述没有说明白什么时候应该用它。模型会困惑:"用户想操作知识库了,但我不确定这是不是最佳方式"。

正例:

Description: "当用户提到'知识库URL'、'查询文档'、'创建文档'、'文档权限'时触发。用于知识库文档管理。"

描述的是触发场景,不是功能清单。模型看到前者会判断:"用户想操作知识库文档了,我应该调用这个 Skill"。

关键区别:

  • 触发器:用户说了什么(场景关键词)

  • 功能清单:Skill 能做什么(能力列表)


1.4 写 Skill 的 Gotchas(踩坑点)

以下 9 条是大量实践中总结出的避坑清单,按重要程度排列。

第一条:Description 写触发条件,不写功能描述

见 1.3。核心是把"什么时候用"和"做什么"分开。前者放 Description,后者放 Instructions。

第二条:不写通用知识,只写团队特有逻辑

Skill 不是知识库。模型本身已经具备通用能力(写代码、查文档、搜索等),Skill 的价值在于补充团队特有的业务逻辑、流程和系统接入方式。

反面例子:

在 Skill 里写"HTTP 请求需要包含 Authorization header,响应是 JSON 格式"。这是通用常识,不需要写。

正面例子:

eac内部 Skill 应该写"EAC-UGate Token 的缓存机制在哪里、有效期多久、过期后怎么刷新",而不是"什么是 Token"。

elastic-debug 里写的是"按 task_id 查时,格式是 数字-类型(如 123-gemini_image)",这是内部特有的 ID 格式约定,模型不可能预先知道。

第三条:必须加 Gotchas

每个 Skill 都应该有 Gotchas 节,即使只有一条。

常见 Gotchas 类型:

  • 认证信息过期后的处理方式

  • 哪些操作是不可逆的(删除、取消、覆盖等)

  • 特殊参数格式要求

  • 调用频率限制

elastic-debug 的 Gotchas:

沿数据链往上追是进阶手段,仅在以下情况使用:task_error 的报错和实际原因对不上、错误看起来不合理怀疑输入数据本身有问题、同一个 task 大面积失败报错模式异常。

这条 Gotchas 来自真实案例:曾经有人追查gemini 生图的 JSON 解析失败,追到上游发现是生图规划大模型输出重复爆炸,导致数据被截断。表面上是前者的 bug,实际根因在上游。没有这条 Gotchas,Agent 可能会一直在gemini这层绕。

第四条:用文件夹结构,渐进披露

如果一个 Skill 包含多个子主题,用文件夹组织:

skill/
SKILL.md # 主文件,包含 Instructions 和触发条件
references/ # 参考文档(API 参数、详细说明)
scripts/ # 预制脚本

主文件只放最核心的指令,具体细节放到 references/ 下的独立文件。elastic-debug 就是这样组织的:SKILL.md 里写决策逻辑,references/fields.md 里放字段映射表。

第五条:用 config 做配置流程

需要用户提供配置(如 API Key、Token)的 Skill,应该在 SKILL.md 里写清楚环境变量或配置文件的位置,而不是每次都要求用户手动输入。

反面例子:

每次调用都让用户输入密码。

正面例子:

从 ~/.skill_prefs.json 读取用户上次输入的手机号,如果文件不存在再询问。

第六条:不过度约束,给模型灵活性

Skill 指令不等于程序代码。AI 需要一定的灵活性来适应用户的具体语境。

反面例子:

"必须按顺序执行以下步骤:第一步...第二步...第三步..."

如果模型本身能够通过对话自然引导用户完成这些信息,不需要写死这个顺序。

正面例子:

"通常按 A → B → C 的顺序执行,但如果用户明确指定了顺序,按用户意图优先。"

elastic-debug 的决策逻辑里写了"大多数情况 处理器 接口返回的 task_flow_error 就够定位问题",而不是写死"必须先查 A 再查 B 再查 C"。

第七条:加记录(有状态 Skill)

如果 Skill 需要跨对话记住某些状态(比如用户的偏好、Token 有效期等),在 SKILL.md 里说明状态存储方式。

反面例子:

每次调用都让用户重新输入手机号。

正面例子:

从 ~/.openclaw/hair-salon-prefs.json 读取用户上次选择的店铺、发型师、手机号。

这个理发 skill就是这样设计的:首次用需要提供手机号,后续自动从配置文件读取,用户只需要说"还约上次那个发型师"就行。

第八条:预制脚本避免重复

重复的 shell 命令、Python 代码片段,应该抽成独立脚本放在 scripts/ 目录。SKILL.md 里只写"调用方式",不写具体实现细节。

好处:

  • 不会被加载进入上下文。一个脚本可能有几千 token,大模型能执行就行,加载进上下文不仅占用上下文长度,还容易影响大模型注意力。

  • 修改脚本逻辑时不需要改 SKILL.md

elastic-debug 的 elastic-query.sh 就是预制脚本,所有 Elastic 查询都走这一个脚本,不需要在 SKILL.md 里写 curl 命令。

第九条:按需 Hooks(危险规则非常驻)

对于可能产生破坏性后果的操作(删除文件、取消订单、撤销支付等),可以设计 Hooks 机制——这类规则平时不加载,只在特定操作触发时才介入校验。

例如 :某人在使用知识库管理 skill 时,把自己的知识库删光了

就可以在 skill 里加入:

## 危险操作 Hook
执行以下操作前,必须先获得用户明确确认:
- 删除文档
- 修改权限
- 导出数据
### 确认模板
执行 {operation} 前,必须:
1. 列出受影响的对象
2. 询问:"确认执行 {operation} 吗?(是/否)"
3. 只有用户回复"是"才继续

二、Skills 实践经验(TRAE 团队的分享)

以下经验来自内部 OpenClaw Agent 建设过程中的踩坑和验证。

2.1 Session-Learning:把每次解决问题的经验沉淀下来

多轮对话中,AI 容易"越跑越偏"——前面已经验证过的正确方向,在后续对话中被推翻。

实操方式:

  • 每完成一个复杂任务,主动问用户:"这个解决方案要不要固化到 Skill 里?"

  • 固化时更新对应的 SKILL.md 或 Gotchas 节

  • 多轮对话的最后阶段,做一次"路径回顾",确保这次用到的经验在下一次还能用上

一个真实场景:

用 elastic-debug 排查一个任务失败的问题,第一次查的时候发现 processor 接口和 Elastic 日志都要看,第二次排查类似问题时,Agent 直接把这条经验写进了 Gotchas:同类型的失败优先查 processor 接口,不够再查 Elastic。

2.2 代码优先:把 SOP 和业务知识沉淀成可复用 Skill

团队特有的 SOP(标准操作流程),比通用知识更需要 Skill 化。

反面案例:

每次部署流程都用文字描述:"先去 XX 系统申请权限,然后登录 XX 主机,执行 XX 命令"。模型每次都要重新理解这些步骤,而且文字描述容易漏掉细节。

正面案例:

把这些步骤写成 deploy skill,里面包含具体的系统地址、命令模板、权限申请入口。新工程师入职后,直接说"帮我执行部署流程",剩下的 AI 自动完成。

2.3 按需加载:让 AI 只加载真正需要的知识

不是所有 Skill 都要在每次对话中激活。OpenClaw 的 Skill 触发机制基于 description 匹配——description 写得精准,AI 只在真正相关时才加载。

按需加载的好处:

  • 省 token(上下文越小,模型响应越快)

  • 减少干扰(无关 Skill 的指令不会混入推理过程)

  • 便于维护(单个 Skill 修改不影响其他)


三、快速检查清单

写完一个 Skill 后,对照以下问题自检:

Description 部分:

  • 是否写的是触发条件(什么时候用),而不是功能清单(能做什么)?

  • 模型看到这段描述,能否准确判断是否应该调用?

  • 字数是否控制在 100 token 以内?

Instructions 部分:

  • 是否只写了团队特有逻辑,没有重复通用知识?

  • 是否有 Gotchas 节,列出常见的坑?

  • 破坏性操作(删除、取消、覆盖)是否有提醒?

  • 给模型的约束是必要的还是过度的?

整体结构:

  • 是否符合渐进披露原则?(核心指令在前,详细参考在后)

  • 是否有状态持久化需求?如果有,是否说明了存储方式?

  • 是否有重复代码片段?是否应该抽到 scripts/ 目录?


四、常见错误案例

案例一:把 Skill 写成使用手册

错误写法:

Description: "这个 Skill 是内部代码搜索工具的使用说明..."

这是说明书思维,不是触发器思维。

clawhub 上的很多热门 skill 的 Description 都存在这个问题

例子 1:tavily-search:

通过Tavily API进行AI优化的网页搜索。为AI代理返回简洁、相关的结果。

例子 2:humanizer:

从文本中移除人工智能生成写作的痕迹。适用于编辑或审阅时使用
使文本听起来更自然,更像人工编写的。基于维基百科的
全面的“AI写作迹象”指南。检测并修正以下模式:
夸张的象征意义,浮夸的宣传语言,肤浅的表面化分析,模糊不清
归因、破折号过度使用、三法则、人工智能词汇、否定
并列结构过多,以及过多的连词短语。

正确写法:

Description: 当用户询问大模型用量、模型额度、AI消费、LLM使用情况、One API剩余额度、本月/今天用了多少钱时触发使用。

如果你发现一个新安装的 skill 改触发却没被触发,那可以看看他的 Description,有时候不是模型笨,是 skill 写的不行,你二次优化一下 Description,触发效果会好很多。

案例二:塞入过多功能

一个 Skill 同时支持:抖音视频下载,抖音视频转 mp3,语音转文字,内容优化+总结

分成多个 skill,灵活性更强。

这点看具体情况,我就是不想拆 skill,一个 skill 就够用了,那也行。

案例三:缺少 Gotchas

没有说明认证 Token 有效期,导致用户在关键操作时突然失败。Gotchas 里一定要写清楚认证方式和失效处理。

案例四:给模型太多约束

"你必须先确认用户手机号,再确认预约时间,最后才能提交订单。"

如果模型本身能够通过对话自然引导用户完成这些信息,不需要写死这个顺序。保留灵活性,减少过度约束。


五、总结

Skill 编写的核心心法:

  • 触发器(description)要精准——让模型一看就知道该不该用

  • 指令要专注——只写团队知识,不写通用常识

  • 结构要渐进——核心在前,细节按需加载

  • 坑要提前标——Gotchas 是经验沉淀,不是废话

做到这四点,一个 Skill 就是好用的工具。这些你大概了解就行,但是得让你的龙虾记住。

如果你还不会写 skill,把简单的小需求告诉龙虾,让他写一个 skill,你看看他写出来的 skill 文件,大概就清楚 skill 的写法了,而你只需要关注他是否完成上面几点,未完成就 督促+提供龙虾所需的内容 即可

六、参考资料链接

Anthropic 官方:

OpenAI 官方:

企业实践(TRAE):

第三方:

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐