Langchain deepagents:Agent架构的四大支柱

 

AI的未来,绝不是LLM在循环中调用工具那么简单。那种“浅层”模式已显疲态,真正的进化在于“Deep Agent”——一种全新的AI架构范式。本文将为你深度剖析其四大核心支柱:详细提示、规划工具、子Agent与文件系统,并结合deepagents开源库的核心代码,为你揭示其工作原理。准备好告别“玩具”,从代码层面理解并构建下一代真正强大的智能体。


你的AI Agent为何如此“健忘”且“短视”?

你是否也曾满怀激情地构建了一个AI Agent,期望它能成为你的得力干将,自主完成复杂的研究报告或编码项目?但现实往往是:你的Agent在执行了几步之后,就像一条只有七秒记忆的金鱼,忘记了最初的目标,开始在无意义的循环中打转,或者干脆“跑偏”到十万八千里外。

我们一直被告知,AI Agent的未来是“LLM+工具”的循环调用。然而,无数次的失败案例告诉我们,这种简单的模式存在天然的“浅层”缺陷。它无法进行长期规划,无法管理复杂的上下文,更无法在多步骤任务中保持专注。

那么,像Anthropic的Claude Code或初创公司Manus那样,能够在软件工程、深度研究等领域大放异彩的应用,它们成功的秘诀又是什么?答案并非更强的LLM模型,而是一种全新的架构范式——Deep Agent

 告别浅滩:Deep Agent的四大核心支柱

一个“Deep Agent”远非简单的工具堆砌,它是一套系统性的方法论,通过四个紧密协作的支柱,赋予AI智能体深度思考和执行复杂任务的能力。

构成Deep Agent的四大关键特性


支柱一:超详细系统提示 (Detailed System Prompt)

策略:为Agent注入灵魂

Deep Agent的性能,首先源于其“灵魂”——一份长篇大论、极其详尽的“出厂说明书”。它远不止“你是一个助手”,而是包含了对Agent角色的精细定义、工具使用规范、few-shot示例、任务管理规则的综合体。

deepagents中,这份“说明书”是动态组合的。create_deep_agent函数会将开发者传入的instructions与内置的base_prompt进行拼接,共同构成最终的系统提示。

#
# 文件: deepagents/graph.py
#
defcreate_deep_agent(
    tools: Sequence[...],
    instructions: str# <-- 开发者传入的自定义指令
    ...
):
    # 将自定义指令与内置的基础提示拼接
    prompt = instructions + base_prompt
    ...
    return create_react_agent(
        model,
        prompt=prompt, # <-- 最终注入Agent的完整提示
        tools=all_tools,
        ...
    )

# 文件: deepagents/prompts.py
# (内置提示的一部分,展示其详细程度)
WRITE_TODOS_DESCRIPTION = """Use this tool to create and manage a structured task list...
## When to Use This Tool
Use this tool proactively in these scenarios:
1. Complex multi-step tasks...
2. Non-trivial and complex tasks...
## Examples of When to Use the Todo List
 User: I want to add a dark mode toggle... Assistant: I'll help add a dark mode toggle... *Creates todo list with the following items:*...
"""

这种设计兼具了通用性和定制性。base_prompt确保了Agent理解如何使用规划、文件等内置能力,而instructions则允许开发者为其注入特定领域的知识和任务要求,共同塑造了一个既懂规矩又有专业技能的Agent。


支柱二:规划工具 (Planning Tool)

战术:用“空操作”强迫思考

这是最精妙的设计之一。核心规划工具write_todos,本质上是一个“空操作”(no-op)。它不执行任何外部动作,其唯一目的就是通过“语境工程”(Context Engineering),强迫Agent将思考过程外化为结构化的任务清单,并固定在上下文中,从而对抗“注意力漂移”。

write_todos工具的玄机在于它的返回值。它不返回一个字符串,而是返回一个Command对象,这个对象的作用是直接修改LangGraph的状态(State)。

#
# 文件: deepagents/tools.py
#
from langgraph.types import Command
from langgraph.prebuilt import InjectedState
from .state import Todo, DeepAgentState

@tool(description=WRITE_TODOS_DESCRIPTION)
defwrite_todos(
    todos: list[Todo],
    tool_call_id: Annotated[str, InjectedToolCallId]
) -> Command: # <-- 注意返回值类型
    # 返回一个Command对象,用于更新状态
    return Command(
        update={
            "todos": todos, # <-- 直接更新状态机中的'todos'字段
            "messages": [
                ToolMessage(f"Updated todo list to {todos}", tool_call_id=tool_call_id)
            ],
        }
    )

