Skip to content
On this page

11.DeepAgent的使用案例

DeepResearch

Recruiter

StockResearch

https://medium.com/@sagarnreddy/i-built-a-research-agent-like-claudes-analysis-tools-using-langchain-deepagents-795f51a3a63f

12.几点问题

python
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 的工具配置

例如:

python
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 如下:

python
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 自定义中间件的问题

您可以通过两种方式创建中间件:

  1. 基于装饰器 - 对于单钩中间件来说快速而简单
  2. 基于类 - 对于具有多个钩子的复杂中间件来说更强大

何时使用装饰器:

  • 你需要一个钩子
  • 无需复杂配置

何时使用类:

  • 需要多个钩子
  • 复杂配置
  • 可跨项目重用(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 能力,使得代理能够像人类一样,将复杂问题分解为更小的、可管理的子任务,并利用专业化的“团队成员”(子代理)来高效解决这些子任务。