AI Agent 技能(Skill)实战解析

Skill(技能) 是现代 AI Agent(如 Claude、Codex 等)增强能力的主流方式:把某一类任务的「操作手册 + 工具 + 参考资料」打包成一个独立单元,Agent 在需要时自动加载、按章执行。它解决了「靠 prompt 硬塞所有规则」带来的臃肿、不可复用、上下文爆炸问题。

本文从一个真实的 Skill(技术写作技能)切入,讲透 Skill 是什么、三层加载机制怎么工作、SKILL.md 怎么写,以及设计一个好 Skill 的核心原则。如果你正在用 Claude Code / Codex / Cursor 等 Agent 工具,这篇能帮你从「只会写 prompt」升级到「会造工具」。

本文脉络:
一 为什么 prompt 不够用:Agent 增强方式的演进
二 Skill 是什么:三层加载机制
三 SKILL.md 的结构:frontmatter + 正文
四 渐进式披露:Skill 设计的第一原则
五 实战案例:真实技能拆解 + 完整示例 + 怎么使用
六 怎么写好一个 Skill:六个关键原则
七 Skill vs Prompt vs 工具调用:什么时候用哪个
八 常见误区与陷阱
九 速查表

一、为什么 prompt 不够用:Agent 增强方式的演进

先用一个真实的痛点开场。

假设你让 Agent 帮你写技术博客。最朴素的写法是把所有要求塞进 prompt:

你是技术博客写作助手。请遵守:
1. 用中文编号章节(一、二、三)
2. front matter 要有 title/date/categories/tags
3. 开头用引用块,加「本文脉络」目录
4. 要有 ASCII 图、对比表格、代码示例
5. 结尾要有「常见问题」表
6. 代码注释用中文
7. 不要有 AI 味(避免「首先其次最后」「综上所述」)
8. 段落控制在 3-5 行
9. ……还有 20 条规则

这种写法有三个致命问题:

① 臃肿:规则越多,prompt 越长,每次对话都要带上,浪费 token
② 不可复用:换一个项目、换一个 Agent,这套规则得重新抄一遍
③ 上下文爆炸:prompt 里塞太多规则,会挤占「真正任务」的上下文,
Agent 记不住、还会互相冲突
④ 难维护:规则一多就乱,改一条怕影响别的,没有结构

Agent 增强方式其实经历了几个阶段的演进:

阶段一:单次 prompt
把要求写在对话里 → 用完即弃,下次重来

阶段二:系统 prompt / 角色设定
把通用规则放到 system prompt → 全局生效,但仍然全量加载

阶段三:自定义指令(Custom Instructions)
用户级/项目级的固定指令 → 比 system prompt 灵活,但仍是大段文本

阶段四:Skill(技能) ← 当前主流
把一类任务打包成独立单元,按需加载 → 模块化、可复用、渐进式披露

Skill 的核心突破在于:它不再是「一大段永远在场的规则」,而是「一份按需加载的操作手册」——Agent 平时只看到它的名字和简介(几十个字),真正要用时才把完整内容读进上下文。


二、Skill 是什么:三层加载机制

Skill 不是一个 prompt 片段,它是一个目录,里面装着 SKILL.md(主文件)和可选的参考资料、脚本、模板。Agent 通过「三层加载」来用它:

┌──────────────────────────────────────────────────────────┐
│ 第 1 层:元数据(Metadata)—— 永远在场 │
│ │
│ 只有 name + description,几十个字 │
│ Agent 每次对话都能看到所有 Skill 的元数据 │
│ 作用:判断「这个任务要不要触发某个 Skill」 │
│ │
│ 例:name: tech-writer │
│ description: 用于撰写技术博客和公众号文章... │
├──────────────────────────────────────────────────────────┤
│ 第 2 层:SKILL.md 正文 —— 触发后才加载 │
│ │
│ Skill 被触发后,Agent 才把 SKILL.md 完整读进上下文 │
│ 包含:工作流程、规则、示例、产出要求 │
│ 作用:告诉 Agent「这个任务具体怎么做」 │
│ │
│ 目标:控制在 500 行以内 │
├──────────────────────────────────────────────────────────┤
│ 第 3 层:捆绑文件 —— 按需读取 │
│ │
│ references/(参考资料)、scripts/(脚本)、assets/(模板)│
│ Agent 只在 SKILL.md 指示「需要时」才去读 │
│ 作用:承载大段细节,避免 SKILL.md 膨胀 │
│ │
│ 原则上无大小限制 │
└──────────────────────────────────────────────────────────┘

