Anthropic's Agent skills
2025年12月18日,anthropic 公司(claude系列大模型,mcp协议提出者)发布一套模型(LLM)标准化技能(skill)规范:Agent skills,受到业界的广泛关注,anthropic的方案还是值得被关注和学习!
先简单回顾一下模型(LLM)在扩展外部能力的发展过程:
• 首先,openAi提出function call模式,通过训练模型让LLM掌握调用工具的方法,这本身是靠LLM的训练具备这样的能力,交互方式是以openAi的专有的json格式,这种方式最大的问题就是各模型厂家的接口私有,针对不同模型进行不同交互协议。
• 其后,anthropic提出MCP协议(模型上下文),核心目的是采用统一协议与不同的LLM进行交互,在业界受到广泛认可,迅速获得各大厂家的支持,是目前最广泛的标准。
• 然后,google又提出多agent协作的协议A2A(多智能体通信协议),虽然没有MCP火爆,在业界也有不小的影响。大家也在讨论MCP和A2A是互补,还是一个会替换掉另一个。
• 再然后,近期多方都在为了解决token极速增加的问题提出多种解决策略。anthropic提出程序化工具调用(Programmatic Tool Calling),通过代码这种中间的媒介,减少token数量,增加调用的确定性;deepseek 的ragflow团队,提出借助graphRAG检索再和模型交互。
• 在到最近,anthropic提出Agent Skills,期望让模型可以具有某些专业的技能。
这些不断的探索,其实都是在解决一个问题:"LLM能更好的使用外部能力",这本身其实是由于LLM的能力缺陷造成的。下边以MCP为例看看LLM在外部交互中有哪些问题?为什么又需要一个Agent skills?
MCP被喻为LLM的typec接口,在一个MCP体系中mcp server主要提供专业的技能,mcp client则是负责编排和模型的交互,他以标准的方式(得到各LLM厂商的支持)和LLM交互,告诉LLM有哪些工具和怎么去使用,LLM分析后返回要使用哪个工具,mcp client根据返回结果去调用对应mcp server(也就是 tool),注意这里调用工具的是mcp client而不是LLM,然后mcp client组织工具返回结果和所有上下文给模型进行处理,得到最后结果。
使用MCP的第一个问题,就是token的爆炸,当你只有两三个工具的时候还好,将这些工具返回给LLM就可以,但在企业场景工具的数量几十个甚至上百个,把这个工具和工具使用说明一股脑的给模型就会造成token的爆炸,不仅造成用户token成本迅速上升,由于过长的上下文也增加LLM的幻觉产生的机率;另一个问题更严重,agent林立、数据和标准割裂,设想一下财务今天需要某个功能那建个agent吧,明天需要某个功能再建另一个agent吧,hr需要一个功能就再建一个agent吧,这和我们之前软件开发中提到的烟囱式建筑很像,造成流程和数据在各自agent很难被同一和管理,增加系统复杂性,也增加维护的成本。
Agent skills的出现并不是完全为了解决上边问题,它是想让模型以更专业的方式工作和使用工具,也起到缓解token的泛滥的问题,因此Agent skills不是替代MCP,但是会改变随意建MCP的开发方式。
MCP 和 Agent Skills都是为了增强模型的外部能力,那他们的区别主要又是什么呢?做个比喻:如果把LLM比作一个厨师,MCP则是让厨师使用各种厨具,而Agent Skills则是一个菜谱,让厨师清楚做一道菜的流程。所以,MCP告诉模型怎么连,Agent skills告诉模型怎么做;MCP让模型变得更强大,Agent Skills让模型变得更专业;MCP是基础层,像usb/type-c接口,而Agent Skills是应用层,像App。
所以Agent skills的出现可能改变建智能体的模式,下边就仔细了解一下吧。
agent skills的最核心理念就是分级揭露(progressive disclosure),开始先加载非常少的元数据,然后LLM根据用户请求决定是否进一步加载,通过文件系统存储skills文件,模型基于文件系统进行分级加载。它核心的目的是让LLM以更专业的方式进行业务处理。
1. 整体架构
• 上图左边部分展示定一个具备agent skills的基本结构,它有三部分组成:最上边是系统提示词,中间是agent skills的列表,下边是mcp的列表。agent skills是新的部分。
• 上图右边部分展示的一个Agent skills在运行态时是怎么获取skills的定义文件,是基于Agent所在机器的文件系统下的skills文件下的不同子文件,一个子文件夹就是一个skill的定义。
• 整个skills的定义是靠文件管理的skills的文件夹或文件,skills下至少包含一个SKILL.md文件。
• agent初始化会加载所有的SKILL.md中的元数据定义(metadata),这个在skills文件中有详细说明。
• 从图中也可以清晰的看到,skills不是要替代mcp,而是并存的形式。mcp负责连接工具,skills负责让模型具有更专业处理流程和方法。
• 这种结构可能带来应用设计的改变:不是给每个业务场景都去建立一个Agent,而是建一个更通用agent 基座,通过skills来组织不同业务流程和工具。这样避免了烟囱林立的agent,业务和技术规范得到统一,代码得到了重用,不同的业务可以skill的方式进行组织,也方便技能的重用和迁移。
SKILL.md是Agent skills中最重要文件,是分级揭露的直接实行者,文件中的内容分为了三个层级,模型根据需要选择加载不同层级的定义
• 在SKILL.md中内容披露分为三个级别,第一级元数据(metadata),第二级技能体(actual body),第三级别附加链接文件(addtional linked files)
• 第一级元数据,上面左图中YAML frontmater,以yaml文件形式组织的name和description,这部分定义技能的的名称和基本能力,这部分初始化时就会被加载,Agent等会将这部分数据放在prompt的system prompt部分。这部分的编写要求准确、简洁,不要使用模糊不定的内容,而且内容不要过长。
• 第二级技能体,上面左图中Markdown部分,这部分是技能的详细使用描述,模型在决定使用某个具体的技能的时候才会加载,这样不用开始就加载所有说明文件,这部分告诉模型该怎么做。
• 第三级扩展链接,上图右边橙色部分的单独markdown文件,通过overview中描述,模型在使用工具的时候根据处理场景不同决定是否要记载。这部分内容不是必须,如果没有则可以不写。注意:模型本身不去调用工具他返回说是否要使用,还是agent自己去调用并将结果返回给LLM
下图是anthropic统计的在使用了skills方式,分级揭露的场景的token消耗
• 系统初始化的时候会将第一级metadata都加载进来,缓存起来,避免每次请求都读取文件系统
• 用户输入请求信息后,系统开始组织prompt,将Agent的系统prompt和所有SKILL.md的metadata定义一起放在system prompt中,然后再将用户的问题组织成user prompt,并将最后的prompt给LLM。
• LLM接收到prompt后,判断是否要使用某个技能,这部分模型是根据预先加载的Agent Skills的meta来判断的,所以写SKILL.md的时候务必要写清晰、明确和简洁。然后将结果返回是否使用某个技能结果
• 系统根据模型返回结果去读取某个具体SKILL.md并把body部分返回给模型,模型再次判断是否技能体的信息就够,如果够了直接执行技能返回结果,不够则返回继续需要额外的扩展信息。
• 扩展能力可以是一个xxx.md的说明,也可以是一个脚本。
○ 在一个技能中设计SKILL.md和扩展的xxx.md,要让说明中逻辑清晰简单,尽量保持职责统一,避免让模型进行复杂的业务分析。
○ 如果扩展能是一个脚本,它的执行会具有更大的确定性,并减少了模型上线文交互过程。但也需要注意一个问题一个非常严重的问题,就是安全的问题,模型具有执行脚本能就就有很大的操作权限。
4. 开发和评估
先建立评估方法
监控模型对skill的私用
注意skills的安全,他能适用脚本,因此使用可信任的源的skills
1.anthropic中使用
在anthropic的相关产品中使用是目前体验最好的方式,但anthropic风控非常严,需要国外电话号和信用卡号,没有稳定方式或已使用anthropic的相关产品的,请绕行吧,即使今天能连,明天可能又不能连了。
1)在claude code/desktop中使用
* 升级claude的版本 claude update 。
* 安装插件 /plugin ,并添加市场github.com/anthropics/…
参考:zhuanlan.zhihu.com/p/197198435…
2)使用claude系列模型 + anthropic sdk
参考:platform.claude.com/docs/en/age…
2. 在****cursor 、 trae****中使用
较好的方式就是使用openskills,但是openskills没有那么成熟
安装openskills,需要node.js环境
* 安装openskills npm i -g openskills
安装Anthropic官方skills
* openskills install anthropics/skills [--global]
安装成功后再cursor、trae文件管理区能看到.claude/skills文件夹
* 创建AGENTS.md 文件并写入skills
执行命令
openskills sync
就可以在ide中使用了skill了,Anthropic官方提供一些常用的skill,如处理office文档等
参考文档:zhuanlan.zhihucom/p/197961255…
3. 在agent中使用
方式一:自实现
在你自己的Agent,按照Agent skills规范定义处理过程,目前agent skills比较新,像langchain等还不支持,所以会略有点麻烦,不过听说Dify已经支持了。
方式二:借助支持工具
据说已经支持agent skills的有:AnythingLLM,dify,github copilot。这里为了快速感受一下Agent skills选择AnythingLLM,AnythingLLM是“零门槛、全功能的本地私有知识库与 AI 助理平台”,从名字上可以看出定位"关于大模型用这一个就行了"。
3.1 安装****AnythingLLM
免费官网下载 anythingllm.com/
执行并安装 anythingLLM desktop
3.2 基础配置
安装成功后,可以看到AnythingLLM的应用图标,进入界面做一些基础性的配置,也可以后边在设置中配置
开始>>选择大模型>>配置大模型的key
1)初始页面
2)模型偏好选择
3)创建工作区,名字随便
1)进入目录,创建skill的文件件
进入AnythingLLM的安装目录,windows下默认:C:\Users<你的用户名>\AppData\Roaming\anythingllm-desktop
进入子文件夹storage\plugins\agent-skills,在这下边创建你skill文件夹(文件夹名称要和后边的配置对上),我这里创建的文件夹叫official-document-expert
2)创建SKILL.md
说明:这个是skill标准文件,注意名字大写。
内容:
Plain Text
---
name: official-document-expert
description: 当用户需要写公文、通知或总结时,请调用此技能进行专业润色。
---
# 技能指令
当用户输入一段文字并要求润色时,请遵循以下 SOP:
1. **语义转换**:将口语化的词汇转换为书面化的公文用语(如“打算做”改为“拟开展”)。
2. **句式精简**:去除冗余的修饰词,保持句子简洁有力。
3. **结构建议**:如果内容较长,建议增加“一是、二是、三是”的层级结构。
# 禁止行为
- 不要改变用户的核心原意。
- 严禁出现表情包或过于轻快的语气。
3)创建anythingLLM的插件配置 plugin.json,注意这里hubId要和前边的文件夹名相同,而name字段如果用中文,anythin可以使用,但是名称为空
{
"hubId": "official-document-expert",
// "name": "中文公文润色专家",
"name": "chinese expert",
"version": "1.0.0",
"description": "基于 Agent Skills 协议,专门优化中文公文、通知、汇报的遣词造句。",
"active": true,
"entrypoint": "handler.js"
}
handler.js
module.exports.runtime = {
handler: async function (userInput) {
// 告诉大模型:你现在必须按照 SKILL.md 里的逻辑来处理
return `请根据当前技能包中的 SKILL.md 协议规则,处理以下内容:${userInput}`;
}
}
3.4 验证Agent skills生效
使用带有skill的agent
在AnythingLLM的界面,通过@agent方式调用
从执行的结果看,模型能发现skill定义
说明:这里为了测试方便, skill 定义比较简单并没有调用外部工具,但这恰恰能看出 skill 和 mcp 的区别。
agent skills技术比较新,很多的大厂还都没有快速跟进的产品,这个还需要时间和行业的对这个认可。
• 不急着使用agent skills,新的总是要踩坑
• 设计上别在盲目的使用mcp了,导致成mcp的泛滥,还会留下一堆负资产
• agent skills 这种模式和思想还是很值得借鉴
• 密切关注agent skills的成熟
1.SKILL.md的编写
每个技能必须包含一个SKILL.md注意名字最好要求大写
一、 metadata定义部分
---
name: your-skill-name
description: Brief description of what this Skill does and when to use it
---
1.name的定义:
1)基本的要求
○ 最大64个字符
○ 必须是小写字母、数字和中划线的组合
○ 不能包含xml相关标签
○ 不能包含: "anthropic", "claude"
2)good case
○ processing-pdfs
○ analyzing-spreadsheets
○ managing-databases
○ testing-code
○ writing-documentation
3)bad case
○ 模糊: helper, utils, tools
○ 笼统: documents, data, files
○ 保留字: anthropic-helper, claude-tools
○ 模糊不一致的
2.description的定义:
尽量使用第三人称描述
1)基本要求
○ 必须非空
○ 最大1024个字符
○ 不能包含xml相关标签
2)good case
○ "处理Excel文件并生成报告"("Processes Excel files and generates reports")
3)bad case
○ "我可以帮你处理Excel文件"("I can help you process Excel files")
○ "你可以用它来处理Excel文件"("You can use this to process Excel files")
二、 技能体的部分
这部分相当于一个技能说明书,清楚的告诉模型怎么实现一个技能。
1)实践指导
○ 不超过500行,以获得最优的性能
○ 如果超过500行,建议拆分到子的定义文件
○ 使用概览(overview),从简单到复杂
○ 避免深度嵌套引用
○ 避免循环嵌套引用
○ 对于超过100行的文件,在顶部添加引用,即使部分读取也能读到
○ 可以使用下边的技巧或模式
2)模式1:使用高级指南
3)模式2:特定域的说明
4)模式3:条件细节
5)处理复杂工作流
先给出整体的步骤说明
6)实现反馈(feedback loops)的场景
参考:platform.claude.com/docs/en/age…