本教程展示了如何使用渐进式披露——一种上下文管理技术,即代理按需加载信息,而非预先加载全部——来实现技能(基于提示的专门指令)。代理通过工具调用来加载技能,而不是动态更改系统提示,从而仅为每个任务发现并加载所需的技能。 用例: 想象一下,构建一个代理来帮助在大型企业的不同业务部门编写 SQL 查询。您的组织可能为每个部门拥有独立的数据存储,或者一个包含数千个表的单一单体数据库。无论哪种方式,预先加载所有模式都会使上下文窗口不堪重负。渐进式披露通过仅在需要时加载相关模式来解决此问题。此架构还使得不同的产品负责人和利益相关者能够独立地为其特定业务部门贡献和维护技能。 您将构建的内容: 一个具有两项技能(销售分析和库存管理)的 SQL 查询助手。代理在系统提示中看到轻量级的技能描述,然后仅在用户查询相关时通过工具调用加载完整的数据库模式和业务逻辑。
有关包含查询执行、错误修正和验证的 SQL 代理的完整示例,请参阅我们的 SQL 代理教程。本教程重点介绍可应用于任何领域的渐进式披露模式。
渐进式披露因 Anthropic 推广为构建可扩展代理技能系统的技术而流行。该方法使用三级架构(元数据 → 核心内容 → 详细资源),代理仅在需要时加载信息。有关此技术的更多信息,请参阅 Equipping agents for the real world with Agent Skills。

工作原理

以下是当用户请求 SQL 查询时的流程: 为何使用渐进式披露:
  • 减少上下文使用 — 仅加载任务所需的 2-3 项技能,而非所有可用技能
  • 实现团队自治 — 不同团队可以独立开发专门的技能(类似于其他多代理架构)
  • 高效扩展 — 添加数十或数百项技能而不会使上下文不堪重负
  • 简化对话历史 — 具有单一对话线程的单个代理
技能是什么: 技能,因 Claude Code 的推广而流行,主要是基于提示的:针对特定业务任务的、自包含的专门指令单元。在 Claude Code 中,技能作为文件系统上的目录(其中包含文件)公开,通过文件操作发现。技能通过提示引导行为,并可提供有关工具使用的信息或包含供编码代理执行的示例代码。
具有渐进式披露的技能可被视为一种 RAG(检索增强生成) 形式,其中每个技能是一个检索单元——尽管不一定由嵌入或关键字搜索支持,而是由用于浏览内容的工具支持(如文件操作或本教程中的直接查找)。
权衡:
  • 延迟:按需加载技能需要额外的工具调用,这会为首次需要该技能的请求增加延迟
  • 工作流控制:基本实现依赖提示来引导技能使用——在没有自定义逻辑的情况下,您无法强制执行硬性约束,如“始终在尝试技能 B 之前尝试技能 A”
实现您自己的技能系统在构建您自己的技能实现时(如本教程中所做的),核心概念是渐进式披露——按需加载信息。除此之外,您在实现上拥有完全的灵活性:
  • 存储:数据库、S3、内存数据结构或任何后端
  • 发现:直接查找(本教程)、用于大型技能集合的 RAG、文件系统扫描或 API 调用
  • 加载逻辑:自定义延迟特性,并添加逻辑以搜索技能内容或对相关性进行排序
  • 副作用:定义技能加载时发生的情况,例如公开与该技能关联的工具(在第 8 节介绍)
这种灵活性使您能够针对围绕性能、存储和工作流控制的特定需求进行优化。

设置

安装

本教程需要 langchain 包:
有关更多详细信息,请参阅我们的安装指南。

LangSmith

设置 LangSmith 以检查代理内部发生的情况。然后设置以下环境变量:

选择一个 LLM

从 LangChain 的集成套件中选择一个聊天模型:
👉 阅读 OpenAI 聊天模型集成文档

1. 定义技能

首先,定义技能的结构。每个技能都有一个名称、一个简要描述(显示在系统提示中)和完整内容(按需加载):
现在为 SQL 查询助手定义示例技能。这些技能设计为描述轻量(预先显示给代理)但内容详细(仅在需要时加载):

2. 创建技能加载工具

创建一个按需加载完整技能内容的工具:
load_skill 工具将完整的技能内容作为字符串返回,该内容会成为 ToolMessage 的一部分,成为对话的一部分。有关创建和使用工具的更多详细信息,请参阅 工具指南。

3. 构建技能中间件

创建自定义中间件,将技能描述注入系统提示。此中间件使技能无需预先加载其完整内容即可被发现。
本指南演示了创建自定义中间件。有关中间件概念和模式的全面指南,请参阅自定义中间件文档。
中间件将技能描述附加到系统提示,使代理了解可用技能,而无需加载其完整内容。load_skill 工具被注册为类变量,使其可供代理使用。
生产注意事项:本教程为了简单起见在 __init__ 中加载技能列表。在生产系统中,您可能希望在 before_agent 钩子中加载技能,以便定期刷新它们以反映最新变化(例如,添加新技能或修改现有技能)。有关详细信息,请参阅 before_agent 钩子文档。

4. 创建具有技能支持的代理

现在创建具有技能中间件和用于状态持久化的检查点的代理:
代理现在可以在其系统提示中访问技能描述,并且可以在需要时调用 load_skill 来检索完整的技能内容。检查点维护跨轮次的对话历史。

5. 测试渐进式披露

用一个需要特定技能知识的问题测试代理:
预期输出:
代理在其系统提示中看到了轻量级的技能描述,认识到问题需要销售数据库知识,调用了 load_skill("sales_analytics") 以获取完整的模式和业务逻辑,然后使用该信息编写了遵循数据库规范的正确查询。

6. 高级:使用自定义状态添加约束

您可以添加约束来强制执行某些工具仅在加载特定技能后才可用。这需要在自定义代理状态中跟踪已加载的技能。

定义自定义状态

首先,扩展代理状态以跟踪已加载的技能:

更新 load_skill 以修改状态

修改 load_skill 工具,在加载技能时更新状态:

创建受限工具

创建一个仅在加载特定技能后才可使用的工具:

更新中间件和代理

更新中间件以使用自定义状态架构:
创建使用注册了受限工具的中间件的代理:
现在,如果代理在加载所需技能之前尝试使用 write_sql_query,它将收到一条错误消息,提示它首先加载适当的技能(例如 sales_analytics 或 inventory_management)。这确保了代理在尝试验证查询之前具备必要的模式知识。

完整示例

以下是结合本教程所有部分的完整、可运行实现:
这个完整的示例包括:
  • 包含完整数据库模式的技能定义
  • 用于按需加载的 load_skill 工具
  • SkillMiddleware,用于将技能描述注入系统提示
  • 使用中间件和检查点创建代理
  • 示例用法,展示代理如何加载技能并编写 SQL 查询
要运行此示例,您需要:
  1. 安装所需包:pip install langchain langchain-openai langgraph
  2. 设置您的 API 密钥(例如 export OPENAI_API_KEY=...)
  3. 将模型初始化替换为您偏好的 LLM 提供商

实现变体

本教程将技能实现为通过工具调用加载的内存中 Python 字典。然而,实现基于技能的渐进式披露有多种方式:存储后端:
  • 内存中(本教程):技能定义为 Python 数据结构,访问速度快,无 I/O 开销
  • 文件系统(Claude Code 方法):技能作为包含文件的目录,通过 read_file 等文件操作发现
  • 远程存储:技能存储在 S3、数据库、Notion 或 API 中,按需获取
技能发现(代理如何了解存在哪些技能):
  • 系统提示列表:系统提示中列出技能描述(本教程使用)
  • 基于文件:通过扫描目录发现技能(Claude Code 方法)
  • 基于注册表:查询技能注册服务或 API 获取可用技能
  • 动态查找:通过工具调用列出可用技能
渐进式披露策略(如何加载技能内容):
  • 单次加载:在一次工具调用中加载整个技能内容(本教程使用)
  • 分页加载:针对大型技能,分多页/块加载内容
  • 基于搜索:在特定技能内容内搜索相关部分(例如,使用 grep/read 操作处理技能文件)
  • 分层加载:首先加载技能概览,然后深入特定子部分
规模考量(未校准的心智模型 - 请为您的系统优化):
  • 小型技能(< 1K tokens / ~750 词):可直接包含在系统提示中,并使用提示缓存以节省成本、加快响应
  • 中型技能(1-10K tokens / ~750-7.5K 词):适合按需加载,避免上下文开销(本教程)
  • 大型技能(> 10K tokens / ~7.5K 词,或占上下文窗口 > 5-10%):应使用渐进式披露技术,如分页、基于搜索的加载或分层探索,以避免消耗过多上下文
选择取决于您的需求:内存中加载最快,但技能更新需要重新部署;而基于文件或远程存储支持动态技能管理,无需更改代码。

渐进式披露与上下文工程

渐进式披露本质上是一种**上下文工程技术** - 您正在管理代理可用的信息及其时间点。本教程专注于加载数据库模式,但相同的原理适用于其他类型的上下文。

结合少样本提示

对于 SQL 查询用例,您可以将渐进式披露扩展为动态加载与用户查询匹配的少样本示例:示例方法:
  1. 用户提问:“查找 6 个月内未下订单的客户”
  2. 代理加载 sales_analytics 模式(如本教程所示)
  3. 代理还加载 2-3 个相关的示例查询(通过语义搜索或基于标签的查找):
    • 查找不活跃客户的查询
    • 带有基于日期过滤条件的查询
    • 连接客户表和订单表的查询
  4. 代理结合模式知识和示例模式编写查询
这种将渐进式披露(按需加载模式)与动态少样本提示(加载相关示例)相结合的方式,创建了一个强大的上下文工程模式,可扩展至大型知识库,同时提供高质量、基于事实的输出。

后续步骤