DeepAgents LangChain vs LangGraph vs DeepAgents
一. 概述

DeepAgents是一个独立库,建立在 LangChain代理核心构建模块之上,是构建由大型语言模型(LLM)驱动的代理和应用的最简单方式------内置任务规划功能、用于上下文管理的文件系统、子代理生成和长期记忆。可以用它完成复杂、多步骤、切自主规划的任务。
- LangChain (Framework) :做 "动作",是核心的代理框架。它封装了 LLM 与工具的交互,提供灵活的代理结构,但不包含规划、记忆或文件系统,适合开发者自己定制逻辑。
- LangGraph (Runtime) :管 "流程",是外层的运行时。它把执行变成可管理的图结构,支持循环、并行和持久化,保障智能体执行的稳定与可控。
- DeepAgents (Harness) :负责 "组织",是最外层的工具包。它内置规划器、子代理、文件系统和持久存储,让智能体从 "能执行" 升级为 "能组织、能管理、能记忆" 的深度智能体。

LangChain vs LangGraph vs DeepAgents

LangChain、LangGraph、Deep Agents 使用场景总结:
(1). 何时使用 LangChain?
markdown
- 你想**快速构建代理与自主应用**。
- 你需要对**模型、工具、代理循环**提供标准抽象。(单Agent)
- 你需要**易用且灵活**的开发框架。
- 你在开发**简单直接的代理应用**,无复杂编排需求。
(2). 何时使用 LangGraph?
markdown
- 你需要对**代理编排做细粒度、底层控制**。
- 你需要**持久化执行**,支持**长时间运行、有状态的代理**。
- 你在构建**结合确定性步骤与智能代理步骤**的复杂工作流。
- 你需要**可直接用于生产环境**的代理部署基础设施。
(3). 何时使用 Deep Agents SDK?
markdown
- 你在构建**长期运行、持续运营、自主规划**的智能代理。
- 你在构建需要处理**复杂、多步骤任务**的代理。
- 你需要使用**预定义工具**:如文件系统操作、自定义工具、自动化上下文工程等。
- 你希望直接使用**预设提示词与子代理**能力。
二. 构建子智能体
1.通过dict 配置sbuagetns子智能体

python
# 案例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")
)
"""
**示例**:创建一个主智能体,它拥有三个助手:
1. **天气助手**:查询天气(固定返回"晴朗")。
2. **计算助手**:处理数学问题。
3. **翻译助手**:负责中英互译。
"""
@tool
def get_weather():
"""获取天气信息"""
return "今天天气晴朗,温度28度,湿度0.8"
# 1. 创建一个天气助手
weather_agent = {
"name":"weather_helper", # 名称
"description":"用于查询天气信息智能助手,当用户询问查询天气的时候,调用此助手完成任务!", # 描述,给main_agent看的
"system_prompt":"你是一个天气查询助手'", # 系统提示词,给lm模型看的
"tools":[get_weather],
"model":model_2
}
# 2. 计算助手
math_agent = {
"name":"math_helper", # 名称
"description":"用于处理数据计算问题!", # 描述,给main_agent看的
"system_prompt":"你是一个严谨的数学助手,帮助用户回答计算算数等问题!", # 系统提示词,给lm模型看的
"tools":[]
# "model": # Optional override, defaults to main agent model 默认是主智能体的模型
}
translate_agent = {
"name":"translate_helper", # 名称
"description":"用于中英相互翻译的助手!", # 描述,给main_agent看的
"system_prompt":"你是一个中英翻译助手,如果是中文翻译成英文,如果是英文就翻译成对应的中文!", # 系统提示词,给lm模型看的
"tools":[]
# "model": # Optional override, defaults to main agent model 默认是主智能体的模型
}
# 4. 创建主智能体
main_agent = create_deep_agent(
model=model,
tools=[],
subagents=[weather_agent, math_agent, translate_agent],
system_prompt="你是一个全能管家,你会根据用户的需求,调用对应子智能体和助手实现对应的功能!注意:不能自己执行,必须调用子智能体!"
)
async def test_steam(query):
"""
使用mainagent执行传入的问题
:param query:
:return:
"""
stream = main_agent.astream({
"messages":[
{"role":"user", "content":query}
]
})
async for chunk in stream:
# chunk -> {"model / tools " : {"messages":[{},{},{}]}}
# model | {messages : []}
for node_name , state in chunk.items():
# 如果state是None,或者state没有messages我们就跳过!!
if state is None or "messages" not in state: continue
# 获取messages数据
messages = state["messages"]
if messages and isinstance(messages, list):
last_msg = messages[-1]
# 决定如何处理 node_name = model 1. 大模型决定调用工具 2. 大模型决定调用子agent 3.大模型返回结果了
# || node_name = tools 调用自己的工具,并获取返回结果
if node_name == "model":
# model = 》 返回的结果 =》 决定调用哪些
if last_msg.tool_calls:
# 决定调用子工具或者subAgent
for tool_call in last_msg.tool_calls:
if tool_call['name'] == 'task':
# 决定调用某个subAgent
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":
# agent = > 调用自己的工具了,并获取了结果
name = last_msg.name
content = last_msg.content
print(f"【agent】调用了具体的工具{name},返回结果为:{content[:100]+'...'}")
# test_steam("北京今天的天气怎么样?")
# # test_steam("998+889 运算后等于多少?")
# #test_steam("请将'我要上楼打他'翻译成英文!并且查询今天北京的天气信息!")
# test_steam("请将'我要上楼打他'翻译成英文!")
if __name__ == "__main__":
# asyncio.run(test_steam("北京今天的天气怎么样?"))
async def batch_run():
# 要执行的并发协程对象获取到
tast1 = test_steam("北京今天的天气怎么样?") # 不会立即执行!返回一个 coroutine 对象 |必须用 await asyncio.run() 才能真正执行
tast2 = test_steam("请将'我要上楼打他'翻译成英文!")
print(type(tast1))
print(type(tast2))
await asyncio.gather(tast1,tast2) # 同时启动多个异步任务,并发执行
asyncio.run(batch_run())
"""
创建deepagent -> 配置工具和子智能体以及同步执行(invoke / stream)
如何异步执行!! astream -》 async for
"""
执行结果:

2.通过CompiledSubAgent自定义智能体
ini
# 实验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()
# 极简初始化(自动读取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")
)
@tool
def get_weather(city: str) -> str:
"""查询指定城市的天气"""
return f"{city}的天气是晴朗,25度"
# Create a custom agent langchain
agent = create_agent(
model=model,
tools=[get_weather]
)
# Use it as a custom subagent
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)
执行结果:
