subagents 参数中指定自定义子智能体。子智能体对于 隔离上下文(保持主智能体的上下文清洁)和提供专业指令很有用。
为什么使用子智能体?
子智能体解决了上下文膨胀问题。当智能体使用输出量大的工具(如网络搜索、文件读取、数据库查询)时,上下文窗口会迅速被中间结果填满。子智能体将这项详细工作隔离开——主智能体只接收最终结果,而不是产生这个结果的数十次工具调用。 何时使用子智能体:- ✅ 多步骤任务,这可能会使主智能体的上下文变得杂乱
- ✅ 需要定制指令或工具的特定领域
- ✅ 需要不同模型能力的任务
- ✅ 当您希望主智能体专注于高级协调时
- ❌ 简单的单步任务
- ❌ 需要维护中间上下文时
- ❌ 当开销超过收益时
配置
subagents 应该是一个字典列表或 CompiledSubAgent 对象。有两种类型:
子智能体(基于字典)
对于大多数用例,将子智能体定义为字典: 必填字段:- 名称 (
str):子智能体的唯一标识符。主智能体在调用task()工具时使用此名称。 - 描述 (
str):此子智能体执行的操作。请具体且以行动为导向。主智能体使用此信息来决定何时委派任务。 - 系统提示 (
str):对子智能体的指令。包括工具使用指南和输出格式要求。 - 工具 (
List[Callable]):子智能体可使用的工具。请保持最小化,仅包括所需工具。
- 模型 (
str | BaseChatModel): 覆盖主智能体的模型。使用格式"provider:model-name"(例如,"openai:gpt-4o")。 - 中间件 (
List[Middleware]): 用于自定义行为、日志记录或速率限制的附加中间件。 - 中断于 (
Dict[str, bool]): 为特定工具配置人机交互。需要检查点器。
编译子智能体
对于复杂的流程,请使用预构建的 LangGraph 图。 字段:- name (
str): 唯一标识符 - description (
str): 该子智能体执行的操作 - runnable (
Runnable): 编译后的 LangGraph 图(必须先调用.compile())
使用子智能体
使用编译子智能体
对于更复杂的用例,您可以将自己的预构建LangGraph图作为子智能体提供:通用子智能体
除了任何用户定义的子智能体之外,深度智能体始终可以访问一个general-purpose 子智能体。此子智能体:
- 与主智能体具有相同的系统提示
- 可以访问所有相同的工具
- 使用相同的模型(除非被覆盖)
何时使用它
通用子智能体非常适合在没有特定行为的情况下进行上下文隔离。主智能体可以将复杂的多个步骤任务委托给这个子智能体,并得到一个简洁的结果,而无需中间工具调用的冗余。Example
与主智能体进行10次网络搜索并填充上下文结果不同,它委托给通用子智能体:
task(name="general-purpose", task="Research quantum computing trends")。子智能体内部执行所有搜索,并仅返回摘要。最佳实践
编写清晰的描述
主要智能体使用描述来决定调用哪个子智能体。具体来说: ✅ 好:"Analyzes financial data and generates investment insights with confidence scores"
❌ 错误: "Does finance stuff"
保持系统提示详细
包括如何使用工具和格式化输出的具体指导:最小化工具集
仅向子智能体提供它们所需的工具。这有助于提高专注度和安全性:根据任务选择模型
不同的模型擅长不同的任务:返回简洁的结果
指示子智能体返回摘要,而不是原始数据:常见模式
多个专业子智能体
创建针对不同领域的专用子智能体:- 主智能体创建高级计划
- 将数据收集任务委托给数据收集器
- 将结果传递给数据分析器
- 将洞察发送给报告编写者
- 编译最终输出
故障排除
子智能体未被调用
问题:主智能体试图自己完成工作而不是委托。 解决方案-
使描述更加具体:
-
指示主智能体进行委派:
上下文仍然在膨胀
问题:尽管使用了子智能体,上下文仍然会填满。 解决方案-
指示子智能体返回简洁的结果:
-
使用文件系统处理大数据: