跳转到正文
文章目录

摘要:Skill 是 Claude 的"专业记忆单元"——一段结构化的 Markdown 指令,告诉模型在特定场景下如何工作。但写出一个能稳定触发、输出高质量结果的 Skill,远比想象中复杂。本文系统讲解 Skill 的设计哲学、SKILL.md 的解剖结构、测试与评估方法,以及利用自动化脚本做描述优化的完整流程。


一、什么是 Skill,为什么需要优化它

1.1 Skill 的本质

Claude 的 Skill 系统是一套渐进式上下文加载机制。每个 Skill 由三层组成:

  1. 元数据层(name + description):始终存在于模型上下文,大约 100 词。这是触发机制的核心——Claude 根据这段描述决定是否去读完整的 SKILL.md。
  2. 指令层(SKILL.md 正文):当 Skill 触发时加载,建议控制在 500 行以内。包含操作步骤、示例、约束条件等。
  3. 资源层(scripts / references / assets):按需加载,无大小限制。脚本可以直接执行而无需读入上下文。

理解这三层的加载时机,是写好 Skill 的第一步。

1.2 为什么 Skill 会"失效"

Skill 失效通常发生在以下场景:

  • 触发不足(Under-trigger):描述写得太保守,Claude 判断"我自己能搞定",跳过了 Skill。这是最常见的问题。
  • 触发过度(Over-trigger):描述太宽泛,在不相关的请求里也触发,浪费上下文。
  • 指令歧义:SKILL.md 正文逻辑不清晰,Claude 执行时偏离预期。
  • 资源未引用:有有用的参考文件,但 SKILL.md 没有明确告知模型何时去读。

优化 Skill 的本质,就是精确校准触发边界、明确执行路径、消除指令歧义。


二、Skill 的解剖:SKILL.md 的完整结构

一个标准的 Skill 目录长这样:

</> PLAINTEXT
my-skill/
├── SKILL.md              # 必须
└── bundled-resources/    # 可选
    ├── scripts/          # 可执行脚本
    ├── references/       # 参考文档
    └── assets/           # 模板、字体、图标等

2.1 YAML Frontmatter

</> YAML
---
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 的指令应该让模型按照最自然、最可预测的方式工作。避免引入反直觉的流程或术语。

层级化信息组织:

</> MARKDOWN
## 主流程(必读)
简洁描述核心工作流,3-5步以内。

## 边界情况处理
只有遇到特殊输入时才需要阅读本节。

## 参考文档索引
- references/aws.md — AWS 部署配置
- references/gcp.md — GCP 部署配置
仅在涉及对应云平台时读取。

多域场景的组织方式:当 Skill 支持多个框架或平台时,把通用流程放在 SKILL.md,把平台细节放在 references/ 子文件里,按需加载。这样既保持主文件精简,又不损失能力。

2.3 何时需要脚本

以下情况考虑把逻辑封装成脚本:

  • 确定性操作:格式转换、文件合并、数据提取——这些有明确的正确答案,脚本比自然语言描述更可靠。
  • 重复性操作:需要对大量输入执行相同操作。
  • 外部依赖:需要调用特定的 CLI 工具或 Python 库。

脚本放在 scripts/ 目录,在 SKILL.md 中用路径引用:

