前言
上篇文章《LangChain DeepAgents 速通指南(四)—— FileSystem中间件:让AI Agent拥有系统级记忆管理能力》深入探讨了LangChain的文件管理中间件。回顾整个系列,截至目前笔者已陆续讲解了四种关键中间件:Summarization(记忆管理中间件)、TodoList(任务规划中间件)、ToolSelector(工具选择中间件)以及FileSystem(文件管理中间件)。
这些中间件与LangChain的 create_agent API 相结合,共同构成了LangChain团队推出的深度框架——DeepAgents。借助这一框架,仅需数十行代码,大家便可构建出一个类似Claude Code的深度智能体,堪称未来开发中必须掌握的关键技术之一。
从本期内容开始,笔者将和大家一起系统学习DeepAgents框架的使用技巧。作为开篇,今天笔者先快速介绍DeepAgents框架的基本使用方法及其核心特性。
一、为什么需要DeepAgents框架
当大家使用 LangChain 的 create_agent API 构建智能体时,其底层本质是利用 LangGraph 创建了一个 ReAct 图(不熟悉 ReAct 图的朋友,可以参考我的文章《深入浅出LangGraph AI Agent智能体开发教程(八)——LangGraph底层API实现ReACT智能体》)。在这种架构下,智能体会循环调用工具,直到问题解决——这其实是 Agent 最简单的工作模式。然而,这种简单的架构限制了 Agent 的“深度”,使其难以有效规划并执行更长时序、更复杂的任务。
如何解决构建复杂深度智能体的难题呢?LangChain 团队的 CEO Harrison Chase 从 Claude Code、Manus 等表现出色的深度智能体项目中汲取灵感,编写了最初的 DeepAgents 框架。其核心思路是将详尽提示、任务规划、子代理和文件系统四个能力相结合,推动 Agent 实现从“浅”至“深”的转变。该项目随后经过不断迭代完善,最终被纳入 LangChain 官方库,成为基于 LangChain 和 LangGraph 底层能力的开源框架。
DeepAgents 的核心思想其实非常直观:为了让智能体能够更深入地探讨并完成用户需求,它需要具备规划复杂解决方案、并在更长的时间范围内逐个解决子任务的能力,最终整合达成整体目标。DeepAgents 的核心优势,正是对以下四个基本能力的合理运用:
- 规划与任务分解能力
DeepAgents 内置了 TodoList 和 File System 工具,使 Agent 能够将复杂任务拆解为离散步骤,实时跟踪进展,并根据新信息的出现动态调整计划。 - 上下文管理能力
通过 File System 提供的ls、read_file、write_file、edit_file等工具,Agent 可以将复杂的上下文内容“卸载”到外部存储中,有效防止上下文窗口溢出。同时,借助 Summarization 记忆压缩中间件,Agent 可以灵活处理长度不确定的工具返回结果。 - 子代理生成能力
DeepAgents 内置了 Task 工具,使主 Agent 能够针对特定任务动态生成子代理。这样一来,主 Agent 的上下文可以保持“干净”,同时又具备深入处理复杂子任务的能力。(子代理能力笔者会在后续章节详细展开讲解) - 长期记忆能力
利用不同类型的后端(Backend)进行信息存储,DeepAgents 可以将具备持久记忆的 Agent 扩展到跨线程场景。这意味着 Agent 能够保存并检索过往对话中的信息,为当前任务提供更智能的辅助。
二、DeepAgents快速上手:基本用法与核心特性
2.1 DeepAgents的定位
在具体实现上,大家可以直接导入 deepagents 包中的 create_deep_agent 函数,快速构建深度智能体。该函数本质上是对 LangChain 中 create_agent 函数的一层封装,额外配备了处理复杂任务所需的常用配置(例如笔者之前介绍过的各种中间件及内置函数)。
总体而言,create_agent 与 create_deep_agent 是两种形式相似但定位不同的创建方式,大家可以根据实际场景灵活选用:
-
当面对简单任务时,直接使用
create_agent即可快速满足需求。 -
而
create_deep_agent则更适合以下复杂场景:- 需要多步规划和拆解的多步骤任务;
- 需要借助文件系统工具管理大量上下文的任务;
- 需要将子任务委托给专门子代理(Sub-agent)执行的任务;
- 需要跨对话、跨线程持久化保存记忆的任务。
2.2 DeepAgents的基本使用
下面笔者将通过一个具体案例,帮助大家快速上手并理解 DeepAgents 的用法。
- 环境配置:使用 Anaconda 创建虚拟环境,并在其中安装
deepagents包:
conda create -n langchaindeepagents python=3.12
conda activate langchaindeepagents
pip install -U deepagents
- 创建项目文件:编写如下代码。这里笔者让 DeepAgents 协助撰写一份关于伊朗和美国文化的分析报告。模型同样使用 DeepSeek,并引入
rich库来美化命令行输出(可通过pip install rich安装):
from dotenv import load_dotenv
from deepagents import create_deep_agent
from langchain_deepseek import ChatDeepSeek
from deepagents.backends import FilesystemBackend
load_dotenv()
model = ChatDeepSeek(
model="deepseek-chat",
)
-
使用
create_deep_agent构建智能体: 该 API 有几个关键参数值得关注:system_prompt:用户自定义的系统提示。DeepAgents 本身已配置了一段默认系统提示,用户提供的提示会被追加在其之前。tools:与create_agent一致,接收一个工具对象列表。backend:DeepAgents 默认集成了 File System 中间件,其后端配置可通过该参数直接传入。subagents:DeepAgents 支持通过子智能体完成复杂任务,这些子智能体可以是由 LangChain 或 LangGraph 构建的智能体实例。
research_instruction = """
你是一位从事国际关系研究的专家,能够分析不同国家的国情,并按照用户的要求生成报告
"""
agent = create_deep_agent(
model=model,
tools=[],
system_prompt=research_instruction,
subagents=[],
backend=FilesystemBackend(root_dir="./test_dir", virtual_mode=True)
)
- 执行任务。笔者这里给智能体一个具体任务:“请分析伊朗和美国的国情,并帮我撰写一份1500字左右的为什么伊朗和美国会对立的报告”。DeepAgents 的执行方式与
create_agent完全一致,这里采用流式输出,并借助 Rich 库优化显示效果,方便直观感受运行过程。(关于 LangChain 流式输出的更多细节,可参考文章《LangChain1.0速通指南(二)——LangChain1.0 create_agent api 基础知识》, 笔者之后也会撰写专门文章分析如何处理DeepAgents的流式输出)
for event in agent.stream(
{"messages": [{"role": "user", "content": query}]},
stream_mode="values"
):
step_num += 1
console.print(f"\n[bold yellow]{'─' * 80}[/bold yellow]")
console.print(f"[bold yellow]步骤 {step_num}[/bold yellow]")
console.print(f"[bold yellow]{'─' * 80}[/bold yellow]")
if "messages" in event:
messages = event["messages"]
if messages:
msg = messages[-1]
# 保存最终响应
if hasattr(msg, 'content') and msg.content and not hasattr(msg, 'tool_calls'):
final_response = msg.content
# AI 思考
if hasattr(msg, 'content') and msg.content:
# 如果内容太长,只显示前300字符作为预览
content = msg.content
if not (hasattr(msg, 'tool_calls') and msg.tool_calls):
preview = content
console.print(Panel(
preview,
title="[bold green]AI 思考[/bold green]",
border_style="green"
))
else:
console.print(Panel(
content,
title="[bold green]AI 思考[/bold green]",
border_style="green"
))
# 工具调用
if hasattr(msg, 'tool_calls') and msg.tool_calls:
for tool_call in msg.tool_calls:
tool_info = {
"工具名称": tool_call.get('name', 'unknown'),
"参数": tool_call.get('args', {})
}
console.print(Panel(
JSON(json.dumps(tool_info, ensure_ascii=False)),
title="[bold blue]工具调用[/bold blue]",
border_style="blue"
))
# 工具响应
if hasattr(msg, 'name') and msg.name:
response = str(msg.content)
console.print(Panel(
response,
title=f"[bold magenta]工具响应: {msg.name}[/bold magenta]",
border_style="magenta"
))
console.print("\n[bold green]任务完成![/bold green]\n")
-
执行过程分析:一起来完整分析上述代码的执行步骤:
- 收到任务后,智能体会首先调用
write_todos工具,编写任务规划。
- 收到任务后,智能体会首先调用
- 随后,智能体按照规划列表开始执行。这里值得注意的是:虽然并未传入自定义的
subagents,但智能体在分析伊朗和美国国情时,感知到这两部分可以并行处理,于是自动调用task工具,利用当前 DeepSeek 模型开启了两个并行的子智能体同时进行资料整理。这正是 DeepAgents 框架的一大特色。
- 完成相关子任务后,智能体会更新任务状态,将已完成项标记为
completed,并继续迭代,直至生成最终报告。
- 最终生成的报告如下,DeepAgents还会进一步的审阅和修改报告,确保报告生成的完整性
以上就是本期分享的全部内容,本文的全部代码可关注笔者的同名微信公众号大模型真好玩,每期分享涉及的代码均可在公众号私信: LangChain智能体开发免费获取。
三、总结
本文分享了 LangChain DeepAgents 框架的诞生背景与核心优势,并通过实战案例演示了其快速上手的完整流程。可以看到,DeepAgents 在任务规划、上下文管理、子代理并行执行等方面展现出强大的能力,仅需少量代码即可构建复杂智能体。下一章节,笔者将深入探究 DeepAgents 中子智能体的运行机制,包括其创建方式、通信机制与任务委托流程,大家敬请期待~
本系列相关内容均列于笔者的专栏《深入浅出LangChain&LangGraph AI Agent 智能体开发》,该专栏适合所有对 LangChain 感兴趣的学习者,无论之前是否接触过 LangChain。该专栏基于笔者在实际项目中的深度使用经验,系统讲解了使用LangChain/LangGraph如何开发智能体,目前已更新 42 讲,并持续补充实战与拓展内容。欢迎感兴趣的同学关注笔者的掘金账号与专栏,也可关注笔者的同名微信公众号大模型真好玩,每期分享涉及的代码均可在公众号私信: LangChain智能体开发免费获取。