为什么要分三层:如果把所有内容都堆在第 1 层(永远在场),上下文会爆;如果都塞在第 2 层,SKILL.md 会臃肿到 Agent 抓不住重点。分层的好处是——平时极轻,用到才重

类比:Skill 就像一本操作手册放在工具箱里
第 1 层:手册封面上的书名和一句简介(你扫一眼就知道有没有用)
第 2 层:翻开手册的正文(你需要时才读)
第 3 层:附录、参考资料、配套工具(用到具体步骤时才翻)

三、SKILL.md 的结构:frontmatter + 正文

每个 Skill 是一个目录,里面必须有 SKILL.md

my-skill/
├── SKILL.md ← 必须,主文件
└── (可选)
├── references/ ← 参考资料(Agent 按需读)
├── scripts/ ← 辅助脚本(Agent 可调用)
└── assets/ ← 模板、样例

Frontmatter(元数据)

---
name: my-skill # 小写 kebab-case,必须和目录名一致
description: <触发条件 + 做什么> # 最关键的触发信号
---

description整个 Skill 最重要的字段——它决定了 Agent 什么时候会触发这个 Skill。

❌ 写得太弱(Agent 不会触发):
description: 如何写技术文章

✅ 写得有触发力(明确场景 + 略带主动):
description: 用于撰写和改写技术写作——既覆盖微信公众号文章,
也覆盖 Hexo 博客文章。当用户提到「公众号文章」「博客文章」
「写篇技术文」「把这个改写成公众号/博客风格」、或任何把技术主题
写成面向开发者读者的文章时,使用本技能。

description 的写法要点

  • 写清楚「做什么」和「什么时候用
  • 列举会触发它的用户措辞(”公众号文章””写篇技术文”)
  • 略带主动——模型倾向于少触发 Skill,描述要稍微”推”它一把

正文(Markdown)

正文用自然语言写工作流程、规则、示例。结构上一般包含:

- 这个 Skill 是干什么的(一句话定位)
- 触发后该怎么做(分步骤的工作流程)
- 关键规则(用什么形式输出、避免什么)
- 示例(比规则更管用)
- 产出物清单(交付什么)

关键认知:正文是写给 Agent 读的,但用的是自然语言——不是代码,不是 YAML,就是结构化的 Markdown。Agent 能理解自然语言指令,所以你写得像「给同事的操作指南」就行。


四、渐进式披露:Skill 设计的第一原则

这是设计 Skill 最重要的一条原则:不要把所有细节都塞进 SKILL.md

反例(一次性全塞):
SKILL.md 里写了 2000 行,涵盖 AWS/GCP/Azure/阿里云 四种部署的完整细节
→ Agent 每次触发都要读 2000 行,其中 3/4 和当前任务无关,浪费上下文

正例(渐进式披露):
SKILL.md 只写通用的工作流程和「选型决策」(200 行)
references/ 下分 aws.md / gcp.md / azure.md / aliyun.md

SKILL.md 里写:
"如果目标是 AWS,在读后续步骤前,先读 references/aws.md"

→ Agent 触发时只读 200 行,确认是 AWS 后才读 aws.md,上下文干净
渐进式披露的三层结构:

cloud-deploy/
├── SKILL.md ← 工作流程 + 选型(轻量,~200 行)
└── references/
├── aws.md ← AWS 专属细节(按需读)
├── gcp.md
├── azure.md
└── aliyun.md

为什么有效

① 平时省上下文:不触发的 Skill 只占元数据那几十个字
② 触发后省上下文:SKILL.md 只放「共性」,细节按需加载
③ 可扩展:加一种云,只需加一个 reference 文件,不动 SKILL.md

判断该放哪一层的口诀

  • 所有任务都用得到 → SKILL.md 正文
  • 只有特定子场景用得到 → references/ 下单独成文

五、实战案例:真实技能拆解 + 完整示例 + 怎么使用

讲了这么多原则,来看一个真实的 Skill。这是一个用于「技术写作」的技能,覆盖博客文和公众号文两种模式。

目录结构

tech-writer/
└── SKILL.md ← 单文件,暂未拆 references

Frontmatter

---
name: tech-writer
description: 用于撰写和改写技术写作——既覆盖微信公众号/知乎/掘金等
自媒体文章,也覆盖本项目(tiny-blog,Hexo)的技术博客文章。
当用户提到「公众号文章」「博客文章」「写篇技术文」「把这个改写成
公众号/博客风格」、或任何把技术主题写成面向开发者读者的文章时,
使用本技能。本技能会根据目标载体在「公众号模式」和「博客模式」
间切换。
---

