Today for AI

LangChain Blog · 2026/10/8 02:49:50

LangChain 升级 Deep Agents 技能系统:支持工具绑定、运行时固定与线程内热重载

原标题:Revamping Skills in Deep Agents
68AI 研判分
核心综述

LangChain 对 Deep Agents 框架中的“技能”(Skills)机制进行了重大更新,允许将工具直接绑定到技能文件夹中,仅在智能体读取该技能时才加载其 Schema,从而显著优化上下文窗口并保留 Prompt 缓存。新系统还支持应用在首次模型调用前通过运行时固定(Runtime Pinning)预加载指令,以及长运行智能体在线程内动态热重载新增或修改的技能,无需重启会话即可即时生效。

报道全文原始报道全文

本文目录9 个章节

Deep Agents 中 Skills 的革新

Sydney RunkleOctober 7, 20267min返回博客创建智能体创建智能体

核心要点

  • 现在可以将工具绑定到 skills。 在智能体读取其绑定的 skill 之前,工具 schema 不会进入上下文;对于支持在对话中途添加新工具的模型,添加这些工具可以保持 prompt cache 完好无损。
  • 应用可以在运行时固定(pin)skills,从而确保指令在首次模型调用前就已存在于上下文中,无需 read_file 往返操作。
  • Skills 可以在线程中途重新加载,因此长时间运行的智能体能够获取新增、编辑或删除的 skills,而无需启动新线程。

Skills 是为智能体提供领域知识的最佳方式之一。一个 skill 是一个包含指令、脚本和参考文件的文件夹,用于教导智能体如何执行任务,例如为客户会议做准备或按照销售团队的方式审查通话记录。Agent Skills 是一项开放标准,适用于任何模型,并得到数十种智能体产品的支持。此外,编写 skill 也不需要技术背景:从本质上讲,skill 就是一个 markdown 文件。

Skills 之所以有效,是因为*渐进式披露(progressive disclosure)*机制。智能体最初只看到每个 skill 的名称和描述,仅在任务需要时才读取完整指令。这有助于保持上下文精简,而上下文工程(context engineering)正是构建高效智能体的关键。

随着使用规模的扩大,团队对 skills 的需求也在发生变化。我们看到企业级 skill 注册表已增长至数千个 skills,并在各个团队和智能体之间共享。我们已对 Deep Agents 中的 skills 支持进行了全面改版,以解决一些常见需求:

  • 将工具绑定到 skills: 绑定到某个 skill 的工具仅在智能体读取该 skill 时才会加载。
  • 固定的 skills(Pinned skills): 当用户明确请求某个 skill(如 /meeting-prep)时,你的应用可以在下一次模型调用之前将其加载。
  • Skill 重新加载: 长时间运行的线程可以获取新的或更改后的 skills,而无需重新开始。

Skills 的工作原理

技能是一个包含 SKILL.md 文件的目录:该文件以 YAML frontmatter 开头,其中包含 name(名称)和 description(描述),随后是智能体遵循的指令。技能还可以捆绑支持文件,分别位于 scripts/、references/ 和 assets/ 目录下(规范)。

只有技能的名称和描述始终处于上下文中。智能体会按需读取指令,并且仅在需要时加载脚本、参考资料和资源。

只有技能的名称和描述始终处于上下文中。智能体会按需读取指令,并且仅在需要时加载脚本、参考资料和资源。

在本文中,我们将以 我们的 GTM 智能体 作为贯穿全文的示例。它基于 Deep Agents 构建,其技能库包含超过 50 项技能,涵盖了销售代表常见的重复性工作,例如 meeting-prep(会议准备)、call-transcripts(通话记录)和 competitive-intel-card(竞争情报卡片)。

技能分三个层级加载:

  1. 发现(Discovery)。在启动时,智能体在其系统提示词中看到每个技能的 name 和 description。
  2. 激活(Activation)。当任务与某个技能匹配时,智能体通过 read_file 读取完整的 SKILL.md 文件。
  3. 执行(Execution)。智能体遵循指令,并且仅在需要时读取脚本或参考文件。

智能体的上下文仅根据任务需求增长:启动时包含所有技能的名称和描述,然后是一个技能的指令,接着是一个参考文件。

智能体的上下文仅根据任务需求增长:启动时包含所有技能的名称和描述,然后是一个技能的指令,接着是一个参考文件。

在技能被使用之前,它在系统提示词中仅占用一行空间,因此技能库可以容纳大量技能的引用而不会挤占上下文窗口。现在,让我们深入探讨我们在 Deep Agents 中所做的增强功能。

将工具绑定到技能

技能通常用于指导智能体如何使用特定工具,而某些工具只有在智能体阅读了相关说明后才能有效工作。此前,技能和工具是分别披露的。你可以使用工具搜索将工具架构(schema)排除在上下文之外,但没有任何机制将工具与其对应的解释性技能关联起来:智能体可能在未阅读技能的情况下找到并调用某个工具,或者在阅读了技能后仍需自行搜索其配套工具。

现在,你可以将工具绑定到技能,使技能及其工具一同披露。绑定的工具不会立即加入上下文,只有当智能体读取了其所属技能后才会生效;在此之前调用该工具会因“未知工具”而失败。这种机制既保持了上下文的精简,也确保智能体在调用工具前已了解其使用方法。在我们的 GTM 智能体中,call-transcripts 技能说明了如何搜索通话记录及读取转录文本,因此它是绑定这些工具的理想位置。

在技能的 frontmatter 中的 metadata.include_tools 字段下列出这些工具:

call-transcripts SKILL.md frontmatter listing include_tools: search_calls get_transcript

