如何编写标准规范的 Skills:从入门到精通的完整指南
约 7 分钟1867 字8 次阅读

如何编写标准规范的 Skills:从入门到精通的完整指南
引言
2026年,Skills 已经成为 AI Agent 扩展能力的主流方式。
但很多人做的 Skills 问题一堆:触发词写得模糊、SKILL.md 过于冗长、资源文件乱放、描述和实际功能对不上——导致 AI 要么选错 Skill,要么根本不知道什么时候该调用它。
本文是基于 OpenClaw / Codex 官方规范写的完整指南,手把手教你从零写出一个标准、规范、可分发的 Skill。
一、Skill 是什么?先搞清楚基本概念
Skill 是一个自包含的能力扩展包,让 AI 在特定领域具备专业知识和操作流程。
一个 Skill 由以下部分组成:
skill-name/
├── SKILL.md # 核心文件(必须)
├── scripts/ # 可执行脚本(可选)
├── references/ # 参考文档(可选)
└── assets/ # 资源文件(可选)
各部分职责
| 文件/目录 | 职责 | 何时加载 |
|---|---|---|
| SKILL.md | 触发条件和核心指令 | 始终加载(触发前) |
| scripts/ | 确定性逻辑代码 | 执行时调用 |
| references/ | 详细参考资料 | 按需加载 |
| assets/ | 模板、图片等输出资源 | 生成内容时使用 |
二、SKILL.md 的标准结构
SKILL.md 是 Skill 的核心,每个 SKILL.md 由两部分组成:
2.1 YAML Frontmatter(必须)
Frontmatter 里的 name 和 description 是唯一被 AI 在触发前读取的字段,决定了这个 Skill 什么时候被激活。
标准格式:
---
name: my-custom-skill
description: 描述这个Skill做什么,以及什么时候应该触发它
---
⚠️ 注意事项:
name只允许小写字母、数字、连字符description要写清楚触发场景,而不是功能描述- description 应该像"触发词清单",不是"功能说明书"
好例子:
---
name: pdf-editor
description: PDF文档编辑和处理。当用户说"帮我旋转这个PDF"、"合并多个PDF"、"从PDF里提取文字"、"给PDF加水印"、"压缩PDF"时触发。
---
坏例子:
---
name: pdf-editor
description: 这个Skill可以编辑PDF文件,支持多种操作。
---
(坏在哪里:没有触发场景,AI 不知道什么时候该用它)
2.2 Body(Markdown正文)
正文在 Skill 被触发后才加载,包含使用说明和操作指南。
核心原则:保持精简。
- SKILL.md 正文目标:< 500 行 / < 5000 tokens
- 详细资料放 references/,正文只放核心用法
- 用祈使句(命令式),不要啰嗦
三、目录结构规范
3.1 标准布局
my-skill/
├── SKILL.md # ✅ 必须
├── scripts/ # 可选
│ ├── do_something.py
│ └── helper.sh
├── references/ # 可选
│ ├── api_docs.md
│ └── schemas.md
└── assets/ # 可选
├── template.html
└── logo.png
3.2 哪些文件不该有
❌ 不要创建这些文件:
- README.md
- INSTALLATION_GUIDE.md
- QUICK_REFERENCE.md
- CHANGELOG.md
Skill 目录下只放 AI 执行任务需要的文件,不需要给人类看的说明文档。
四、触发词(Description)写作规范
这是最多人犯错的地方。
4.1 Description 的核心作用
AI 在收到用户消息时,会对比所有 Skill 的 description,找出最匹配的那个。Description 就是你的 Skill 的"广告词"和"匹配钥匙"。
4.2 写作原则
原则1:列出具体触发场景
description: 当用户说"帮我XXX"、"做一下YYY"、"生成ZZZ"时触发。
原则2:包含变体表达
用户说"旋转PDF"和"把PDF转个方向"和"PDFOrientation调转",意思一样,你的 description 要能覆盖这些变体。
原则3:区分相似 Skill
如果你的 Skill 叫 pdf-rotate,description 要和 pdf-compress 明确区分开。
原则4:说明不适用的场景
有时候说清楚"什么时候不要用"比"什么时候用"更重要。
description: PDF旋转和方向调整。当用户明确说"旋转"、"转方向"、"orientation"时触发。
# 主动排除:PDF内容识别(那是OCR Skill的事)
4.3 示例对比
| 质量 | Description |
|---|---|
| ⭐⭐⭐ | "当用户说'帮我旋转PDF'、'把PDF转90度'、'orientation'、'rotate'时触发。" |
| ⭐⭐ | "PDF编辑工具,可以旋转和调整PDF方向。" |
| ⭐ | "这是一个PDF编辑Skill,功能很强大。" |
五、Body 正文写作规范
5.1 使用祈使句
# ✅ 正确
Extract text from PDF using pdfplumber.
Run `python scripts/extract_text.py --input <file>`.
# ❌ 错误
This skill can be used to extract text. It uses pdfplumber library.
You might want to try extracting the text when working with PDFs.
5.2 结构化分层
# Skill Name
## 快速用法(最常用)
[最简单的调用方式]
## 进阶用法(备用)
[复杂场景]
## 配置选项
[可调整的参数]
## 注意事项
[容易出错的地方]
## 参考资料
- 详细内容:See [references/api.md](references/api.md)
- 示例:See [references/examples.md](references/examples.md)
5.3 渐进式披露(Progressive Disclosure)
不要把所有信息都塞进 SKILL.md 正文。遵循原则:
正文只写:每次执行都需要的基础信息 references/ 放:详细文档、API 列表、示例代码
# PDF Processing
## 基本用法
使用 pdfplumber 提取文本:[示例]
## 进阶用法
- 表单填写:See [references/forms.md](references/forms.md)
- API 参考:See [references/api.md](references/api.md)
- 更多示例:See [references/examples.md](references/examples.md)
5.4 长度控制
| 内容 | 建议行数 | 原因 |
|---|---|---|
| SKILL.md 正文 | < 500 行 | 超过会让上下文膨胀 |
| references/ 单文件 | < 100 行 | 文件太长时加目录 |
| 总 token 预算 | < 5000 tokens | 留空间给对话和其他 Skills |
六、Scripts 规范
6.1 什么时候用 Scripts
- 确定性操作:每次执行结果必须一样的操作(如文件处理)
- 重复性代码:同一个逻辑被反复重写
- token 优化:把复杂逻辑封装进脚本,不占上下文
6.2 Scripts 的优势
"脚本是'执行而不读入'的——零 token 成本。"
把命名转换、长度约束、格式校验这些细碎但脆弱的操作封装进脚本,不占用 AI 的上下文窗口。
6.3 脚本测试要求
⚠️ 重要:所有 scripts 必须实际运行验证,不能只写代码不测试。
至少测试以下场景:
- 正常输入
- 边界输入(空文件、超大文件、特殊字符)
- 错误处理
七、References 规范
7.1 什么时候用 References
- API 文档、数据库 schema(数据量大的参考资料)
- 公司内部流程文档
- 详细的工作流指南
7.2 文件命名
references/
├── api.md # API 文档
├── schemas.md # 数据结构
├── examples.md # 示例
└── policies.md # 政策/规范
7.3 大文件处理
如果单个文件超过 100 行,在文件顶部加一个目录:
# API Reference
## 目录
- [create](#create) - 创建资源
- [update](#update) - 更新资源
- [delete](#delete) - 删除资源
## create
...
八、Assets 规范
8.1 什么时候用 Assets
- 模板文件(HTML、PPT、文档模板)
- 品牌资源(logo、图片)
- 需要复制到输出中的 boilerplate 代码
8.2 Assets 不会被加载进上下文
Assets 是直接复制到输出的,不是给 AI 读的。如果 AI 需要参考某些内容,应该放 references/ 而不是 assets/。
8.3 示例场景
brand-skill/
├── SKILL.md
└── assets/
├── logo.png # 直接复用
├── email-template.html # 直接复用
└── colors.css # 直接复用
九、Skill 命名规范
9.1 命名规则
| 规则 | 正确 | 错误 |
|---|---|---|
| 字符 | 小写字母、数字、连字符 | 大写、空格、下划线 |
| 长度 | 64 字符以内 | 超过 64 |
| 格式 | 词根用连字符连接 | 驼峰或下划线 |
9.2 命名风格
- 优先用动词开头:
code-review、image-resize、data-export - 明确工具名:
gh-address-comments、linear-address-issue - 避免通用名:
skill、tool、helper
好名字:
pdf-rotatenotion-page-creatorfeishu-calendar-event
坏名字:
my-skilltool1pdftool_new
十、完整示例:从零构建一个 PDF 旋转 Skill
10.1 需求分析
用户会说:
- "帮我旋转这个PDF"
- "把PDF转90度"
- "PDF orientation 调转"
10.2 创建目录结构
mkdir -p pdf-rotate/{scripts,references,assets}
touch pdf-rotate/SKILL.md
10.3 编写 SKILL.md
---
name: pdf-rotate
description: PDF文档旋转和方向调整。当用户说"旋转PDF"、"PDF转方向"、"rotate PDF"、"PDF orientation"、"把PDF转90度"时触发。
---
# PDF Rotate
## 快速用法
使用 `scripts/rotate_pdf.py`:
```bash
python scripts/rotate_pdf.py --input <file.pdf> --angle 90 --output <output.pdf>
参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
--input | 输入PDF文件路径 | 必填 |
--output | 输出PDF文件路径 | <input>_rotated.pdf |
--angle | 旋转角度(90/180/270) | 90 |
注意事项
- 旋转是基于页面级别的,不是整体旋转
- 加密PDF需要先解密
- 批量旋转:See references/batch.md
进阶用法
- 批量旋转:See references/batch.md
- 方向检测:See references/auto-detect.md
### 10.4 编写旋转脚本
```python
#!/usr/bin/env python3
"""PDF旋转脚本"""
import argparse
from pypdf import PdfReader, PdfWriter
def rotate_pdf(input_path, output_path, angle):
reader = PdfReader(input_path)
writer = PdfWriter()
for page in reader.pages:
page.rotate(90) # 简单处理
writer.add_page(page)
with open(output_path, 'wb') as f:
writer.write(f)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--input', required=True)
parser.add_argument('--output')
parser.add_argument('--angle', type=int, default=90)
args = parser.parse_args()
output = args.output or args.input.replace('.pdf', '_rotated.pdf')
rotate_pdf(args.input, output, args.angle)
10.5 打包发布
python scripts/package_skill.py pdf-rotate
# 生成 pdf-rotate.skill 文件
十一、常见错误清单
❌ 错误1:Description 写得像说明书
# 错误
description: 这个Skill用于处理PDF文件,可以旋转、合并、分割等。
# 正确
description: PDF旋转。当用户说"旋转PDF"、"PDF转方向"、"rotate PDF"时触发。
❌ 错误2:把所有内容塞进 SKILL.md
# 错误:正文写了 2000 行
# 包括所有API、所有示例、所有变体
# 正确:正文精简,详细内容放 references/
❌ 错误3:命名不规范
# 错误
name: My Custom Skill # 包含空格和大写
name: my_custom_skill # 下划线而非连字符
# 正确
name: my-custom-skill
❌ 错误4:创建不需要的文件
# 错误:创建了这些
my-skill/
├── SKILL.md
├── README.md # ❌ 不需要
├── CHANGELOG.md # ❌ 不需要
├── INSTALL.md # ❌ 不需要
└── ...
# 正确:只有必要的文件
my-skill/
├── SKILL.md
├── scripts/
└── references/
❌ 错误5:Scripts 没有测试
scripts/ 里的代码必须实际运行验证,否则可能带着 bug 交付。
十二、自检清单(发布前必查)
-
name字段:全小写、连字符、64字符以内 -
description字段:列出具体触发词,不是功能描述 - SKILL.md 正文:< 500 行
- 详细文档:已移到 references/
- scripts/ 中的代码:已实际运行验证
- 没有创建多余文件(README.md、CHANGELOG.md 等)
- 目录结构符合规范
- 打包测试:
python scripts/package_skill.py通过
总结
写好一个 Skill 的核心就三句话:
1. Description 是钥匙 — 写得具体、写得场景化,AI 才能正确触发
2. 正文要精简 — 只放核心用法,详细内容放 references/
3. Scripts 是执行层 — 把确定性逻辑封装进去,不占上下文
记住这个设计哲学:
"Codex 已经足够聪明了。只需要告诉它'什么时候用'和'怎么用',不需要教它'为什么'。"
参考工具:
- OpenClaw skill-creator:帮你引导创建流程
scripts/init_skill.py:自动生成标准目录结构scripts/package_skill.py:打包并验证
参考资料:OpenClaw skill-creator SKILL.md、DigitalOcean Agent Skills 教程、AgentSkills.io Best Practices、GitHub datawhale/hello-agents
标签:#Skills #教程 #SKILL.md #OpenClaw #AIAgent #技能开发