注意 description 里干了两件事:① 列举触发措辞(公众号/博客/技术文/改写)② 明确告知有「双模式」切换。这让 Agent 既知道何时触发,又对触发后要做什么有预期。

正文的核心设计

这个 Skill 正文最有特色的地方是**「双模式」作为骨架**:

# 技术写作

把技术内容写成适合阅读和传播的文章。本技能覆盖两种载体,
写作前必须先判断走哪种模式:

| 模式 | 载体 | 读者状态 | 核心目标 |
|------|------|---------|---------|
| 公众号模式 | 微信公众号、知乎、掘金 | 被动刷信息流、随时划走 | 抓住注意力,让人读完 |
| 博客模式 | Hexo 博客(source/_posts/)| 主动检索、带着目的来读 | 讲完整、讲准确 |

第一步:判断走哪种模式(动笔前必做)
如果用户已明说(「写篇公众号文」「加篇博客」),按说的来。
否则根据线索判断,拿不准就直接问一句:
「公众号」「传播」「转发」→ 公众号模式
「博客」「写进 _posts」「长期沉淀」→ 博客模式

这个设计体现了 Skill 的一个强大之处:它能让 Agent 在不同场景下按不同规则工作,而不用写两个 Skill。模式判断逻辑写在正文里,Agent 读到后自然会先判断再执行。

「去 AI 味」作为共通心法

这个 Skill 还内嵌了一个跨模式的通用原则——「去 AI 味」。它没有抽象地说「请写得自然」,而是给了对照示例

❌ AI 味:「限流不仅保护了下游,更提升了系统稳定性,还守护了用户体验。」
✅ 人味:「说白了,限流就是用『拒绝一部分请求』换『核心服务别挂』。」
❌ AI 味:「在微服务架构日益普及的今天,稳定性成为了重要课题。」
✅ 人味:「上周我们一个下游服务挂了 3 分钟,上游线程池被打满,差点雪崩。」

为什么对照示例比规则管用:模型从具体例子中学到的风格,远比从「请写得自然些」这种抽象指令中学到的多。这是 Skill 编写的一个核心技巧——examples beat rules(示例胜过规则)

5.4 一个完整的 Skill 示例

上面是片段,这里给一个完整、自包含、可直接复制使用的 SKILL.md——就是贯穿本文的 tech-writer 的精简版。它把双模式、去 AI 味、对照示例都浓缩在一个文件里。

目录结构

tech-writer/
└── SKILL.md ← 单文件(规则不多时无需拆 references)

SKILL.md 完整内容

---
name: tech-writer
description: 用于撰写和改写技术写作——既覆盖微信公众号等自媒体文章,
也覆盖技术博客文章。当用户提到「公众号文章」「博客文章」「写篇技术文」
「把这个改写成公众号/博客风格」、或任何把技术主题写成面向开发者读者的
文章时使用。本技能会根据目标载体在「公众号模式」和「博客模式」间切换。
---

# 技术写作

把技术内容写成适合阅读和传播的文章。本技能覆盖两种载体,写作前必须先判断
走哪种模式:

| 模式 | 载体 | 读者状态 | 核心目标 |
|------|------|---------|---------|
| 公众号模式 | 微信公众号、知乎、掘金 | 被动刷信息流、随时划走 | 抓住注意力,让人读完 |
| 博客模式 | 技术博客(source/_posts/)| 主动检索、带着目的来读 | 讲完整、讲准确 |

## 第一步:判断走哪种模式(动笔前必做)

用户已明说(「写篇公众号文」「加篇博客」)按说的来。否则根据线索判断,
拿不准就直接问一句:
「公众号」「传播」「转发」→ 公众号模式
「博客」「写进 _posts」「长期沉淀」→ 博客模式

## 共通心法:去 AI 味(每篇必查)

AI 味的本质是「像在交作业,不像在跟人说话」。六大典型症状及改法:

排比收尾:
❌ 「限流不仅保护了下游,更提升了稳定性,还守护了体验。」
✅ 「说白了,限流就是用『拒绝一部分请求』换『核心服务别挂』。」

空话开场:
❌ 「在微服务架构日益普及的今天,稳定性成为了重要课题。」
✅ 「上周我们一个下游服务挂了 3 分钟,上游线程池被打满,差点雪崩。」

去味心法:写之前先想「这话我会在群里跟同事怎么说」,用口语节奏写,
再书面化润色。

## 公众号模式

