subagents 参数中指定自定义子智能体。子智能体对于上下文隔离(保持主智能体的上下文清洁)以及提供专业化指令非常有用。
为什么使用子智能体?
子智能体解决了上下文膨胀问题。当智能体使用具有大量输出的工具(网络搜索、文件读取、数据库查询)时,上下文窗口会被中间结果迅速填满。子智能体可以隔离这些细节工作——主智能体只接收最终结果,而不是几十次工具调用产生的冗余内容。 何时使用子智能体:- ✅ 会让主智能体上下文变得混乱的多步骤任务
- ✅ 需要自定义指令或工具的专业领域
- ✅ 需要不同模型能力的任务
- ✅ 希望主智能体专注于高层协调时
- ❌ 简单的单步骤任务
- ❌ 需要保留中间上下文的场景
- ❌ 子智能体的额外开销大于收益时
配置
subagents 应该是字典或 CompiledSubAgent 对象的列表,有两种定义方式。
SubAgent(基于字典)
大多数用例中,将子智能体定义为字典即可: 必填字段:- name (
str):子智能体的唯一标识。主智能体在调用task()工具时会使用此名称。 - description (
str):子智能体负责的工作。描述要具体、可执行,便于主智能体决定何时委派。 - system_prompt (
str):对子智能体的指令,包含工具使用说明和输出格式要求。 - tools (
List[Callable]):子智能体可使用的工具。尽量保持精简,只提供必要工具。
- model (
str | BaseChatModel):覆盖主智能体的模型。使用"提供商:模型名"格式(例如"openai:gpt-4o")。 - middleware (
List[Middleware]):额外中间件,用于自定义行为、记录日志或限流。 - interrupt_on (
Dict[str, bool]):为特定工具配置人在回路,需要搭配检查点使用。
CompiledSubAgent
针对复杂工作流,可以为子智能体提供预编译的 LangGraph 图: 字段:- name (
str):唯一标识 - description (
str):子智能体职责 - runnable (
Runnable):经.compile()编译的 LangGraph 图
使用 SubAgent
使用 CompiledSubAgent
对于更复杂的场景,可以将预构建的 LangGraph 图作为子智能体传入:通用子智能体
除了用户定义的子智能体外,深度智能体始终可以访问一个general-purpose(通用)子智能体。该子智能体:
- 与主智能体共享同一系统提示
- 拥有相同的工具访问权限
- 使用相同的模型(除非显式覆盖)
何时使用
通用子智能体适合在无需特殊行为的情况下实现上下文隔离。主智能体可以将复杂的多步骤任务委派给它,从而获得简洁的结果,避免中间工具调用导致上下文膨胀。示例
与其让主智能体执行 10 次网络搜索并填满上下文,不如将任务委派给通用子智能体:
task(name="general-purpose", task="Research quantum computing trends")。子智能体会在内部完成所有搜索,并仅返回摘要。最佳实践
编写清晰的描述
主智能体会根据描述来决定调用哪个子智能体,请确保描述具体、可操作。 ✅ 优秀示例:"Analyzes financial data and generates investment insights with confidence scores"
❌ 糟糕示例: "Does finance stuff"
保持系统提示详尽
提供关于如何使用工具以及如何格式化输出的具体指导:精简工具集
仅为子智能体提供必要的工具,以保证专注度和安全性。按任务选择模型
不同模型擅长不同的任务,按需选择最合适的模型:返回精炼结果
要求子智能体仅返回摘要,而非原始数据:常见模式
多个专业子智能体
针对不同领域创建专业子智能体:- 主智能体创建高层计划
- 将数据收集委派给
data-collector - 将结果传递给
data-analyzer - 将洞察交给
report-writer - 汇总最终输出
故障排除
子智能体未被调用
问题:主智能体尝试自己完成工作而不是委派。 解决方案:- 让描述更加具体:
- 在主智能体提示中强调委派:
上下文仍然膨胀
问题:即使使用了子智能体,上下文仍然被填满。 解决方案:- 要求子智能体返回精炼结果:
- 使用文件系统存储大数据: