DeepAgents学习笔记一(构建深度多智能体)

DeepAgents LangChain vs LangGraph vs DeepAgents

Subagents自智能体

一. 概述

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子智能体

dict的可传递参数查询

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)

执行结果:

相关推荐
万物皆对象6661 小时前
切换路由时页面空白问题(vue3)
前端·vue.js·typescript
突然好热1 小时前
TS 调试技巧
前端·javascript·typescript
h64648564h1 小时前
Flutter 国际化(i18n)全指南:一键切换中/英/日多语言
前端·javascript·flutter
令人头秃的代码0_01 小时前
AI时代下,如何做原子代码拆分
前端
我材不敲代码3 小时前
Python 函数核心:位置参数与关键字参数详解
java·前端·python
Kratzdisteln3 小时前
【无标题】
前端·python
Curvatureflight3 小时前
前端国际化 i18n 落地实践:语言包、动态文案和格式化问题怎么处理?
前端·c++·vue
kTR2hD1qb3 小时前
Claude Code Skill的介绍与使用
java·前端·数据库·人工智能
修己xj4 小时前
打造专属博文封面神器:一个开源免费的博文封面生成器ThisCover
前端