有关具有查询执行、错误纠正和验证的 SQL 代理的更完整示例,请参阅我们的 SQL
代理教程。本教程侧重于可应用于任何领域的渐进式披露模式。
它是如何工作的
以下是用户请求 SQL 查询时的流程: 为什么使用渐进式披露:- 减少上下文使用 - 仅加载任务所需的 2-3 个技能,而不是所有可用技能
- 实现团队自主 - 不同的团队可以独立开发专门的技能(类似于其他多代理架构)
- 高效扩展 - 添加数十或数百个技能而不会使上下文不堪重负
- 简化对话历史 - 具有一个对话线程的单个代理
- 延迟:按需加载技能需要额外的工具调用,这会增加需要每个技能的第一个请求的延迟
- 工作流控制:基本实现依赖于提示来指导技能使用 - 如果没有自定义逻辑,您无法强制执行像“总是先尝试技能 A 再尝试技能 B”这样的硬约束
设置
安装
本教程需要langchain 包:
LangSmith
设置 LangSmith 以检查代理内部发生的情况。然后设置以下环境变量:选择 LLM
从 LangChain 的集成套件中选择一个聊天模型:- OpenAI
- Anthropic
- Azure
- Google Gemini
- Bedrock Converse
1. 定义技能
首先,定义技能的结构。每个技能都有一个名称、一个简短的描述(在系统提示中显示)和完整的内容(按需加载):查看完整技能定义
查看完整技能定义
2. 创建技能加载工具
创建一个按需加载完整技能内容的工具:load_skill 工具将完整的技能内容作为字符串返回,该字符串作为 ToolMessage 成为对话的一部分。有关创建和使用工具的更多详细信息,请参阅工具指南。
3. 构建技能中间件
创建将技能描述注入系统提示的自定义中间件。此中间件使技能可被发现,而无需预先加载其完整内容。本指南演示了创建自定义中间件。有关中间件概念和模式的综合指南,请参阅自定义中间件文档。
load_skill 工具注册为类变量,使其可供代理使用。
生产考虑:本教程为了简单起见在
__init__
中加载技能列表。在生产系统中,您可能希望改为在 before_agent
钩子中加载技能,允许定期刷新它们以反映最新更改(例如,添加新技能或修改现有技能时)。有关详细信息,请参阅
before_agent
钩子文档。4. 创建支持技能的代理
现在创建带有技能中间件和用于状态持久性的检查点的代理:load_skill 来检索完整的技能内容。检查点在轮次之间维护对话历史。
5. 测试渐进式披露
使用需要技能特定知识的问题测试代理:- Joins customers with their orders
- Filters for high-value orders (>000) using the total_amount field
- Only includes completed orders (as per the business logic)
- Restricts to orders from the last month
- Returns distinct customers to avoid duplicates if they made multiple qualifying orders
更新 load_skill 以修改状态
修改load_skill 工具以在加载技能时更新状态:
创建受约束的工具
创建一个仅在加载特定技能后才可用的工具:更新中间件和代理
更新中间件以使用自定义状态架构:write_sql_query,它将收到一条错误消息,提示它先加载适当的技能(例如,sales_analytics 或 inventory_management)。这确保代理在尝试验证查询之前具有必要的模式知识。
完整示例
查看完整的可运行脚本
查看完整的可运行脚本
这是一个结合本教程中所有部分的完整、可运行的实现:这个完整的示例包括:
- 具有完整数据库模式的技能定义
- 用于按需加载的
load_skill工具 - 将技能描述注入系统提示的
SkillMiddleware - 带有中间件和检查点的代理创建
- 展示代理如何加载技能和编写 SQL 查询的示例用法
- 安装所需的包:
pip install langchain langchain-openai langgraph - 设置您的 API 密钥(例如,
export OPENAI_API_KEY=...) - 将模型初始化替换为您首选的 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 查询用例,您可以扩展渐进式披露以动态加载与用户查询匹配的少样本示例:示例方法:- 用户问:“查找 6 个月内未订购的客户”
- 代理加载
sales_analytics模式(如本教程所示) - 代理还加载 2-3 个相关的示例查询(通过语义搜索或基于标签的查找):
- 查找非活跃客户的查询
- 带有基于日期的过滤的查询
- 连接客户和订单表的查询
- 代理使用模式知识和示例模式编写查询
下一步
- 了解有关用于更动态代理行为的中间件
- 探索用于管理代理上下文的上下文工程技术
- 探索用于顺序工作流的切换模式
- 阅读用于并行任务路由的子代理模式
- 查看多代理模式以了解专门代理的其他方法
- 使用 LangSmith 调试和监控技能加载
通过 MCP 将这些文档连接 到 Claude、VSCode
等,以获取实时答案。