读者在手机刷信息流,节奏必须快:
- 标题先行:先定 2-3 个候选标题,和用户对齐再写正文
- 开头钩子:用真实场景/痛点/事故切入,不要「今天我们聊聊 XX」
- 段落控制在 3-5 行(手机一屏),关键结论单独成行加粗
- 代码块不超过 15 行,长代码裁剪成关键片段

## 博客模式

读者主动来查资料,严谨、完整、可检索比花哨重要:
- front matter:title / date / categories / tags 齐全
- 引用块开头 + 「本文脉络」目录 + 编号章节
- 多用 ASCII 图、对比表格、代码示例
- 结尾给「常见问题 / 速查表」这类收藏点

## 产出物

1. 2-3 个候选标题(标注推荐项)
2. 完整正文(markdown,已按对应模式排版)

这个示例体现了什么

  • frontmatter 的 description 列举了触发措辞(「公众号文章」「博客文章」),并预告「双模式」
  • 正文用**「双模式」作为骨架**,Agent 读到后会自动先判断模式再执行
  • 「去 AI 味」用对照示例呈现(❌ vs ✅),而不是抽象规则——examples beat rules
  • 共通常识放前面,两种模式各自的规则分块——结构清晰,Agent 能按场景取用

5.5 Skill 怎么使用

写好 Skill 只是第一步,还得知道怎么让它被 Agent 用上。流程分三步:放置 → 触发 → 执行。

第一步:放到正确的目录

不同 Agent 工具的 Skill 发现路径不同,以 Codex / Claude Code 类工具为例,Skill 按作用域放在约定目录下:

作用域优先级(从高到低):

<项目>/.codex/skills/<name>/SKILL.md ← 项目级,仅当前仓库生效
<项目>/.agents/skills/<name>/SKILL.md ← 项目级(跨工具通用位置)
~/.codex/skills/<name>/SKILL.md ← 用户级,所有项目生效
~/.agents/skills/<name>/SKILL.md ← 用户级(跨工具通用位置)
选哪个?
- 只在某个项目里用(如本项目专用的 tech-writer) → 项目级
- 所有项目都想用(如通用的代码审查技能) → 用户级

第二步:触发 Skill

Skill 有两种触发方式:

① 自动触发(主要方式)
Agent 每次对话都能看到所有 Skill 的元数据(name + description)。
当用户的请求匹配某个 Skill 的 description 时,Agent 自动加载它。

例:用户说「帮我写篇公众号文章」
→ Agent 看到 tech-writer 的 description 里有「公众号文章」
→ 自动触发,加载 SKILL.md 正文

② 强制触发(调试/兜底)
用斜杠命令直接指定,不依赖 description 匹配:
/skill tech-writer 把熔断文改成公众号风格

适用:description 写得不够、Agent 没自动触发时,手动调起

第三步:Agent 执行流程

Skill 触发后,Agent 内部的完整执行链路:

用户:「把熔断文改写成公众号风格」

Agent 扫描所有 Skill 的 description
↓ 命中 tech-writer
加载 SKILL.md 正文(第 2 层)
↓ 读到「第一步:判断走哪种模式」
判断:用户说「公众号风格」→ 公众号模式
↓ 按「公众号模式」的规则写作
调用工具:读取熔断文(Read)→ 写入新文件(Write) ← 工具调用
↓ 写完初稿,套用「去 AI 味」清单自查
按需对照「去 AI 味」的对照示例修正表达 ← 共通心法(按需)

输出:公众号风格的文章(交付给用户)

注意这条链路里三层加载 + 工具调用是协同的

  • 第 1 层(description)让它知道「该触发」
  • 第 2 层(SKILL.md)告诉它「怎么做」(先判模式,再按规则写)
  • 共通心法(去 AI 味)在「需要修正表达」时才套用
  • 工具调用(Read/Write)让它能「真正读写文件」

验证 Skill 是否生效

写完 Skill 后,用这三个 prompt 测一遍:

1. 自动触发测试:说一句能匹配 description 的话,看 Agent 有没有自动用上
(比如直接说「帮我写篇技术文」,而不是「用 tech-writer 技能」)

2. 强制触发测试:用 /skill tech-writer 显式调起,确认 Skill 内容能正确加载

3. 边界测试:故意说一句模糊的话(如「整理一下这篇文章的排版」),
看 Agent 能否合理判断要不要触发——避免过度触发或漏触发


六、怎么写好一个 Skill:六个关键原则

1. description 要有触发力

模型倾向于少触发 Skill,所以 description 要写清楚场景、列举用户措辞,甚至可以略带「推销」语气。

弱:description: 如何构建仪表盘
强:description: 如何为内部数据构建快速仪表盘。当用户提到仪表盘、
数据可视化、内部指标,或想展示任何公司数据时使用——
即使用户没明说「仪表盘」也要触发。

