什么是Agent Skills?
当前,我们在几乎任何常用的Agent中都会看到一个名词Skills,那么Skills到底是什么东西呢?最近Agent Skills这个概念非常的热门,它是由Anthropic推出的用于提升智能体工程化水平的技术。
传统方法的问题
在Agent Skills出现之前,Agent的能力通常是通过以下方式进行实现:
- 把每种工具如何使用以及使用的示例等放入Prompt提供给LLM,并且会把这些工具包装为Tool(通过Function call或者MCP方式)提供给LLM
- 封装成工具调用逻辑
- 固化在workflow流程中进行实现
这几种传统方式在简单的场景下完全可行,并且效果不错。但当任务复杂度(或Agent复杂度)提升时就会暴露出明显的问题:
- 由于通过MCP和Function call需要占用大量的上下文,这将导致prompt很大,token的消耗成本也会变高。并且由于注意力机制固有的缺陷,使上下文过于庞大的时候,LLM的表现会变差。
- 能力难以被复用,每次开发一个Agent就需要重新开发一次能力
- 执行逻辑分散,系统维护难度高
- 而且并非所有能力都会被当前任务所使用,这些不需要使用的能力所占据的上下文是没有必要的。
本质上,这是问题都是因为传统方法缺少了一种统一的能力抽象方式。并且也正是因为MCP的流行,导致了上下文的暴涨,每次集成几个MCP的时候,就会同时引入一堆工具,尤其是多个MCP中都有相似的工具时,更加剧了Agent不知道该选择哪一个工具的问题。
Agent Skills
Agent Skills就是为了解决传统方法产生的问题,对Agent的能力进行的统一抽象。具体来说,它就是把一些已经被验证有效的能力运行方式抽象出来并进行封装,让Agent在需要该能力的时候直接使用的技术。
如果用我们日常生活做菜来作比喻,传统方法就像食材和调料全部都给出了,然后要做一道菜时自己从眼花缭乱的材料中进行选择。而Skills就像是菜谱,当想要做某一道菜时,就可以根据菜谱精确的选择材料。
Skills的核心思想很简单,它就是把已经验证有效的做事方式抽象成独立能力模块,让 Agent在需要时自动加载和执行。而这些能力模块有着比较明显的优势:
-
他们能够被重复使用
-
他们能够被自由组合
-
他们能够被按需加载
-
他们能够方便地持续维护
Agent Skills的组成
Agent Skill 本质就是一个标准化的目录结构,也就是说是一个文件夹目录,Skill的所有内容都是围绕着在这个文件夹目录中新增文件和修改内容来展开的。
下面是Skill的结构:
my-skill/ # 技能名称
├── SKILL.md # 必需:指令 + 元数据
├── scripts/ # 可选:可执行代码
├── references/ # 可选:文档资料
└── assets/ # 可选:模板、资源
这是我在codex中安装的一个Skill的结构:
一个完整的Skill,至少包含一个核心文件Skill.md,其余文件均是围绕着该核心文件展开的。这样的设计是为了让Agent在运行时,可以分层、有选择地加载信息,而不是一次性把所有内容都塞进上下文。
SKILL.md介绍
刚才我们提到一个完整的Skill,至少包含一个核心文件SKILL.md。这个文件的编写决定了Agent能否正确的理解并且使用一个Skill。SKILL.md由两个部分组成,其中一部分是:Frontmatter(元数据),另一部分是Instruction(指令正文)。
上图展示的名称为doc的Skill中SKILL.md大致如下:
---
name: "doc"
description: "Use when the task involves reading, creating, or editing `.docx` documents, especially when formatting or layout fidelity matters; prefer `python-docx` plus the bundled `scripts/render_docx.py` for visual checks."
---
# DOCX Skill
## When to use
- Read or review DOCX content where layout matters (tables, diagrams, pagination).
- Create or edit DOCX files with professional formatting.
- Validate visual layout before delivery.
## Workflow
1. Prefer visual review (layout, tables, diagrams).
- If `soffice` and `pdftoppm` are available, convert DOCX -> PDF -> PNGs.
- Or use `scripts/render_docx.py` (requires `pdf2image` and Poppler).
- If these tools are missing, install them or ask the user to review rendered pages locally.
2. Use `python-docx` for edits and structured creation (headings, styles, tables, lists).
3. After each meaningful change, re-render and inspect the pages.
4. If visual review is not possible, extract text with `python-docx` as a fallback and call out layout risk.
5. Keep intermediate outputs organized and clean up after final approval.
......
可以看到最上面被---包围的部分就是元数据,Agent在加载Skill之前就只能看到这一部分数据。剩下的数据都是指令正文,只有Skill被加载后,Agent才能看到这一部分。
元数据(Frontmatter)
元数据的格式是有明确的规范的,这一段是必须卸载文件顶部,并且需要写以下两个属性:
- name:Skill的唯一标识(agent通过它来识别技能)
- description:简要说明该技能的作用,以及该技能在什么情况下应该被使用
---
name: "doc"
description: "Use when the task involves reading, creating, or editing `.docx` documents, especially when formatting or layout fidelity matters; prefer `python-docx` plus the bundled `scripts/render_docx.py` for visual checks."
---
如该片段说明了这个Skill的唯一标识是doc,还说明了:当任务涉及到读取、创建或编辑.docx文档时,尤其是格式或者布局保真度很重要时调用,并且还说明了可以使用scripts中的脚本进行检查。
这种设计的核心目标就是:在不确定技能是否需要调用的时候,最大限度减少上下文的大小。并且description能够更好地使大模型判断何时需要该技能,当需要时再进行加载。正因如此,元数据可以说是Agent Skills能够真正工程化运作的最核心的机制。
它把能力识别和实际执行这两件事情进行解耦,使Skill再也不是一次性的Prompt,而是一个可以被检索、可以被匹配、可以延迟加载的能力单元。
指令正文(Instruction)
在---包围的内容之后的部分,就是完整的指令正文。元数据解决的是要不要使用这个Skill以及说明该Skill作用的问题,指令正文解决的是该Skill具体该如何使用的问题。
# DOCX Skill
## When to use
- Read or review DOCX content where layout matters (tables, diagrams, pagination).
- Create or edit DOCX files with professional formatting.
- Validate visual layout before delivery.
## Workflow
1. Prefer visual review (layout, tables, diagrams).
- If `soffice` and `pdftoppm` are available, convert DOCX -> PDF -> PNGs.
- Or use `scripts/render_docx.py` (requires `pdf2image` and Poppler).
- If these tools are missing, install them or ask the user to review rendered pages locally.
2. Use `python-docx` for edits and structured creation (headings, styles, tables, lists).
3. After each meaningful change, re-render and inspect the pages.
4. If visual review is not possible, extract text with `python-docx` as a fallback and call out layout risk.
5. Keep intermediate outputs organized and clean up after final approval.
......
这一部分是当Agent确定当前任务需要该Skill后,才会加载进上下文的内容。这一部分主要承担着以下几种职责:
- 明确使用时机和适用边界,防止 Skill 被误用
- 将复杂任务拆解成稳定、可复现的执行步骤
- 显式约束 Agent 的行为方式,减少自由发挥和幻觉
- 为后续的Script、Reference提供清晰的使用说明和调用指引
因此,Instruction 本质上就是一份面向专业领域、特定功能的高质量 Prompt。但需要注意的一点是:诸如详细示例、字段定义、复杂规则等长上下文的内容,官方并不推荐全部堆在SKILL.md 中,而是更适合通过reference进行按需补充、按需加载,再配合通过Script来承载可执行的逻辑。
References
在我们一开始展示的文件夹结构中有一个References文件夹,它是一个可选但很重要的部分,它解决的问题是:当Skill本身比较复杂时,为Agent提供必要的补充信息,其中的数据也不会在Skill发现阶段加载,它也是按需加载的,并且只有指令正文中明确指示或执行过程需要查询某些细节时,Agent才会主动去读取其中的文件。
因此,References天然的更加适合存放一些 传递参数的详细示例、字段和结构定义以及复杂的规则说明。换句话说,指令正文负责告诉Agent这个Skill应该如何做,而References负责在Agent需要的时候补充Skill的细节,这种拆分方式,使得Skill执行时具备渐进式披露的能力,保证了Skill执行的准确性,又减少了无用的信息占用上下文。
Script
Script 同样也是一个可选组件,用来承载不适合交给模型自由生成的确定性逻辑。里面一般来说放的都是Python脚本。例如我作为示例的doc skill中有着render_docx.py脚本。
在执行流程上,Agent 会先依据 SKILL.md 中的指令进行决策,再在合适的步骤中调用Script来完成具体操作。Script在本质上就是一个工具执行脚本,用来处理一些特定的任务,主要的目的就是让大模型不需要考虑具体的实现细节,而只需要调用执行、获取结果即可。