文章目录
摘要:Skill 是 Claude 的"专业记忆单元"——一段结构化的 Markdown 指令,告诉模型在特定场景下如何工作。但写出一个能稳定触发、输出高质量结果的 Skill,远比想象中复杂。本文系统讲解 Skill 的设计哲学、SKILL.md 的解剖结构、测试与评估方法,以及利用自动化脚本做描述优化的完整流程。
一、什么是 Skill,为什么需要优化它
1.1 Skill 的本质
Claude 的 Skill 系统是一套渐进式上下文加载机制。每个 Skill 由三层组成:
- 元数据层(
name+description):始终存在于模型上下文,大约 100 词。这是触发机制的核心——Claude 根据这段描述决定是否去读完整的 SKILL.md。 - 指令层(SKILL.md 正文):当 Skill 触发时加载,建议控制在 500 行以内。包含操作步骤、示例、约束条件等。
- 资源层(scripts / references / assets):按需加载,无大小限制。脚本可以直接执行而无需读入上下文。
理解这三层的加载时机,是写好 Skill 的第一步。
1.2 为什么 Skill 会"失效"
Skill 失效通常发生在以下场景:
- 触发不足(Under-trigger):描述写得太保守,Claude 判断"我自己能搞定",跳过了 Skill。这是最常见的问题。
- 触发过度(Over-trigger):描述太宽泛,在不相关的请求里也触发,浪费上下文。
- 指令歧义:SKILL.md 正文逻辑不清晰,Claude 执行时偏离预期。
- 资源未引用:有有用的参考文件,但 SKILL.md 没有明确告知模型何时去读。
优化 Skill 的本质,就是精确校准触发边界、明确执行路径、消除指令歧义。
二、Skill 的解剖:SKILL.md 的完整结构
一个标准的 Skill 目录长这样:
my-skill/
├── SKILL.md # 必须
└── bundled-resources/ # 可选
├── scripts/ # 可执行脚本
├── references/ # 参考文档
└── assets/ # 模板、字体、图标等
2.1 YAML Frontmatter
---
name: my-skill
description: >
当用户需要做 X 的时候使用此 Skill。具体触发场景包括:
提到"X工作流"、"需要处理Y格式"、或者问及"怎么做Z"。
即便用户没有明确说"用skill",只要涉及X领域的复杂任务,也要触发。
compatibility:
tools:
- bash
- python3
---
description 是整个 Skill 最重要的字段。 它决定了触发率。写法要遵循"推送式(pushy)"原则:
- ✅ 列出多个触发关键词和场景
- ✅ 明确说"即便用户没有明确要求,只要涉及X,也应触发"
- ❌ 避免只写"用于做X"这种过于简洁的描述
2.2 正文结构原则
最小惊奇原则(Principle of Least Surprise):Skill 的指令应该让模型按照最自然、最可预测的方式工作。避免引入反直觉的流程或术语。
层级化信息组织:
## 主流程(必读)
简洁描述核心工作流,3-5步以内。
## 边界情况处理
只有遇到特殊输入时才需要阅读本节。
## 参考文档索引
- references/aws.md — AWS 部署配置
- references/gcp.md — GCP 部署配置
仅在涉及对应云平台时读取。
多域场景的组织方式:当 Skill 支持多个框架或平台时,把通用流程放在 SKILL.md,把平台细节放在 references/ 子文件里,按需加载。这样既保持主文件精简,又不损失能力。
2.3 何时需要脚本
以下情况考虑把逻辑封装成脚本:
- 确定性操作:格式转换、文件合并、数据提取——这些有明确的正确答案,脚本比自然语言描述更可靠。
- 重复性操作:需要对大量输入执行相同操作。
- 外部依赖:需要调用特定的 CLI 工具或 Python 库。
脚本放在 scripts/ 目录,在 SKILL.md 中用路径引用:
执行以下命令完成转换:
```bash
python /mnt/skills/my-skill/scripts/convert.py --input $INPUT --output $OUTPUT
---
## 三、优化循环:从草稿到精品的迭代路径
Skill 优化遵循一个核心循环:
草稿 → 测试用例 → 执行 → 评估(定性+定量)→ 修改 → 重复
### 3.1 第一步:捕获意图
在动手写之前,先回答四个问题:
1. 这个 Skill 要让 Claude 具备什么能力?
2. 哪些用户输入应该触发它?
3. 期望的输出格式是什么?
4. 输出是否有客观正确性(适合定量测试)?还是主观的(依赖人工评估)?
**客观输出**(文件转换、数据提取、代码生成)→ 写测试断言,做定量评估。
**主观输出**(写作风格、创意内容)→ 依赖人工定性评估。
### 3.2 第二步:设计测试用例
一个好的测试用例包含:
```json
{
"prompt": "请帮我把这个 Excel 文件转换成 CSV,并去掉空行",
"assertions": [
{
"type": "file_exists",
"value": "output.csv"
},
{
"type": "content_contains",
"value": "非空行数据"
}
]
}
测试用例设计的关键原则:
- 测试用例要有实质内容。简单的单步请求("读这个文件")不会触发 Skill,因为 Claude 觉得自己直接就能做。测试用例要足够复杂,让模型感到"我需要专门的指导"。
- 覆盖边界情况。除了正常路径,也要测试异常输入、空输入、超大文件等。
- 测试集的规模。初期 5-10 个测试用例足够,迭代几轮后扩展到 20-30 个做更严格的验证。
3.3 第三步:执行与观察
在 Claude.ai 环境中,由于没有子代理,测试是串行的:
- 读取 SKILL.md
- 按照 Skill 指令,亲自完成每个测试 prompt
- 记录输出,对照期望结果
这个过程有一个微妙的注意点:你既是 Skill 的作者,也是执行者,你对 Skill 的了解远超过"冷启动"状态下的 Claude。因此这轮测试更像是冒烟测试(Smoke Test),用于发现明显的逻辑漏洞,而非精确测量触发率。
3.4 第四步:定性评估
对于每个测试用例的输出,询问自己:
- 输出是否符合预期格式?
- 步骤是否被正确执行?
- 是否出现了 Skill 描述里没有涵盖的歧义?
- 边界情况是否被妥善处理?
把发现的问题整理成一份清单,用于下一轮 SKILL.md 修改。
3.5 第五步:迭代修改
根据评估反馈,修改 SKILL.md:
| 问题类型 | 修改方向 |
|---|---|
| 步骤被遗漏 | 在正文中用 **重要** 或 <!-- 必须执行 --> 等标记强化关键步骤 |
| 输出格式不对 | 在 Skill 中加入明确的输出格式示例 |
| 触发不稳定 | 优化 description 字段(见第四章) |
| 边界处理失败 | 在"边界情况"节添加专门的处理指引 |
| 资源未被使用 | 在 SKILL.md 中加入更明确的"何时读取参考文件"的指令 |
四、描述优化:触发机制的精细调校
description 字段是 Skill 系统中杠杆效应最大的部分。一个好的描述可以把触发率从 40% 提升到 90%+。
4.1 触发机制原理
Claude 通过对比用户请求与 Skill 描述的语义相关性来决定是否触发。理解以下几点有助于写好描述:
- Claude 倾向于低触发。模型默认认为自己有能力处理大多数任务,只有当 Skill 描述非常明确地匹配当前请求,才会主动去读。
- 关键词不等于触发。描述不是关键词列表,而是需要传达"这个 Skill 在什么情况下能提供独特价值"。
- 复杂任务更容易触发。简单的一步操作不会触发,因为模型觉得不需要外部帮助。
4.2 手动优化描述的技巧
技巧一:明确列出触发场景
# Before(弱)
description: 用于处理 DOCX 文件的 Skill。
# After(强)
description: >
当用户需要创建、读取、编辑或操作 Word 文档(.docx 文件)时使用。
触发场景包括:提到"Word文档"、".docx"、需要带目录/页眉/页码等格式的专业文档、
从.docx提取内容、在文档中插入图片、进行查找替换。
即便用户只说"写一份报告"、"写一个备忘录",如果明显是需要Word格式的,也应触发。
技巧二:加入"即便…也要触发"的表述
这种句式直接对抗 Claude 的低触发倾向:
即便用户没有明确提到"skill"或具体工具名,只要涉及X类型的复杂任务,也必须触发本Skill。
技巧三:用负面案例划清边界
防止过度触发:
注意:如果任务是简单的文本问答或基础代码演示(少于20行),不需要触发本Skill。
技巧四:使用同义词和不同措辞
不同用户描述同一需求的方式差异很大:
触发词:制作PPT / 做幻灯片 / 写演讲稿 / presentation / deck / 讲稿 / 课件
4.3 自动化描述优化(Claude Code / Cowork 环境)
在支持 claude -p 的环境中,可以使用 scripts/run_loop.py 进行自动化优化:
python -m scripts.run_loop \
--eval-set trigger-eval.json \
--skill-path ./my-skill \
--model claude-sonnet-4-20250514 \
--max-iterations 5 \
--verbose
这个脚本会:
- 把评估集分成 60% 训练集 / 40% 测试集
- 对当前描述运行评估(每个 query 执行 3 次,取平均触发率)
- 调用 Claude 分析失败案例,提出描述改进方案
- 在训练集+测试集上重新评估新描述
- 重复 5 轮,选取测试集上得分最高的描述(而非训练集,以避免过拟合)
最终输出 best_description,将其复制回 SKILL.md 的 description 字段。
评估集的设计(trigger-eval.json):
[
{
"prompt": "帮我把这个Excel转成Word格式的报告",
"should_trigger": true
},
{
"prompt": "解释一下Python的装饰器是什么",
"should_trigger": false
},
{
"prompt": "我需要一份带封面和目录的年度总结文档",
"should_trigger": true
}
]
should_trigger: true:这类请求应该触发 Skillshould_trigger: false:这类请求不应该触发 Skill
评估集中两类各占 50% 左右,确保优化后的描述既不低触发也不过度触发。
五、高级话题:多层架构与大型 Skill 的管理
5.1 当 SKILL.md 超过 500 行
SKILL.md 建议控制在 500 行以内。当内容超过这个限制时,引入第二层层级:
## 核心流程(必读)
[10-20行的核心步骤描述]
## 详细配置
→ 根据你的需求,读取对应的参考文档:
- AWS 部署:`references/aws.md`
- GCP 部署:`references/gcp.md`
- 高级网络配置:`references/networking.md`
## 常见错误排查
→ 如果遇到报错,读取 `references/troubleshooting.md`
给参考文档加上明确的"何时读取"指引,让模型按需加载,不浪费上下文窗口。
5.2 大型参考文档的组织
如果参考文档超过 300 行,必须在开头添加目录:
# AWS 部署参考
## 目录
- [1. IAM 权限配置](#iam)(第15-60行)
- [2. VPC 网络设置](#vpc)(第61-120行)
- [3. EC2 实例类型选择](#ec2)(第121-200行)
...
这样模型可以用 view 工具只读取相关章节,而不是加载整个文件。
5.3 Skill 版本管理
在更新已有 Skill 时,有几个重要原则:
- 保留原有 name:安装后的 Skill 通过 name 字段识别,改名会导致失联。
- 先复制再编辑:安装目录通常是只读的,将 Skill 复制到可写位置(如
/tmp/skill-name/)再修改。 - 向后兼容:如果 Skill 被多人使用,改变行为时要保持接口稳定,或者明确标注"Breaking Change"。
六、常见反模式与避坑指南
6.1 指令层面的反模式
| 反模式 | 问题 | 修复方法 |
|---|---|---|
| 步骤过多 | Claude 容易跳步 | 核心步骤控制在5步以内,细节放到子文档 |
| 没有示例 | 格式不明确 | 加入输入/输出的具体示例 |
| 用"尽量"、"如果可能" | 模型会把它当成可选项 | 改成"必须"、"始终"等强制性语言 |
| 把所有内容塞进SKILL.md | 加载慢,主流程被淹没 | 用参考文件分层 |
6.2 描述层面的反模式
| 反模式 | 问题 | 修复方法 |
|---|---|---|
| 描述只有一句话 | 触发率低 | 列出多个触发场景和关键词 |
| 使用模糊形容词 | "强大的X工具"没有触发价值 | 改成具体的使用场景 |
| 不区分正负案例 | 触发边界不清晰 | 加入"不需要触发"的反例 |
6.3 测试层面的反模式
| 反模式 | 问题 | 修复方法 |
|---|---|---|
| 测试用例太简单 | 不会触发Skill,测不到真实行为 | 使用复杂、多步骤的请求 |
| 只测正常路径 | 边界情况上线后才爆 | 覆盖空输入、异常格式、超大文件 |
| 测试集太小 | 结论不可靠 | 至少10个用例,理想20+ |
七、实战案例:优化一个"深度文章写作"Skill
假设我们要写一个 Skill,专门帮助用户撰写 Hugo 格式的深度长文。初始版本如下:
初始版本(有问题)
---
name: hugo-writer
description: 用于写 Hugo 文章的 Skill。
---
## 步骤
1. 写 frontmatter
2. 写正文
3. 保存文件
问题:
- description 太简单,低触发
- 正文步骤过于抽象,没有格式规范
- 没有深度文章的具体要求(字数、结构、SEO等)
优化后版本
---
name: hugo-writer
description: >
当用户需要创作 Hugo 格式的 Markdown 文章时使用,尤其是深度长文、技术博客、
教程或分析性文章。触发场景:提到"Hugo文章"、"md博客"、"深度长文"、"技术博客"、
需要带frontmatter的Markdown文件。即便用户只说"写一篇关于X的文章发到博客",
也应触发本Skill。不适用于简单的文本问答或短段落创作。
---
## Hugo 文章写作规范
### Frontmatter 必填字段
```yaml
---
title: "文章标题(简洁、包含核心关键词)"
date: YYYY-MM-DDTHH:MM:SS+08:00 # 使用当前时间
draft: false
description: "SEO描述,120-160字符"
tags: []
categories: []
author: ""
slug: "url-friendly-slug"
toc: true # 深度长文必须开启目录
---
文章结构要求
- 字数:深度长文不少于 3000 字
- 章节:至少 5 个一级标题(
##),用数字编号 - 开篇:必须有摘要 blockquote(
> **摘要**:...) - 结尾:必须有总结章节和进一步阅读的建议
内容深度要求
- 每个核心概念提供具体示例
- 对比表格用于多方案比较
- 代码块必须标注语言类型
- 避免泛泛而谈,每个论点提供依据或数据
输出
将文件保存到 /mnt/user-data/outputs/SLUG.md,然后使用 present_files 工具提供给用户。
### 优化效果分析
经过这次优化:
1. **触发率**:description 从1句话扩展到包含多场景、关键词、边界说明,预期触发率显著提升
2. **输出质量**:明确规定了字数、必填字段、结构要求,输出更一致
3. **边界清晰**:明确说明了什么情况不触发,避免过度触发
---
## 八、总结与最佳实践清单
Skill 优化是一个**持续迭代**的工程实践,不存在"写完就完"的状态。随着使用场景积累更多反馈,Skill 应该持续演进。
### 最佳实践清单
**设计阶段**
- [ ] 明确 Skill 的唯一核心能力,不要"大而全"
- [ ] 区分哪些输出是客观可测的,哪些是主观的
- [ ] 准备至少 10 个测试用例,涵盖正常路径和边界情况
**写作阶段**
- [ ] SKILL.md 控制在 500 行以内
- [ ] description 使用"推送式"写法,列出多个触发场景
- [ ] 核心步骤不超过 5 步,细节放到参考文件
- [ ] 为每个参考文件标注"何时读取"
- [ ] 使用强制性语言("必须"/"始终")而非软性语言("尽量"/"如果可能")
**测试阶段**
- [ ] 测试用例有足够的复杂度(避免简单一步请求)
- [ ] 运行测试并记录实际输出
- [ ] 人工评估:格式是否正确、步骤是否完整
**优化阶段**
- [ ] 根据测试反馈修改 SKILL.md,而非凭直觉猜测
- [ ] 重点关注"触发不足"问题,优先优化 description
- [ ] 在 Claude Code / Cowork 环境中考虑使用 `run_loop.py` 做自动化描述优化
- [ ] 迭代至少 3 轮后再发布
**维护阶段**
- [ ] 收集用户反馈,建立 Bad Case 记录
- [ ] 定期回顾 Skill 的测试集是否仍有覆盖价值
- [ ] 版本更新时保留原有 `name` 字段,确保向后兼容
---
> **写在最后**:Skill 系统的设计哲学是"渐进式上下文管理"——把对的信息在对的时间放到模型的注意力中。一个优秀的 Skill 不是信息的堆砌,而是对"Claude 在这个场景下真正需要什么"的精准理解。这需要观察、测试、倾听反馈,然后不断打磨。
---
*文章生成时间:2026-03-22 02:31 CST*
*基于 Claude Skill Creator 系统文档及工程实践整理*
评论