2. 正文控制在 500 行以内

SKILL.md 太长会导致 Agent 抓不住重点、还会挤占上下文。超过 500 行就该考虑拆分到 references/。

3. 用示例代替规则

模型跟着例子学,比跟着规则学更准。如果 Skill 产出结构化内容,给一个字面示例;如果要用某个工具,给一个调用示例

4. 解释「为什么」,而不只是下命令

弱:必须先 Read 文件再 Edit。
强:先 Read 文件再 Edit——因为 Edit 工具要求 old_string 精确匹配,
不先读就拿不到准确内容,Edit 会失败。

模型理解了原因,在边界情况下能自己做出正确判断,而不是机械执行。

5. 渐进式披露,别一次塞满

共性放 SKILL.md,特定子场景的细节放 references/,按需加载(见第四章)。

6. 写完要测,别交付即结束

Skill 写完后,拿 2-3 个真实 prompt 测一遍:① 看描述能不能触发它 ② 看产出符不符合预期 ③ 看有没有让 Agent 绕弯路。根据测试结果迭代,而不是写完就用。


七、Skill vs Prompt vs 工具调用:什么时候用哪个

这三个概念容易混,其实分工不同:

维度 Prompt(指令) 工具调用(Tool/Function) Skill(技能)
本质 一次性的任务描述 Agent 调用外部能力的接口 打包的「操作手册 + 工具 + 资料」
复用性 用完即弃 可复用,但只是「能力点」 高度复用,是「能力包」
加载方式 每次手动给 注册后可调用 按需自动加载
适合 一次性、临时的任务 需要「执行动作」(查 DB、调 API) 一类反复出现的任务
例子 “帮我把这段代码格式化” 查数据库、发请求、读写文件 技术写作、代码审查、部署流程
三者的关系(不是互斥,是协同):

Skill 里可以包含「该用哪个工具」「怎么用工具」的指导
Prompt 可以触发 Skill,Skill 执行中又会调用工具

例:tech-writer(Skill)被「写篇博客」(Prompt) 触发,
执行中可能调用 Read/Write(工具)来读写文件

选型口诀

  • 一次性、简单 → Prompt
  • 需要执行外部动作 → 工具调用
  • 一类反复出现的复杂任务 → Skill

八、常见误区与陷阱

误区 后果 对策
description 写得太弱 Agent 不触发,Skill 形同虚设 列举触发措辞,略带主动
SKILL.md 太长 Agent 抓不住重点,上下文被挤占 控制在 500 行,细节拆到 references/
全是规则没有示例 Agent 理解偏差,产出不稳定 关键产出给字面示例
只下命令不讲原因 边界情况下 Agent 机械执行出错 解释 why,让 Agent 能自己判断
写完不测就用 触发不稳定、产出跑偏 拿 2-3 个真实 prompt 测,迭代
一个 Skill 想干所有事 职责混乱,触发条件冲突 一个 Skill 聚焦一类任务
目录名和 name 不一致 Agent 加载异常 name 必须 = 目录名(kebab-case)

九、速查表

你可能想问 一句话答案
Skill 是什么? 打包了「操作手册 + 工具 + 参考资料」的独立单元,Agent 按需加载
和 prompt 的区别? Prompt 是一次性指令,Skill 是可复用、模块化、按需加载的能力包
怎么决定何时触发? 看 description——它是最关键的触发信号,要写清场景和用户措辞
三层加载是什么? 元数据(永远在场)→ SKILL.md(触发后加载)→ references(按需读)
最关键的设计原则? 渐进式披露:共性放正文,细节按需加载,别一次塞满
SKILL.md 多长合适? 控制在 500 行以内,超了就拆 references/
怎么让产出稳定? 给对照示例(examples beat rules),不只写规则
什么时候该用 Skill? 一类反复出现的复杂任务(如技术写作、代码审查、部署流程)
有完整示例可参考吗? 见 5.4 的「tech-writer」精简版——双模式骨架 + 去 AI 味对照示例
Skill 写好怎么用? 放到约定目录 → 自动触发(靠 description)或强制触发(/skill)→ Agent 三层加载执行
放项目级还是用户级? 只在某个仓库用 → 项目级;所有项目都用 → 用户级

一句话总结:Skill 的本质,是把「反复出现的任务经验」从 prompt 里抽出来,打包成 Agent 能按需加载的工具——平时极轻,用到才重。写好它的关键不是堆规则,而是:清晰的触发条件 + 渐进式披露的结构 + 能让模型学会的示例