11.DeepAgent的使用案例
DeepResearch
Recruiter
StockResearch
12.几点问题
agent = create_deep_agent(
tools=[internet_search],
system_prompt=research_instructions,
subagents=[critique_sub_agent, research_sub_agent],
)
以research_agent为例,
12.1 主 Prompt 控制流程
在 research_agent 中,整个任务流程由主 prompt(即 research_instructions)驱动,而不是传统的节点与边(graph)形式。
- 优势: 这种设计使得流程更易修改与扩展,开发者只需调整主 prompt 的内容即可快速改变任务逻辑,而无需重新定义复杂的状态图或节点关系。
- 劣势: 由于执行逻辑完全由大模型根据 prompt 自行规划,虽然可以保证整体的流程方向一致,但无法严格保证每次运行时的执行细节完全相同,在一致性和可控性上略逊于基于图结构的实现。
12.2 Subagent 的工具调用机制
在 research_agent 框架中,子智能体(subagent)对工具的调用行为遵循以下规则:
- 如果 subagent 显式设置了
tools参数,则该子智能体仅能调用自己定义的工具。 - 如果 subagent 未显式设置
tools,则它会继承主 agent 的工具配置。
例如:
critique_sub_agent = {
"name": "critique-agent",
"description": "Used to critique the final report. Give this agent some information about how you want it to critique the report.",
"prompt": sub_critique_prompt,
}
在这种情况下,critique-agent 将自动继承主 agent 的工具,例如 internet_search,并可直接调用。 这保证了子智能体既可以保持独立性(当需要定制工具时),又能在默认情况下复用主智能体的工具配置,减少重复定义。
12.3 隐含 Subagent 的设置
即使没有显式定义任何 subagent,系统仍会默认创建一个名为 general_purpose_agent 的通用子智能体。它相当于一个“兜底”代理,用于在没有特定 subagent 可调用时执行一般性任务。
该通用 subagent 的创建逻辑与对应的 prompt 如下:
general_purpose_subagent = create_agent(
default_model,
system_prompt=DEFAULT_SUBAGENT_PROMPT,
tools=default_tools,
middleware=general_purpose_middleware,
)
DEFAULT_SUBAGENT_PROMPT = "In order to complete the objective that the user asks of you, you have access to a number of standard tools."
其中,DEFAULT_SUBAGENT_PROMPT 是一个默认的提示模板,用于指导模型在缺乏具体子任务定义时,仍能执行常规的研究任务。这意味着即使开发者没有定义任何专门的 subagent,research_agent 依然具备基础的任务执行能力,不会因缺少配置而报错或中断。
12.4 自定义中间件的问题
您可以通过两种方式创建中间件:
- 基于装饰器 - 对于单钩中间件来说快速而简单
- 基于类 - 对于具有多个钩子的复杂中间件来说更强大
何时使用装饰器:
- 你需要一个钩子
- 无需复杂配置
何时使用类:
- 需要多个钩子
- 复杂配置
- 可跨项目重用(init 时配置)
基于装饰器的中间件
可用的装饰器
节点样式(在特定执行点运行):
@before_agent- 代理启动前(每次调用一次)@before_model- 每次模型调用之前@after_model- 在每个模型响应之后@after_agent- 代理完成后(每次调用一次)
包装式(拦截和控制执行):
@wrap_model_call- 围绕每个模型调用@wrap_tool_call- 围绕每个工具调用
便利装饰器:
@dynamic_prompt- 生成动态系统提示(相当于修改提示)@wrap_model_call
基于类的中间件
节点样式钩子(在特定执行点按顺序运行。用于日志记录、验证和状态更新。)
在执行流中的特定点运行:
before_agent- 代理启动前(每次调用一次)before_model- 每次模型调用之前after_model- 在每个模型响应之后after_agent- 代理完成后(每次调用最多一次)
包裹式挂钩(通过完全控制处理程序调用来拦截执行。用于重试、缓存和转换。)
调用处理程序时拦截执行和控制:
wrap_model_call- 围绕每个模型调用wrap_tool_call- 围绕每个工具调用
您可以决定处理程序是调用零次(短路)、一次(正常流)还是多次(重试逻辑)。
13.总结
Deep Agent 架构通过结合详细的系统提示、强大的规划工具、高效的文件系统和灵活的子代理,构建了一个能够处理复杂、长周期任务的智能系统。其“Deep”之名不仅指其处理任务的深度和广度,更强调了其内部机制的层次化和模块化,特别是通过子代理实现的多层级 ReAct 能力,使得代理能够像人类一样,将复杂问题分解为更小的、可管理的子任务,并利用专业化的“团队成员”(子代理)来高效解决这些子任务。