subagents 参数中指定自定义子智能体。子智能体对于上下文隔离(保持主智能体上下文清洁)以及提供专业化指令非常有用。
本页介绍同步子智能体,即主控智能体会阻塞直到子智能体完成。对于长时间运行的任务、并行工作流,或者需要中途调整和取消的情况,请参阅异步子智能体。
为什么要使用子智能体?
子智能体解决了上下文膨胀问题。当智能体使用输出量大的工具(网络搜索、文件读取、数据库查询)时,上下文窗口会很快被中间结果填满。子智能体将这些详细工作隔离开来——主智能体只接收最终结果,而不是产生该结果的数十次工具调用。 何时使用子智能体:- ✅ 会弄乱主智能体上下文的多步骤任务
- ✅ 需要自定义指令或工具的专业领域
- ✅ 需要不同模型能力的任务
- ✅ 当您希望主智能体专注于高层协调时
- ❌ 简单的单步任务
- ❌ 需要维护中间上下文时
- ❌ 当开销超过收益时
配置
subagents 应该是一个字典或 CompiledSubAgent 对象的列表。有两种类型:
SubAgent (基于字典)
对于大多数用例,将子智能体定义为与SubAgent 规范匹配的字典,包含以下字段:
CompiledSubAgent
对于复杂工作流,使用预构建的 LangGraph 图作为CompiledSubAgent:
使用 SubAgent
使用 CompiledSubAgent
对于更复杂的用例,您可以提供自定义子智能体。 您可以使用 LangChain 的create_agent 或使用图 API 制作自定义 LangGraph 图来创建自定义子智能体。
如果您正在创建自定义 LangGraph 图,请确保该图具有名为 "messages" 的状态键:
流式传输
在流式传输追踪信息时,智能体的名称可作为元数据中的lc_agent_name 使用。
在查看追踪信息时,您可以使用此元数据来区分数据来自哪个智能体。
以下示例创建了一个名为 main-agent 的深度智能体和一个名为 research-agent 的子智能体:
"research-agent" 的子智能体,在其关联的智能体运行元数据中将包含 {'lc_agent_name': 'research-agent'}:

结构化输出
所有子智能体都支持结构化输出,您可以使用它来验证子智能体的输出。 您可以通过将所需的结构化输出模式作为response_format 参数传递给 create_agent() 来设置它。
当模型生成结构化数据时,它会被捕获和验证。
结构化对象本身不会返回给父智能体。
在子智能体中使用结构化输出时,请将结构化数据包含在 ToolMessage 中。
有关更多信息,请参阅响应格式。
通用子智能体
除了任何用户定义的子智能体外,深度智能体始终可以访问一个general-purpose 子智能体。该子智能体:
- 具有与主智能体相同的系统提示
- 可以访问所有相同的工具
- 使用相同的模型(除非被覆盖)
- 继承主智能体的技能(当配置了技能时)
覆盖通用子智能体
在您的subagents 列表中包含一个 name="general-purpose" 的子智能体以替换默认设置。使用此方法为通用子智能体配置不同的模型、工具或系统提示:
何时使用它
通用子智能体非常适合不需要特殊行为的上下文隔离。主智能体可以将复杂的多步骤任务委派给此子智能体,并获得简洁的结果返回,而不会因中间工具调用而导致上下文膨胀。示例
主智能体不进行 10 次网络搜索并用结果填满其上下文,而是委派给通用子智能体:
task(name="general-purpose", task="Research quantum computing trends")。子智能体在内部执行所有搜索,并仅返回一个摘要。技能继承
当使用create_deep_agent 配置技能时:
- 通用子智能体:自动继承主智能体的技能
- 自定义子智能体:默认不继承技能——使用
skills参数赋予它们自己的技能
只有配置了技能的子智能体才会获得
SkillsMiddleware 实例——没有 skills 参数的自定义子智能体则不会。当存在技能时,技能状态在两个方向都是完全隔离的:父智能体的技能对子智能体不可见,子智能体的技能也不会传播回父智能体。最佳实践
编写清晰的描述
主智能体使用描述来决定调用哪个子智能体。要具体: ✅ 好:"Analyzes financial data and generates investment insights with confidence scores"
❌ 差: "Does finance stuff"
保持系统提示详细
包含关于如何使用工具和格式化输出的具体指导:最小化工具集
只给子智能体他们需要的工具。这可以提高专注度和安全性:根据任务选择模型
不同的模型擅长不同的任务:返回简洁的结果
指示子智能体返回摘要,而不是原始数据:常见模式
多个专业化子智能体
为不同领域创建专业化子智能体:- 主智能体创建高层计划
- 将数据收集委派给 data-collector
- 将结果传递给 data-analyzer
- 将洞察发送给 report-writer
- 编译最终输出
上下文管理
当您使用运行时上下文调用父智能体时,该上下文会自动传播到所有子智能体。每个子智能体运行都会收到您在父级invoke / ainvoke 调用中传递的相同运行时上下文。
这意味着在任何子智能体内运行的工具都可以访问您提供给父智能体的相同上下文值:
每个子智能体的上下文
所有子智能体都接收相同的父上下文。要传递特定于某个子智能体的配置,可以在扁平的context 映射中使用带命名空间的键(例如,用子智能体名称作为键前缀,如 researcher:max_depth),或者将这些设置建模为上下文类型上的单独字段:
识别哪个子智能体调用了工具
当同一个工具在父智能体和多个子智能体之间共享时,您可以使用lc_agent_name 元数据(与流式传输中使用的值相同)来确定是哪个智能体发起了调用:
runtime.context 读取特定于智能体的设置,并从 runtime.config 元数据中读取 lc_agent_name。
故障排除
子智能体未被调用
问题:主智能体试图自己完成工作,而不是委派。 解决方案:-
使描述更具体:
-
指示主智能体进行委派:
上下文仍然膨胀
问题:尽管使用了子智能体,上下文仍然被填满。 解决方案:-
指示子智能体返回简洁结果:
-
对大量数据使用文件系统:
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

