为什么要有SKILL
主要是需要区分skill和tool,这两个在初学者看来比较容易混淆。
- tool 一般执行原子任务,比如对文件的增删改查,网页搜索,计算器等单一的功能
- skill 更像一套方法论,它指导agent如何完成某项复杂的任务,通常,在skill中可能会出现调用tool的情况,但很少在tool中看见调用skill的情况
形象地说,tool像是兵器,而skill更像是武功秘籍。
SKILL基本概念
skill的构成
根据行内规定,一个完整skill通常是一个文件夹,文件夹名是skill的名字,比如“葵花宝典”,而这个文件夹下可以由以下几部分构成:
- SKILL.md // 其中包含frontmatter 和 指令正文,必须有
- script // 文件夹,不是必须有,存放可执行脚本的目录
- references // 文件夹,不是必须有,存放参考文件的目录
- assets // 文件夹,不是必须有,存放模板或数据文件等静态资源
非必须的三个目录中的文件都需要在SKILL.md中引用说明功能和何时调用
其中,SKILL.md中的frontmatter的name和description是必填字段,它们在 skill 渐进式加载时作为简略说明被加载进上下文。name 代表技能的名称,必须和存放技能的文件夹同名,description 描述技能的作用,agent通过这个字段识别并选择需要的技能包。
skill 的渐进式加载
skill 有个核心要点就是它的渐进式加载,在如今非常讲究上下文治理的环境下,技能包通篇加载是非常耗费上下文窗口的,而且也不是所有的技能包在处理当前任务时都会被用到。于是最好的办法就是按需加载技能包。
与 tool 类似,最初的上下文中只包含每个skill 的 frontmatter 而不是全文,当任务执行过程中命中某个技能包后,再将其SKILL.md加载到上下文即可,然后再根据任务进度加载技能包中其他资源。这样大大节省了执行过程中的上下文消耗,被称作渐进式加载。
SKILL的三种存储后端
skill有三种后端存储形式:
- FilesystemBackend:直接存储在本地磁盘,如果不设定目录权限,任意用户或agent都可以读取使用
- StateBackend:无本地磁盘环境,或需要加载远程skill时可以使用这个形式,需要用
create_file_data将技能文档加载成state中兼容的格式。skill的注入在invoke()中通过files字段指定。
fromurllib.requestimporturlopenfromdeepagentsimportcreate_deep_agentfromdeepagents.backendsimportStateBackendfromdeepagents.backends.utilsimportcreate_file_datafromlanggraph.checkpoint.memoryimportMemorySaver checkpointer=MemorySaver()backend=StateBackend()# 从远程加载 Skill(也可以本地读取)skill_url="https://raw.githubusercontent.com/langchain-ai/deepagents/refs/heads/main/libs/code/examples/skills/langgraph-docs/SKILL.md"withurlopen(skill_url)asresponse:skill_content=response.read().decode('utf-8')skills_files={"/skills/langgraph-docs/SKILL.md":create_file_data(skill_content),}agent=create_deep_agent(model="anthropic:claude-sonnet-4-6",backend=backend,skills=["/skills/"],checkpointer=checkpointer,)result=agent.invoke({"messages":[{"role":"user","content":"What is langgraph?"}],"files":skills_files,# 通过 files 参数注入},config={"configurable":{"thread_id":"12345"}},)- StoreBackend: StoreBackend 使用 LangGraph Store 进行持久化存储。而且也必须用
create_file_data()格式化。适合生产环境中多用户、多线程共享 Skills 的场景,所以在指定SKILL时需要同样指定命名空间namespace。
在创建agent时传入多个技能包的存放目录,其调用效果时后者覆盖前者的顺序。
agent=create_deep_agent(model="anthropic:claude-sonnet-4-6",skills=["/skills/shared/",# 团队共享 Skills"/skills/project/",# 项目专属 Skills(优先级更高)],)参考资料
deepagent实战笔记