</> MARKDOWN
执行以下命令完成转换:
```bash
python /mnt/skills/my-skill/scripts/convert.py --input $INPUT --output $OUTPUT
</> PLAINTEXT

---

## 三、优化循环:从草稿到精品的迭代路径

Skill 优化遵循一个核心循环:

草稿 → 测试用例 → 执行 → 评估(定性+定量)→ 修改 → 重复

</> PLAINTEXT

### 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 环境中,由于没有子代理,测试是串行的:

  1. 读取 SKILL.md
  2. 按照 Skill 指令,亲自完成每个测试 prompt
  3. 记录输出,对照期望结果

这个过程有一个微妙的注意点:你既是 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 手动优化描述的技巧

技巧一:明确列出触发场景

</> PLAINTEXT
# Before(弱)
description: 用于处理 DOCX 文件的 Skill。

# After(强)
description: >
  当用户需要创建、读取、编辑或操作 Word 文档(.docx 文件)时使用。
  触发场景包括:提到"Word文档"、".docx"、需要带目录/页眉/页码等格式的专业文档、
  从.docx提取内容、在文档中插入图片、进行查找替换。
  即便用户只说"写一份报告"、"写一个备忘录",如果明显是需要Word格式的,也应触发。

技巧二:加入"即便…也要触发"的表述

这种句式直接对抗 Claude 的低触发倾向:

</> PLAINTEXT
即便用户没有明确提到"skill"或具体工具名,只要涉及X类型的复杂任务,也必须触发本Skill。

技巧三:用负面案例划清边界

防止过度触发:

</> PLAINTEXT
注意:如果任务是简单的文本问答或基础代码演示(少于20行),不需要触发本Skill。

技巧四:使用同义词和不同措辞

不同用户描述同一需求的方式差异很大:

</> PLAINTEXT
触发词:制作PPT / 做幻灯片 / 写演讲稿 / presentation / deck / 讲稿 / 课件

4.3 自动化描述优化(Claude Code / Cowork 环境)

在支持 claude -p 的环境中,可以使用 scripts/run_loop.py 进行自动化优化:

</> BASH
python -m scripts.run_loop \
  --eval-set trigger-eval.json \
  --skill-path ./my-skill \
  --model claude-sonnet-4-20250514 \
  --max-iterations 5 \
  --verbose

这个脚本会:

  1. 把评估集分成 60% 训练集 / 40% 测试集
  2. 对当前描述运行评估(每个 query 执行 3 次,取平均触发率)
  3. 调用 Claude 分析失败案例,提出描述改进方案
  4. 在训练集+测试集上重新评估新描述
  5. 重复 5 轮,选取测试集上得分最高的描述(而非训练集,以避免过拟合)

最终输出 best_description,将其复制回 SKILL.md 的 description 字段。

评估集的设计(trigger-eval.json):

</> JSON
[
  {
    "prompt": "帮我把这个Excel转成Word格式的报告",
    "should_trigger": true
  },
  {
    "prompt": "解释一下Python的装饰器是什么",
    "should_trigger": false
  },
  {
    "prompt": "我需要一份带封面和目录的年度总结文档",
    "should_trigger": true
  }
]
  • should_trigger: true:这类请求应该触发 Skill
  • should_trigger: false:这类请求不应该触发 Skill

评估集中两类各占 50% 左右,确保优化后的描述既不低触发也不过度触发。


五、高级话题:多层架构与大型 Skill 的管理

5.1 当 SKILL.md 超过 500 行

SKILL.md 建议控制在 500 行以内。当内容超过这个限制时,引入第二层层级:

</> MARKDOWN
## 核心流程(必读)
[10-20行的核心步骤描述]

## 详细配置
→ 根据你的需求,读取对应的参考文档:
- AWS 部署:`references/aws.md`
- GCP 部署:`references/gcp.md`
- 高级网络配置:`references/networking.md`

## 常见错误排查
→ 如果遇到报错,读取 `references/troubleshooting.md`

给参考文档加上明确的"何时读取"指引,让模型按需加载,不浪费上下文窗口。

5.2 大型参考文档的组织

如果参考文档超过 300 行,必须在开头添加目录:

</> MARKDOWN
# 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 格式的深度长文。初始版本如下:

初始版本(有问题)

</> YAML
---
name: hugo-writer
description: 用于写 Hugo 文章的 Skill。
---

## 步骤
1. 写 frontmatter
2. 写正文
3. 保存文件

问题:

  • description 太简单,低触发
  • 正文步骤过于抽象,没有格式规范
  • 没有深度文章的具体要求(字数、结构、SEO等)

优化后版本

</> YAML
---
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 工具提供给用户。

</> PLAINTEXT

### 优化效果分析

经过这次优化:

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 系统文档及工程实践整理*

评论

搜索站内内容

输入关键词开始搜索