返回博客列表

Deep Agents 重磅更新:Skills 大改版,工具绑定、运行时固定、中途热重载全都来了

2026-10-10T23:45:00+08:00
Deep AgentsLangChainAI AgentSkillsContext Engineering翻译

Deep Agents 重磅更新:Skills 大改版,工具绑定、运行时固定、中途热重载全都来了

译者按:本文翻译自 LangChain 官方博客 Revamping Skills in Deep Agents(作者 Sydney Runkle,2026 年 10 月 7 日发布)。为符合中文技术阅读习惯,Skill、tool、context、prompt cache 等术语保留英文原文。

核心要点

  • 现在可以把 tool 绑定到 Skill 上了。 tool schema 在 agent 读到其所属 Skill 之前不会进入 context;在支持对话中途添加 tool 的新模型上,这种方式还能保持 prompt 缓存完整。
  • 应用可以在运行时固定(pin)Skill,让指令在第一次模型调用之前就进入 context,省去 read_file 的往返。
  • Skill 可以在线程中途重载,长时间运行的 agent 无需重开线程,就能感知新增、修改或删除的 Skill。

Skill 是给 agent 注入领域知识的最佳方式之一。所谓 skill,就是一个存放指令、脚本和参考文件的文件夹,教会 agent 如何做事——比如像你的销售团队那样准备一场客户会议,或者复盘一通电话的转写记录。Agent Skills 是一个开放标准,兼容任何模型,已有数十款 agent 产品提供支持。写一个 Skill 也不需要什么技术背景:说到底,它就是一个 markdown 文件。

Skill 之所以有效,靠的是渐进式披露(progressive disclosure)。agent 一开始只看到每个 Skill 的名称和描述,只有当任务需要时才去读取完整指令。这样 context 保持精简,而 context engineering 正是构建高效 agent 的关键。

随着使用规模扩大,团队对 Skill 的需求也在变化。我们看到企业级 Skill 库已经增长到数千个 Skill,在团队和 agent 之间共享。为此,我们重新设计了 Deep Agents 的 Skills 支持,回应几个常见诉求:

  • 将 tool 绑定到 Skill: 绑定到 Skill 的 tool,只在 agent 读取该 Skill 时才加载。
  • 固定 Skill: 当用户明确点名某个 Skill(比如 /meeting-prep)时,应用可以在下一次模型调用前把它加载好。
  • 重载 Skill: 长时间运行的线程无需从头开始,就能感知新增或变更的 Skill。

Skill 的工作原理

一个 Skill 就是一个包含 SKILL.md 文件的目录:文件以带有 name 和 description 字段的 YAML frontmatter 开头,后面是 agent 要遵循的指令。Skill 还可以在 scripts/、references/ 和 assets/ 目录下附带支持文件(规范)。

Skill 目录结构

始终留在 context 里的,只有 Skill 的名称和描述。agent 按需读取指令,只在需要时才加载脚本、参考文件和资源。

在本文中,我们用我们的 GTM agent 作为贯穿全篇的例子。它构建在 Deep Agents 之上,50 多个 Skill 组成的库覆盖了销售代表的日常工作,比如 meeting-prep、call-transcripts 和 competitive-intel-card。

Skill 分三级加载:

  1. 发现(Discovery)。 启动时,agent 在 system prompt 中看到每个 Skill 的 name 和 description。
  2. 激活(Activation)。 当任务匹配某个 Skill 时,agent 用 read_file 读取完整的 SKILL.md。
  3. 执行(Execution)。 agent 按照指令干活,只在指令要求时才读取脚本或参考文件。

Skill 三级加载:context 只按任务所需增长

agent 的 context 只按任务所需增长:启动时是所有 Skill 的名称和描述,然后是某一个 Skill 的指令,再然后是某一个参考文件。

在一个 Skill 被用到之前,它在 system prompt 里只占一行,所以一个库可以挂载海量 Skill 的引用而不挤占 context。下面进入我们在 Deep Agents 中做的增强。

将 tool 绑定到 Skill

Skill 常常会教 agent 怎么用某个特定的 tool,而有些 tool 只有在 agent 读过这些指令后才能用好。在此之前,Skill 和 tool 是分开披露的。你可以用 tool search 把 tool schema 挡在 context 之外,但没有任何机制把 tool 和解释它的 Skill 绑在一起:agent 可能没读 Skill 就找到并调用了某个 tool,也可能读了 Skill 却还得再去搜对应的 tool。

现在你可以把 tool 绑定到一个 Skill 上,让 Skill 和它的 tool 一起披露。被绑定的 tool 在 agent 读取其所属 Skill 之前不会进入 context;在这之前调用它,会以未知 tool 的形式失败。context 由此保持精简,同时也确保 agent 在调用 tool 之前已经读过它的用法。在我们的 GTM agent 里,call-transcripts 讲解了如何搜索通话、读取转写文本,所以它是绑定这些 tool 的自然位置。

在 Skill 的 frontmatter 中,把 tool 列在 metadata.include_tools 下面:

在 SKILL.md frontmatter 中声明 include_tools

然后把这些 tool 传给 SkillsMiddleware,而不是直接传给 agent:

将 tool 传给 SkillsMiddleware 而非 agent

读取 call-transcripts 后解锁 search_calls 和 get_transcript

读完 call-transcripts,search_calls 和 get_transcript 才会解锁。它们通过一条新增的 system message 进入对话,因此这条消息之前的缓存前缀保持不变。

过去,在对话中途添加 tool 意味着修改请求的 tool 列表,这会让 prompt 缓存失效。Anthropic 和 OpenAI 现在允许较新的模型在对话中途接受 tool,所以在这些模型上,Deep Agents 会在 Skill 被读取后立刻加入其绑定的 tool,缓存前缀保持原样(见 Anthropic 和 OpenAI 集成文档)。在其他模型上,tool 仍像从前一样追加到请求中。

对大多数 Skill 来说,一个列表就够了。如果需要更多控制,Skill 可以列一个 label 而不是具体的 tool 名称,你再传给 SkillsMiddleware 一个函数,由它把每个 label 解析成 tool。这样你就能:

  • 用一个名字披露整组 tool,比如某个 MCP server 上的全部 tool,而不必在 Skill 里逐一列出。
  • 按运行时权限控制 tool 的开放。 这个函数能拿到 graph 的 runtime,因此可以判断当前用户是谁,只返回其有权使用的 tool。

下面的例子里,call-transcripts 拿到 calls MCP server 上的全部 tool;pipeline-forecast 拿到 CRM tool,但只有经理角色才能更新预测:

通过 label 引用整组 tool

基于 runtime 权限过滤 tool

更多内容见 Add tools to skills。

固定 Skill(Pinned Skills)

有时用户一开始就清楚自己要用哪个 Skill。在我们的 GTM agent 里,销售可以直接输入 /meeting-prep for my Acme call tomorrow。不做固定的话,模型只能看到 Skill 的描述,还得自己决定去读它。这意味着正式干活前多出一次往返,而且不保证模型加载的就是对的那个 Skill。有了 pinned skills,你的应用从消息里识别出 Skill 名称(或从 UI 解析),通过 pinned_skills 传入,middleware 就会在下一次模型调用前把这些 Skill 的指令加入对话。Deep Agents 不替你解析消息,语法由你定:

应用侧解析 pinned skills 并传入

用户敲下 /meeting-prep 就点明了 Skill,应用可以直接为 agent 的下一次模型调用固定它。

pinned skill 在第一次模型调用前进入 context

pinned skill 以带标签的消息形式加入

被固定的 Skill 指令已经在对话里,agent 在第 1 次模型调用就能开工,而不用等到第 2 次。

这既降了延迟,也让行为更可预测:指令保证在 context 里,被固定 Skill 绑定的 tool 也会随之到位。每个被固定的 Skill 只作为一条带标签的消息添加一次,此前的消息一个字都不会变,prompt 缓存保持有效,聊天 UI 还可以用一个标签来展示这个 Skill,而不用展示它的全文。

线程中途重载 Skill

Skill 在每个线程开始时加载,并保存在 agent state 里,之后的每一轮都复用同一批 Skill。现在,你可以在调用 agent 时把 skills_metadata 设为 None,让这份列表失效。比如队友往库里加了一个 competitive-intel-card Skill,应用可以选择让 Skill 列表失效,下一轮运行就会重新扫描所有来源:

调用时置空 skills_metadata 触发重扫

重载后拾取新增的 Skill

把 skills_metadata 设为 None,下一次运行就会重新扫描 Skill 库,拾取上次运行之后新增的 Skill。

重载一旦发现新 Skill,system prompt 就会变化,prompt 缓存随之失效。但对一个已经闲置的线程来说,这笔代价通常早已付过:provider 的缓存一般在闲置几分钟到一小时内过期(Anthropic、OpenAI),等销售代表回来时,缓存本来就是冷的。

由于重置只是运行输入的一部分,你还可以把控制权交给用户,比如在客户端提供一个 /reload 命令:

客户端提供 /reload 命令

你也可以通过 update_state 或 middleware 来触发重置,重载时机完全由你的应用掌控。见 Reload skills。

上手使用

Skill 是业界给 agent 注入结构化领域知识的标准机制。这次更新让它在规模化场景下更好用:tool 只在 Skill 需要时才加载,工作流所需的 Skill 可以提前就位,长时间运行的线程也会随着库的变化保持最新。而且 Skill 是开放标准,你们团队写的 Skill 可以跨模型、跨 agent 使用。

以上特性都已在最新版 deepagents 中可用。阅读 Skills 文档开始上手,欢迎通过 GitHub issues、论坛或 X 告诉我们你的想法。

致谢

感谢 Rich Scarrott 主导这些新特性的开发,感谢 Hunter Lovell 参与特性与本文的审阅!

参考文档与链接

你的 agent 库里有多少个 Skill 了?评论区聊聊你的用法。觉得有用的话点个赞,让更多人看到。


作者: itech001
来源: 公众号:AI人工智能时代(the-ai-era)
网站: https://www.theaiera.top/ 关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top

本文首发于 AI人工智能时代,转载请注明出处。

分享给朋友