有关包含查询执行、错误修正和验证的更完整 SQL 代理示例,请参阅我们的 SQL 代理教程。本教程专注于渐进式披露模式,该模式可应用于任何领域。
工作原理
以下是用户请求 SQL 查询时的工作流程: 为何使用渐进式披露:- 减少上下文占用 - 仅加载任务所需的 2-3 个技能,而非所有可用技能
- 实现团队自治 - 不同团队可以独立开发专业技能(类似于其他多代理架构)
- 高效扩展 - 可添加数十或数百个技能,而不会使上下文超载
- 简化对话历史 - 单一代理维护一条对话线程
- 延迟:按需加载技能需要额外的工具调用,这会为每个技能的首次请求增加延迟
- 工作流控制:基础实现依赖提示来引导技能使用——如果没有自定义逻辑,你无法强制执行”始终先尝试技能 A,再尝试技能 B”之类的硬约束
配置
安装
本教程需要langchain 包:
LangSmith
设置 LangSmith 以检查代理内部发生的情况。然后设置以下环境变量:选择 LLM
从 LangChain 的集成套件中选择一个聊天模型:- OpenAI
- Anthropic
- Azure
- Google Gemini
- AWS Bedrock
- HuggingFace
1. 定义技能
首先,定义技能的结构。每个技能包含名称、简短描述(显示在系统提示中)和完整内容(按需加载):查看完整技能定义
查看完整技能定义
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 查询的示例用法
- 安装所需包:
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 token / ~750 词):可直接包含在系统提示中,并通过提示缓存节省成本、加快响应
- 中型技能(1-10K token / ~750-7.5K 词):受益于按需加载,避免上下文开销(本教程)
- 大型技能(> 10K token / ~7.5K 词,或占上下文窗口的 5-10% 以上):应使用分页、基于搜索的加载或层次化探索等渐进式披露技术,避免占用过多上下文
渐进式披露与上下文工程
与少样本提示及其他技术结合
与少样本提示及其他技术结合
渐进式披露本质上是一种**上下文工程技术**——你管理着代理可获取哪些信息以及何时获取。本教程专注于加载数据库架构,但相同的原则适用于其他类型的上下文。
与少样本提示结合
对于 SQL 查询使用场景,你可以扩展渐进式披露,动态加载与用户查询相匹配的少样本示例:示例方案:- 用户提问:“查找 6 个月内未下单的客户”
- 代理加载
sales_analytics架构(如本教程所示) - 代理还加载 2-3 个相关示例查询(通过语义搜索或基于标签的查找):
- 查找非活跃客户的查询
- 带日期过滤的查询
- 连接 customers 和 orders 表的查询
- 代理同时利用架构知识和示例模式编写查询
后续步骤
- 了解中间件以实现更动态的代理行为
- 探索上下文工程技术来管理代理上下文
- 探索交接模式用于顺序工作流
- 阅读子代理模式用于并行任务路由
- 查看多代理模式了解专业代理的其他方法
- 使用 LangSmith 调试和监控技能加载
将这些文档连接到 Claude、VSCode 等,通过 MCP 获取实时答案。

