Agent Skills:Agent“技能工程”的开发新范式

225 阅读13分钟

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组织工具返回结果和所有上下文给模型进行处理,得到最后结果。

image.png         使用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. 整体架构

image.png •         上图左边部分展示定一个具备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的方式进行组织,也方便技能的重用和迁移。

2.SKILL.md

SKILL.md是Agent skills中最重要文件,是分级揭露的直接实行者,文件中的内容分为了三个层级,模型根据需要选择加载不同层级的定义

image.png •         在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消耗

image.png 3.Agent skills过程

image.png

image.png •         系统初始化的时候会将第一级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)初始页面

image.png

2)模型偏好选择

image.png

image.png

3)创建工作区,名字随便

image.png

image.png

3.3 Agent skills配置

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方式调用

image.png

image.png 从执行的结果看,模型能发现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:使用高级指南 image.png

3)模式2:特定域的说明 image.png

4)模式3:条件细节 image.png

5)处理复杂工作流 先给出整体的步骤说明 image.png

6)实现反馈(feedback loops)的场景 image.png 参考:platform.claude.com/docs/en/age…