将这些工具传递给 SkillsMiddleware,而不是直接传给智能体:

Python: create_deep_agent with SkillsMiddleware(tools=[search_calls, get_transcript])

Reading call-transcripts unlocks search_calls and get_transcript. They arrive in a new system message, so the cached prefix above it stays unchanged.

读取 call-transcripts 技能后会解锁 search_calls 和 get_transcript 工具。它们通过一条新的系统消息注入,因此位于其上方的缓存前缀保持不变。

在对话中途添加工具,过去意味着需要编辑请求中的工具列表,这会导致提示缓存失效。Anthropic 和 OpenAI 现已支持较新的模型在对话中途接受新工具。因此,在这些模型上,Deep Agents 会在读取技能后立即添加该技能绑定的工具,从而保持缓存前缀不变(参见 Anthropic 和 OpenAI 集成文档)。对于其他模型,工具仍像以前一样追加到请求中。

一个列表即可涵盖大多数技能。为了获得更精细的控制,技能可以列出标签而非具体的工具名称,而你传递给 SkillsMiddleware 的函数会将每个标签转换为对应的工具。这使得你可以:

  • 披露整个工具组,例如将 MCP 服务器上的所有工具归在一个名称下,而无需在技能中逐一列出每个工具。
  • 基于运行时权限对工具进行门控。该函数接收图的运行时上下文,因此可以检查用户身份,并仅返回他们被允许使用的工具。

在此示例中,call-transcripts 获取 calls MCP 服务器上的所有工具,而 pipeline-forecast 获取 CRM 工具,但只有经理才能更新预测:

SKILL.md frontmatter for call-transcripts (include_tools: call_tools) and pipeline-forecast (include_tools: crm_tools)

Python: resolve_skill_tools returns every calls MCP tool for call_tools, and update_forecast only for managers

更多详情,请参阅 Add tools to skills。

Pinned skills

有时候,用户已经明确知道自己想要使用哪个技能。在我们的 GTM 智能体中,销售代表可以输入 /meeting-prep for my Acme call tomorrow。如果不进行固定(pinning),模型只能看到技能的描述,必须先读取它。这会在工作开始前增加一次往返请求,而且无法保证模型加载的是正确的技能。通过 固定技能,你的应用可以在消息中找到技能名称(或从 UI 解析)并将其传入 pinned_skills,中间件会在下一次模型调用前将每个技能的指令添加到对话中。Deep Agents 本身不解析消息,因此你可以自行选择语法:

输入 /meeting-prep 即指定了技能名称,因此应用可以将其固定以供智能体的下一次模型调用使用。

输入 /meeting-prep 即指定了技能名称,因此应用可以将其固定以供智能体的下一次模型调用使用。

Python:从消息中解析 /meeting-prep 并将其作为 pinned_skills 传递给 agent.invoke

固定技能的指令已存在于对话中,因此智能体在第 1 次模型调用时即可开始工作,而不是等到第 2 次。

固定技能的指令已存在于对话中,因此智能体在第 1 次模型调用时即可开始工作,而不是等到第 2 次。

这不仅降低了延迟,还使行为更加可预测:指令被保证包含在上下文中,且固定技能绑定的工具也会随之加载。每个固定技能仅作为一条带标签的消息添加一次,因此之前的消息不会改变,提示缓存保持有效,聊天界面也可以将技能显示为标签而非其完整文本。

在线程中途重新加载技能

技能在每个线程开始时加载并保存在智能体状态中,因此后续每一轮都会复用同一组技能。现在你可以通过在调用智能体时将 skills_metadata 设置为 None 来使该列表失效。如果团队成员向库中添加了一个 competitive-intel-card 技能,应用程序可以选择使技能列表失效,下一次运行将重新扫描所有来源:

Python:agent.invoke 调用时将 skills_metadata 设置为 None

将 skills_metadata 设置为 None,可使下一次运行重新扫描技能库,并加载自上次运行以来新增的技能。

将 skills_metadata 设置为 None,可使下一次运行重新扫描技能库,并加载自上次运行以来新增的技能。

若重载过程发现了新技能,系统提示词(system prompt)将会发生变化,从而导致提示词缓存失效。对于处于空闲状态的线程而言,这一代价通常已经产生:提供商的缓存通常在几分钟到一小时的无活动期后就会过期(Anthropic,OpenAI),因此当代理(agent)重新运行时,缓存已是冷启动状态。

由于重置操作仅涉及运行输入,你也可以将控制权交给用户。例如,在客户端实现一个 /reload 命令:

Python:一个 /reload 命令将运行载荷中的 skills_metadata 设置为 None

你还可以通过 update_state 或中间件(middleware)来触发重置,从而由你的应用控制技能重载的时机。请参阅 Reload skills。

开始使用

技能(Skills)是为代理提供结构化领域知识的行业标准机制。这些更新使得大规模运行技能变得更加容易:工具仅在技能需要时才加载,工作流所需的技能会预先加载,而长时间运行的线程也能随着技能库的变化保持最新状态。此外,由于技能是一项开放标准,你的团队编写的技能可在不同模型和代理之间通用。

以上功能均已在最新版本的 deepagents 中提供。请阅读 skills docs 以开始使用,并通过 GitHub issues、论坛 或 X 告诉我们你的想法。

致谢

感谢 Rich Scarrott 主导开发这些新功能,以及 Hunter Lovell 对功能和博客文章进行的审阅!

查看你的代理实际在做什么

LangSmith 是我们的智能体工程平台,助力开发者调试每一次智能体决策、评估变更并实现一键部署。

试用 LangSmith获取演示