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智能体深度思考和执行复杂任务的能力。

支柱一:超详细系统提示 (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_file
, write_file
, edit_file
)的核心秘密在于,它们操作的不是真实磁盘,而是DeepAgentState
中的一个字典字段files
。这通过InjectedState
实现。
#
# 文件: deepagents/state.py
#
classDeepAgentState(AgentState):
# ...
# 定义了files字段,它是一个字典
files: Annotated[NotRequired[dict[str, str]], 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_file
和edit_file
也是通过返回一个Command
来更新这个字典。这套机制优雅地实现了一个存在于内存中、随状态流转的安全虚拟文件系统。
结论与展望
我们正站在AI Agent发展的分水岭。简单的“LLM+工具”循环模式已经触及其天花板。
Deep Agent架构通过其四大支柱,为我们展示了前进的方向。它通过引入结构化的思考(规划工具)、专业化的分工(子Agent)、持久化的记忆(文件系统)和明确的使命(详细提示),成功地将Agent从一个被动的“工具使用者”提升为了一个主动的“项目管理者”。
随着deepagents
这类开源工具的普及和其背后设计哲学的传播,开发者将能够更快地在代码生成、科学研究、商业分析等复杂领域,构建出真正强大、可靠的自主智能体。
是时候告别浅滩,向深海航行了。
推荐阅读
-
• deepagents
GitHub 仓库: https://github.com/hwchase17/deepagents
(文:子非AI)