如需查看包含查询执行、错误修正和验证的完整 SQL agent 示例,请参阅 SQL Agent 教程。本教程重点介绍可应用于任何领域的渐进式披露模式。
工作原理
当用户请求 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 hook 中加载技能,以便定期刷新并反映最新变更,例如新增技能或修改现有技能时。有关详细信息,请参阅 before_agent hook 文档。4. 创建支持技能的智能体
现在创建带有技能中间件和用于状态持久化的 checkpointer 的智能体:load_skill 来检索完整技能内容。checkpointer 会跨轮次维护对话历史。
5. 测试渐进式披露
使用一个需要特定技能知识的问题来测试智能体:load_skill("sales_analytics") 获取完整 schema 和业务逻辑,然后使用这些信息编写符合数据库约定的正确查询。
6. 进阶:使用自定义状态添加约束
可选:跟踪已加载技能并强制执行工具约束
可选:跟踪已加载技能并强制执行工具约束
你可以添加约束,强制某些工具只能在特定技能加载后可用。这需要在自定义智能体状态中跟踪已加载的技能。使用注册了受约束工具的中间件创建智能体:现在,如果智能体在加载所需技能前尝试使用
定义自定义状态
首先,扩展智能体状态以跟踪已加载技能:更新 load_skill 以修改状态
修改load_skill 工具,使其在加载技能时更新状态:创建受约束的工具
创建一个仅在加载特定技能后才能使用的工具:更新中间件和智能体
更新中间件以使用自定义状态 schema:write_sql_query,它会收到错误消息,提示它先加载相应技能,例如 sales_analytics 或 inventory_management。这可确保智能体在尝试验证查询前具备必要的 schema 知识。完整示例
查看完整可运行脚本
查看完整可运行脚本
下面是一个完整、可运行的实现,组合了本教程中的所有部分:这个完整示例包含:
- 包含完整数据库 schema 的技能定义
- 用于按需加载的
load_skill工具 - 将技能描述注入系统提示词的
SkillMiddleware - 使用中间件和 checkpointer 创建智能体
- 展示智能体如何加载技能并编写 SQL 查询的示例用法
- 安装所需包:
pip install langchain langchain-openai langgraph - 设置 API key,例如
export OPENAI_API_KEY=... - 将模型初始化替换为你首选的 LLM provider
实现变体
查看实现选项和权衡
查看实现选项和权衡
本教程将技能实现为通过工具调用加载的内存 Python 字典。不过,还有多种方式可以使用技能实现渐进式披露:存储后端:
- 内存(本教程):将技能定义为 Python 数据结构,访问速度快,没有 I/O 开销
- 文件系统(Claude Code 方法):技能是包含文件的目录,通过
read_file等文件操作发现 - 远程存储:技能位于 S3、数据库、Notion 或 API 中,按需获取
- 系统提示词列表:在系统提示词中列出技能描述(本教程使用)
- 基于文件:通过扫描目录发现技能(Claude Code 方法)
- 基于注册表:查询技能注册表服务或 API 以获取可用技能
- 动态查找:通过工具调用列出可用技能
- 单次加载:在一次工具调用中加载整个技能内容(本教程使用)
- 分页加载:对于大型技能,将技能内容分成多个页面或块加载
- 基于搜索:在特定技能内容中搜索相关章节,例如对技能文件使用 grep/read 操作
- 分层加载:先加载技能概览,再深入特定小节
- 小型技能(< 1K tokens / 约 750 词):可以直接包含在系统提示词中,并使用 prompt caching 缓存,以节省成本并加快响应
- 中型技能(1-10K tokens / 约 750-7.5K 词):适合按需加载,以避免上下文开销(本教程)
- 大型技能(> 10K tokens / 约 7.5K 词,或 > 上下文窗口的 5-10%):应使用分页、基于搜索的加载或分层探索等渐进式披露技术,以避免消耗过多上下文
渐进式披露和上下文工程
与 few-shot prompting 和其他技术结合
与 few-shot prompting 和其他技术结合
渐进式披露本质上是一种 context engineering 技术。你在管理哪些信息可供智能体使用,以及何时可用。本教程重点介绍加载数据库 schema,但相同原则也适用于其他类型的上下文。
与 few-shot prompting 结合
对于 SQL 查询场景,你可以扩展渐进式披露,动态加载与用户查询匹配的 few-shot examples:示例方法:- 用户提问:“找出 6 个月未下单的客户”
- 智能体加载
sales_analyticsschema,如本教程所示 - 智能体还会加载 2-3 个相关示例查询,通过语义搜索或基于标签的查找:
- 查找不活跃客户的查询
- 使用基于日期过滤的查询
- 连接 customers 和 orders 表的查询
- 智能体同时使用 schema 知识和示例模式编写查询
后续步骤
- 了解用于实现更动态智能体行为的 middleware
- 探索用于管理智能体上下文的 context engineering 技术
- 探索用于顺序工作流的 handoffs pattern
- 阅读用于并行任务路由的 subagents pattern
- 查看 multi-agent patterns,了解构建专用智能体的其他方法
- 使用 LangSmith 调试和监控技能加载
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

