DeepAgents学习笔记一:构建深度多智能体
作者:技术拾光时间:2026-07-29 19:21:09浏览:395
DeepAgents是基于LangChain核心构建模块的独立库,内置任务规划、文件系统、子智能体生成和长期记忆能力,适用于复杂多步骤自主规划任务。与LangChain(智能体动作框架)和LangGraph(流程运行时)相比,DeepAgents侧重智能体的组织管理与深度协作。
在构建复杂LLM应用的实践中,经常会遇到框架选型的困惑。LangChain、LangGraph和DeepAgents——这三者到底有什么区别?又该如何选择?
一. 概述
DeepAgents是一个独立的库,它建立在LangChain核心构建模块之上,旨在成为构建LLM驱动型智能体和应用的最简便方式。它内置了任务规划功能、用于上下文管理的文件系统、子智能体生成机制和长期记忆能力。这意味着,你可以用它来完成那些复杂、多步骤且需要自主规划的任务。
为了更清晰地理解这三个项目在技术栈中的角色,可以做一个简单类比:
- LangChain(框架):负责“动作”,是核心的智能体框架。它封装了LLM与工具之间的交互方式,提供灵活的智能体结构,但不包含规划、记忆或文件系统,适合开发者自主定制逻辑。
- LangGraph(运行时):负责“流程”,是外层的运行时。它把执行过程转化为可管理的图结构,支持循环、并行和持久化,保障智能体执行的稳定与可控。
- DeepAgents(工具包):负责“组织”,是最外层的工具包。它内置规划器、子智能体、文件系统和持久存储,让智能体从“能执行”升级为“能组织、能管理、能记忆”的深度智能体。
LangChain vs LangGraph vs DeepAgents 使用场景总结
那么,在什么情况下应该选择哪一个?
何时使用 LangChain?
- 你想快速构建智能体与自主应用。
- 你需要对模型、工具、智能体循环提供标准抽象(适用于单智能体场景)。
- 你需要一个易用且灵活的开发框架。
- 你在开发简单直接的智能体应用,没有复杂的编排需求。
何时使用 LangGraph?
- 你需要对智能体编排做细粒度、底层的控制。
- 你需要持久化执行,支持长时间运行、有状态的智能体。
- 你在构建结合确定性步骤与智能体步骤的复杂工作流。
- 你需要可直接用于生产环境的智能体部署基础设施。
何时使用 Deep Agents SDK?
- 你在构建长期运行、持续运营、自主规划的智能体。
- 你在构建需要处理复杂、多步骤任务的智能体。
- 你需要使用预定义工具:如文件系统操作、自定义工具、自动化上下文工程等。
- 你希望直接使用预设提示词与子智能体能力。
二. 构建子智能体
1. 通过 dict 配置 Subagents 子智能体
使用字典来配置子智能体是最直接的方式。下面代码中的注释说明了每个参数的作用,简单明了。
# 案例4: 演示字典类型创建子智能体!! 并且演示异步执行
from langchain.chat_models import init_chat_model
from deepagents import create_deep_agent
import os
import asyncio
from dotenv import load_dotenv, find_dotenv
import json
from langchain_core.tools import tool
load_dotenv()
# 极简初始化(自动读取OPENAI环境变量)
model = init_chat_model(model="qwen-max", model_provider="openai",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL"))
model_2 = init_chat_model(model="qwen3.5-plus-2026-04-20", model_provider="openai",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL"))
# 示例:创建一个主智能体,它拥有三个助手
@tool
def get_weather():
"""获取天气信息"""
return "今天天气晴朗,温度28度,湿度0.8"
# 1. 创建一个天气助手
weather_agent = {
"name": "weather_helper", # 名称
"description": "用于查询天气信息智能助手,当用户询问查询天气的时候,调用此助手完成任务!", # 描述,给main_agent看的
"system_prompt": "你是一个天气查询助手'", # 系统提示词,给llm模型看的
"tools": [get_weather],
"model": model_2
}
# 2. 计算助手
math_agent = {
"name": "math_helper", # 名称
"description": "用于处理数据计算问题!", # 描述,给main_agent看的
"system_prompt": "你是一个严谨的数学助手,帮助用户回答计算算数等问题!", # 系统提示词,给llm模型看的
"tools": []
}
translate_agent = {
"name": "translate_helper", # 名称
"description": "用于中英相互翻译的助手!", # 描述,给main_agent看的
"system_prompt": "你是一个中英翻译助手,如果是中文翻译成英文,如果是英文就翻译成对应的中文!", # 系统提示词,给llm模型看的
"tools": []
}
# 4. 创建主智能体
main_agent = create_deep_agent(
model=model,
tools=[],
subagents=[weather_agent, math_agent, translate_agent],
system_prompt="你是一个全能管家,你会根据用户的需求,调用对应子智能体和助手实现对应的功能!注意:不能自己执行,必须调用子智能体!"
)
async def test_steam(query):
"""使用mainagent执行传入的问题"""
stream = main_agent.astream({"messages": [{"role": "user", "content": query}]})
async for chunk in stream:
for node_name, state in chunk.items():
if state is None or "messages" not in state:
continue
messages = state["messages"]
if messages and isinstance(messages, list):
last_msg = messages[-1]
if node_name == "model":
if last_msg.tool_calls:
for tool_call in last_msg.tool_calls:
if tool_call['name'] == 'task':
print(f"【model】决定调用子智能体{tool_call['args']['subagent_type']}")
else:
print(f"【model】决定调用子工具{tool_call['name']},传入的参数为:{tool_call['args']}")
elif last_msg.content:
print(f"【model】返回最终结果:{last_msg.content}")
elif node_name == "tools":
name = last_msg.name
content = last_msg.content
print(f"【agent】调用了具体的工具{name},返回结果为:{content[:100]+'...'}")
if __name__ == "__main__":
async def batch_run():
tast1 = test_steam("北京今天的天气怎么样?")
tast2 = test_steam("请将'我要上楼打他'翻译成英文!")
await asyncio.gather(tast1, tast2)
asyncio.run(batch_run())
执行结果:
2. 通过 CompiledSubAgent 自定义智能体
有些场景下,你可能需要用 LangChain 的 create_agent 来构建智能体,然后将其嵌入 DeepAgents 框架中。DeepAgents 为此提供了 CompiledSubAgent 作为兼容桥梁。
# 实验7: langchain create_agent 兼容 deepagents框架
import os
from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
from langchain_core.tools import tool
from deepagents import create_deep_agent, CompiledSubAgent
from dotenv import load_dotenv, find_dotenv
load_dotenv()
model = init_chat_model(model="qwen-max", model_provider="openai",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL"))
@tool
def get_weather(city: str) -> str:
"""查询指定城市的天气"""
return f"{city}的天气是晴朗,25度"
# 使用 langchain 的 create_agent 创建自定义 agent
agent = create_agent(model=model, tools=[get_weather])
# 将其包装为 CompiledSubAgent
custom_subagent = CompiledSubAgent(
name="subagent",
description="子任务,可以调用天气工具,查询天气信息!",
runnable=agent
)
deep_agent = create_deep_agent(
model=model,
tools=[],
system_prompt="你是一个智能助手,主要调用子袋里实现功能,你只做任务分配,可以调用subagent实现功能!!",
subagents=[custom_subagent]
)
stream = deep_agent.stream({"messages": [{"role": "user", "content": "查询北京的天气!"}]})
for chunk in stream:
print(chunk)
print("=" * 100)
执行结果:
