Agent Skill 从使用到原理
Skill 不是“更长的 Prompt”,也不是又一个模型能力名词。更准确地说,它是一种把可重复工作流、领域知识、脚本和资源打包起来的文件夹规范。Agent 平时只看到这批能力的目录,需要时再展开细节。
0. 文章地图
这篇按“用法 → 结构 → 原理”排:
| # | 问题 | 回答 |
|---|---|---|
| 1 | Skill 是什么 | 一个带入口说明的能力文件夹 |
| 2 | 怎么使用 | 可以显式调用,也可以由 Agent 自动选择 |
| 3 | 放在哪里 | 不同宿主有不同扫描路径 |
| 4 | 为什么能省上下文 | 靠渐进披露:先索引,再展开 |
| 5 | 和 Agent Loop 什么关系 | 它是运行时上下文,不是训练参数 |
| 6 | 和 MCP / Subagent / Tool 什么关系 | 它负责流程,不负责替代工具和执行隔离 |
| 7 | 怎么写 | 触发条件、执行路径、自由度要分清 |
| 8 | 风险在哪里 | Skill 能带指令和代码,所以必须审查来源 |
1. Skill 是什么
我现在更愿意把 Skill 理解成 Agent 的能力包。
它的最小形态不是一个 API,也不是一个提示词片段,而是一个目录。目录里必须有一个 SKILL.md,这个文件负责两件事:
- 告诉 Agent:这个 Skill 叫什么,什么时候该用。
- 告诉 Agent:一旦决定使用,接下来应该怎么做。
旁边还可以放 scripts/、references/、assets/。这几个目录不是强制的,但它们决定了 Skill 和普通 Prompt 的差异:Prompt 只能写说明,Skill 可以连同脚本、模板、参考资料一起交给 Agent。
一个典型结构长这样:
my-skill/
├── SKILL.md
├── scripts/
├── references/
└── assets/
其中最关键的是 SKILL.md frontmatter 里的 description。它不是写给人看的简介,而是写给 Agent 做路由判断的触发条件。
错误写法:
description: 用于分析营销数据
更好的写法:
description: 当用户提供 CSV 格式的营销活动数据,并要求分析漏斗、ROAS、CPA 或预算分配建议时使用。
前者只说“它是什么”,后者才说“什么时候该用它”。Skill 能不能被正确触发,主要看这里。
2. 怎么使用
从使用者角度看,Skill 有两种入口。
第一种是显式调用。比如在支持 Skill 的环境里,用命令、选择器或斜杠命令直接点名一个 Skill。Claude Code 里常见的形态是 /skill-name,Codex 里则有自己的命令和选择器入口。
第二种是自动触发。Agent 会先看到所有可用 Skill 的 name 和 description,再根据当前任务判断是否需要加载某个 Skill。用户并不一定要说“使用某某 Skill”,只要任务语义匹配,它就可能被激活。
这也是为什么 description 要写成触发条件,而不是产品介绍。
3. 目录结构与加载位置
Skill 的目录格式在走向统一,但不同宿主的“去哪找 Skill”仍然不一样。
在 Codex 体系里,仓库级 Skill 通常放在 .agents/skills。Codex 会从当前工作目录向上扫描,直到 repo root。除此之外,还有用户级、管理员级和系统级位置。
在 Claude Code 体系里,常见路径是:
- 个人 Skill:
~/.claude/skills/<skill-name>/SKILL.md - 项目 Skill:
.claude/skills/<skill-name>/SKILL.md - 插件 Skill:
<plugin>/skills/<skill-name>/SKILL.md
这件事有个实际影响:Skill 不是只属于“全局助手”的东西。它可以跟着项目走,也可以跟着团队工作流走。一个 repo 可以把自己的发布流程、测试策略、文档风格写成 Skill,Agent 进入这个项目时自然获得这部分能力。
4. 为什么要渐进披露
Skill 最重要的设计不是“能放很多文件”,而是 渐进披露。
如果一个 Agent 装了几十个甚至上百个 Skill,每次对话都把所有 SKILL.md 全文塞进上下文,窗口会很快被吃光。Skill 的做法是三层加载:
| 层级 | 加载内容 | 何时加载 | 作用 |
|---|---|---|---|
| L1 | name + description | 会话开始或能力索引阶段 | 让 Agent 知道有哪些能力 |
| L2 | 完整 SKILL.md | 判断某个 Skill 相关时 | 读取具体执行说明 |
| L3 | scripts/、references/、assets/ | 执行过程中按需读取 | 获取脚本、模板、长文档、素材 |
这个结构解决的是上下文预算问题。
description 是索引,SKILL.md 是操作手册,references/ 和 scripts/ 是仓库。Agent 先看索引,确认相关后再打开手册,真正执行时才去翻仓库里的细节。
这也是 Skill 和“把一大段 Prompt 粘进去”的本质区别:Prompt 是一次性注入,Skill 是按需展开。
5. 它和 Agent Loop 的关系
要理解 Skill 的位置,需要先看 Agent Loop。
一个典型 Agent 回合大致是:
- 系统把用户输入、项目说明、权限边界、可用工具、可用 Skill 信息组织成模型输入。
- 模型决定直接回答,或者请求调用某个工具。
- Agent 执行工具,把结果追加回上下文。
- 模型继续判断下一步,直到任务完成。
Skill 进入的是第 1 步和后续执行过程。它不是训练数据,不会改变模型参数;它是在运行时被放进上下文里的工作流说明,以及按需可读取的文件资源。
因此,Skill 更像“给 Agent 临时装上的操作规程”,不是“把模型永久训练成某个专家”。
6. 它和 MCP / Subagent / Tool 的边界
这一层很容易混在一起,但它们其实解决的是不同问题。
| 概念 | 解决什么 | 形态 |
|---|---|---|
| Tool | 单次原子能力 | API / 函数 |
| MCP | 外部数据和服务接入 | 长连接协议 |
| Skill | 工作流 + 领域知识 | 文件夹 |
| Subagent | 隔离的执行上下文 | 独立 Agent 实例 |
我的理解是:
- Tool 和 MCP 是“能力供给”
- Skill 是“怎么做事”
- Subagent 是“把某段活单独派出去做”
所以 Skill 不该被写成一个个工具清单。真正合理的写法是:Skill 定义流程、边界和输出标准,工具和数据源交给它调用。
举个简单例子:
- Skill 负责定义客户反馈分类规则、洞察输出格式
- MCP 负责接入原始访谈、问卷或文档系统
- Subagent 负责并行分析不同数据集
- Tool 负责文件读写、代码执行这类原子动作
这也是为什么 Skill 的 scripts/ 不是 Tool 定义。它们只是这个工作流里按需调用的小工具。
7. 写 Skill 时,我会看的几个约束
我会按这几条判断一个 Skill 写得好不好:
description写的是触发条件,不是宣传文案。SKILL.md只放执行路径,长知识拆到references/。- 确定性、重复性、容易出错的机械步骤交给
scripts/。 - 目录结构保持浅,不要让 Agent 层层找文件。
- 对外部系统、密钥、部署、删除操作保持显式确认。
再往前一步,可以把 Skill 的自由度分成三档:
- 高自由度:目标明确,但方法开放,适合创意类任务。
- 中自由度:有推荐模式,但允许偏离,适合半结构化任务。
- 低自由度:步骤固定,必须按流程跑,适合生产型工作流。
我更喜欢把 Skill 写成一份“小而准的操作手册”:
- 入口清楚
- 步骤稳定
- 必要资料都在旁边
- 该固定的地方固定,别让 Agent 自由发挥到跑偏
8. 安全边界
Skill 的能力强,风险也来自同一个地方:它可以带指令、文件和代码。
一个不可信的 Skill 可能在说明里诱导 Agent 做错误操作,也可能在脚本里连接外部网络、读取敏感文件或执行不该执行的命令。即使宿主有扫描和权限控制,也不能替代人工审查。
我会把 Skill 当成“可执行的项目依赖”来看待,而不是普通 Markdown:
- 先读
SKILL.md。 - 再看
scripts/里有没有实际代码。 - 检查是否有网络访问、文件写入、密钥读取、部署发布等行为。
- 对高风险 Skill 保持人工确认,不让它静默执行。
9. 结论
Agent Skill 的关键价值不是“多写了一份提示词”,而是把可复用经验变成一个稳定的、可发现的、可分发的能力包。
它同时服务三件事:
- 对用户:少重复解释同一套流程。
- 对 Agent:先看到能力索引,再按需加载细节。
- 对组织:把团队规范、业务流程、模板和脚本沉淀成文件资产。
所以我对 Skill 的一句话总结是:
Skill 是 Agent 时代的工作流包。它把“知道怎么做”从一次性对话里拿出来,放进一个可复用、可审查、可迭代的目录里。
如果再压缩一点,我会说它做了三件事:
- 把经验从口头提示变成文件资产。
- 把上下文从一次性注入变成渐进加载。
- 把工作流从临场发挥变成可重复执行。
参考
- OpenAI: Build skills
- OpenAI: Unrolling the Codex agent loop
- OpenAI Help Center: Skills in ChatGPT
- Anthropic: Equipping agents for the real world with Agent Skills
- Claude Code Docs: Extend Claude with skills
- Agent Skills: Overview
- Agent Skills: Specification