当Agent调用write_todos时,它实际上是在向LangGraph的中央状态机DeepAgentState发送一个更新指令。DeepAgentState中有一个todos: list[Todo]字段,这个指令会用新的计划列表覆盖旧的。因此,这个工具的“副作用”就是修改了Agent自身的记忆,这是一种高效、安全的内部状态管理方式。


支柱三:子Agent (Sub Agents)

艺术:“语境隔离”实现分工

当业界普遍追求更大的上下文窗口时,Deep Agent通过“语境隔离”(Context Quarantine)提出了反直觉但更高效的策略。主Agent不亲自处理所有细节,而是将复杂的子任务“外包”给拥有干净上下文的专家子Agent,从而保持自身战略规划的清晰性。

“外包”动作是通过一个名为task的特殊工具实现的。这个工具由_create_task_tool函数动态创建。当主Agent调用task工具时,它实际上是在激活一个子Agent执行器。

#
# 文件: deepagents/sub_agent.py
#
def_create_task_tool(tools, instructions, subagents: list[SubAgent], model, state_schema):
    # ...为'general-purpose'和自定义subagent创建不同的agent执行器...
    agents = { "general-purpose": create_react_agent(...) }
    for _agent in subagents:
        agents[_agent["name"]] = create_react_agent(...)

    @tool(...)
    deftask(
        description: str,
        subagent_type: str# <-- 主Agent指定要调用的子Agent类型
        state: Annotated[DeepAgentState, InjectedState],
        ...
    
):
        # ...
        sub_agent = agents[subagent_type] # 获取对应的子Agent执行器
        # 准备一个“干净”的初始状态,只包含任务描述
        sub_agent_state = {"messages": [{"role""user""content": description}]}
        # 独立调用子Agent
        result = sub_agent.invoke(sub_agent_state)
        # 将子Agent的结果(如文件更新)合并回主Agent的状态
        return Command(
            update={ "files": result.get("files", {}), ... }
        )

    return task

分析: 关键在于sub_agent.invoke(sub_agent_state)这一步。主Agent将任务打包成一个全新的、极简的sub_agent_state传递给子Agent。子Agent在一个隔离的环境中运行,完全不受主Agent庞杂上下文的干扰。任务完成后,子Agent的结果通过Command被选择性地合并回主Agent的状态,实现了信息的受控交换。


支柱四:文件系统 (File System)

基石:“虚拟硬盘”与协作空间

为了实现长期记忆和多Agent协作,Agent需要一个持久化的工作空间。deepagents提供了一套文件系统工具,但为了安全和隔离,它是一个“虚拟文件系统”。

所有文件操作工具(read_filewrite_fileedit_file)的核心秘密在于,它们操作的不是真实磁盘,而是DeepAgentState中的一个字典字段files。这通过InjectedState实现。

#
# 文件: deepagents/state.py
#
classDeepAgentState(AgentState):
    # ...
    # 定义了files字段,它是一个字典
    files: Annotated[NotRequired[dict[strstr]], file_reducer]

#
# 文件: deepagents/tools.py
#
@tool(description=TOOL_DESCRIPTION)
defread_file(
    file_path: str,
    # 通过类型注解,LangGraph会自动将当前状态注入到这个参数中
    state: Annotated[DeepAgentState, InjectedState],
    ...
) -> str:
    """Read file."""
    # 从状态中获取虚拟文件系统
    mock_filesystem = state.get("files", {})
    if file_path notin mock_filesystem:
        returnf"Error: File '{file_path}' not found"
    return mock_filesystem[file_path] # 从字典中读取内容

state: Annotated[DeepAgentState, InjectedState]这个参数是魔法所在。LangGraph看到它,就会自动将整个DeepAgentState对象作为参数state传入。因此,read_file函数直接从state中名为files的字典里读取数据。同理,write_fileedit_file也是通过返回一个Command来更新这个字典。这套机制优雅地实现了一个存在于内存中、随状态流转的安全虚拟文件系统。

 结论与展望

我们正站在AI Agent发展的分水岭。简单的“LLM+工具”循环模式已经触及其天花板。

Deep Agent架构通过其四大支柱,为我们展示了前进的方向。它通过引入结构化的思考(规划工具)、专业化的分工(子Agent)、持久化的记忆(文件系统)和明确的使命(详细提示),成功地将Agent从一个被动的“工具使用者”提升为了一个主动的“项目管理者”。

随着deepagents这类开源工具的普及和其背后设计哲学的传播,开发者将能够更快地在代码生成、科学研究、商业分析等复杂领域,构建出真正强大、可靠的自主智能体。

是时候告别浅滩,向深海航行了。


推荐阅读

  • • deepagents GitHub 仓库: https://github.com/hwchase17/deepagents


 


(文:子非AI)

发表评论