LangGraph实现多智能体的方法

news2025/5/25 7:18:30

生活中我们常常需要同时处理多个任务,比如预订旅行时,既要订机票,又要订酒店。如果有一个智能助手能同时帮你搞定这些事情,那该有多方便啊!LangGraph的多智能体系统就能做到这一点。它就像一个超级助手团队,每个成员都有自己的专长,一起合作完成复杂的任务。接下来,我们就来看看这个神奇的多智能体系统是如何工作的。

在LangGraph中,有两种流行的多智能体架构:监督者(Supervisor)和群体(Swarm)。
监督者就像一个团队的领导,它控制所有的通信流程和任务委派,根据当前上下文和任务需求决定调用哪个智能体。
而群体则更像一个自由合作的团队,智能体根据自己的专业领域动态地将控制权交给彼此。

监督者架构

监督者架构中,有一个中央智能体负责协调所有的任务。像一个指挥官,根据任务的需求,将任务分配给不同的智能体。

比如,当你需要预订机票和酒店时,监督者会根据你的需求,将预订机票的任务分配给航班预订智能体,将预订酒店的任务分配给酒店预订智能体。

 pip install langgraph-supervisor
# -*- coding: utf-8 -*-
from langgraph.prebuilt import create_react_agent
from langchain_community.chat_models.tongyi import ChatTongyi

# from langchain_community.llms.tongyi import Tongyi
from langgraph_supervisor import create_supervisor
# pip install langgraph-supervisor

#模型初始化
llm = ChatTongyi(
    model="qwen-max-latest",#qwen-max-latest qwen-plus qwen-turbo
    temperature=0,
    verbose=True,
    )

def book_hotel(hotel_name: str):
   """预订酒店"""
   return f"已成功预订了酒店 {hotel_name}."

def book_flight(from_airport: str, to_airport: str):
    """预订航班"""
    return f"已成功预订了航班 从 {from_airport}{to_airport}."

# Supervisor监督者 多智能体
#酒店智能体
hotel_assistant = create_react_agent(
    model=llm,
    tools=[book_hotel],
    prompt="你是一位酒店预订助手。",
    name="酒店预订助手"
)

#航班智能体
flight_assistant = create_react_agent(
    model=llm,
    tools=[book_flight],
    prompt="你是一位航班预订助手。",
    name="航班预订助手"
)

supervisor = create_supervisor(
    agents=[flight_assistant,hotel_assistant,],
    model=llm,
    prompt=(
        "你管理着一个酒店预订助手和一个航班预订助手,"
        "给他们分配工作任务。完成任务就行"
    )
).compile()

for chunk in supervisor.stream(
    {
        "messages": [
            {
                "role": "user",
                "content": "预订从上海到广州机场的航班" #。预订附近的桔子酒店。
            }
        ]
    }
):
    print(chunk)
    print("\n")

#会调用失败,应该是Tongyi阿里千问对消息tool_calls现在不支持的原因
# 带有角色 "tool" 的消息必须是对带有 "tool_calls" 的前一条消息的响应。

运行结果截图

在这里插入图片描述

在这个例子中,监督者会根据用户的输入,将任务分配给相应的智能体。
比如,当用户输入“预订从上海到广州的航班”时,监督者会将这个任务分配给航班预订智能体。

群体架构

与监督者架构不同,群体架构中的智能体可以根据自己的专业领域动态地将控制权交给彼此。这种架构更灵活,智能体之间可以根据任务的需要自由地切换控制权。

pip install langgraph-swarm
# -*- coding: utf-8 -*-
from langgraph.prebuilt import create_react_agent
from langchain_community.chat_models.tongyi import ChatTongyi

# from langchain_community.llms.tongyi import Tongyi
from langgraph_supervisor import create_supervisor
from langgraph.prebuilt import create_react_agent
from langgraph_swarm import create_swarm, create_handoff_tool

#模型初始化
llm = ChatTongyi(
    model="qwen-max-latest",#qwen-max-latest qwen-plus qwen-turbo
    temperature=0,
    verbose=True,
    )

def book_hotel(hotel_name: str):
   """预订酒店"""
   return f"已成功预订了酒店 {hotel_name}."

def book_flight(from_airport: str, to_airport: str):
    """预订航班"""
    return f"已成功预订了航班 从 {from_airport}{to_airport}."
    
# Swarm群体 多智能体
# pip install langgraph-swarm


transfer_to_hotel_assistant = create_handoff_tool(
    agent_name="酒店预订助手",
    description="将用户转接至酒店预订助手。",
)
transfer_to_flight_assistant = create_handoff_tool(
    agent_name="航班预订助手",
    description="将用户转接至航班预订助手。",
)

flight_assistant = create_react_agent(
    model=llm,
    tools=[book_flight, transfer_to_hotel_assistant],
    prompt="你是一位航班预订助手。",
    name="航班预订助手"
)
hotel_assistant = create_react_agent(
    model=llm,
    tools=[book_hotel, transfer_to_flight_assistant],
    prompt="你是一位酒店预订助手。",
    name="酒店预订助手"
)

swarm = create_swarm(
    agents=[flight_assistant, hotel_assistant],
    default_active_agent="航班预订助手"
).compile()

for chunk in swarm.stream(
    {
        "messages": [
            {
                "role": "user",
                "content": "预订从上海到广州机场的航班。预订附近的桔子酒店。" 
            }
        ]
    }
):
    print(chunk)
    print("\n")

运行结果截图(返回结果)

在这里插入图片描述

在这个例子中,航班预订智能体和酒店预订智能体可以根据任务的需要自由地切换控制权。

比如,当用户输入“预订从上海到广州的航班。预订附近的桔子酒店。”时,航班预订智能体会先处理预订航班的任务,然后通过转接工具将控制权交给酒店预订智能体,让它处理预订酒店的任务。

交接机制(Handoffs)

在多智能体系统中,智能体之间需要进行有效的协作。
LangGraph通过交接机制(handoffs)来实现这一点。交接机制允许一个智能体将控制权“交接”给另一个智能体,并传递必要的信息。

在多代理交互中,一个常见的模式是交接(handoffs),其中一个代理将控制权“交接”给另一个代理。交接允许你指定:

  • 目标代理(destination):要导航到的目标代理
  • 有效载荷(payload):要传递给该代理的信息

langgraph-supervisor(监督者将控制权交给各个代理)和langgraph-swarm(一个代理可以将控制权交给其他代理)都使用了交接。

要使用 create_react_agent 实现交接,需要创建一个特殊的工具,可以将控制权转移到不同的代理,将这些组合在一起。

以下是如何实现一个包含两个代理的简单多代理系统——一个航班预订助手和一个酒店预订助手:

# -*- coding: utf-8 -*-
from langgraph.prebuilt import create_react_agent
from langchain_community.chat_models.tongyi import ChatTongyi

# from langchain_community.llms.tongyi import Tongyi
from langgraph_supervisor import create_supervisor

from typing import Annotated
from langchain_core.tools import tool, InjectedToolCallId
from langgraph.prebuilt import create_react_agent, InjectedState
from langgraph.graph import StateGraph, START, MessagesState
from langgraph.types import Command

# pip install langgraph-supervisor

#模型初始化
llm = ChatTongyi(
    model="qwen-max-latest",#qwen-max-latest qwen-plus qwen-turbo
    temperature=0,
    verbose=True,
    )

def create_handoff_tool(*, agent_name: str, description: str | None = None):
    name = f"transfer_to_{agent_name}"
    description = description or f"转接到 {agent_name}"

    @tool(name, description=description)
    def handoff_tool(
        state: Annotated[MessagesState, InjectedState],
        tool_call_id: Annotated[str, InjectedToolCallId],
    ) -> Command:
        tool_message = {
            "role": "tool",
            "content": f"已成功转接到 {agent_name}",
            "name": name,
            "tool_call_id": tool_call_id,
        }
        return Command(
            goto=agent_name,
            update={"messages": state["messages"] + [tool_message]},
            graph=Command.PARENT,
        )
    return handoff_tool

# 交接
transfer_to_hotel_assistant = create_handoff_tool(
    agent_name="酒店预订助手",
    description="将用户转接至酒店预订助手。",
)
transfer_to_flight_assistant = create_handoff_tool(
    agent_name="航班预订助手",
    description="将用户转接至航班预订助手。",
)

# 简单代理工具
def book_hotel(hotel_name: str):
    """预订酒店"""
    return f"已成功预订了酒店 {hotel_name}."

def book_flight(from_airport: str, to_airport: str):
    """预订航班"""
    return f"已成功预订了航班从 {from_airport}{to_airport}."

# 定义代理
flight_assistant = create_react_agent(
    model=llm,
    tools=[book_flight, transfer_to_hotel_assistant],
    prompt="你是一位航班预订助手。",
    name="航班预订助手"
)
hotel_assistant = create_react_agent(
    model=llm,
    tools=[book_hotel, transfer_to_flight_assistant],
    prompt="你是一位酒店预订助手。",
    name="酒店预订助手"
)

# 定义多代理图
multi_agent_graph = (
    StateGraph(MessagesState)
    .add_node(flight_assistant)
    .add_node(hotel_assistant)
    .add_edge(START, "航班预订助手")
    .compile()
)

# 运行多代理图
for chunk in multi_agent_graph.stream(
    {
        "messages": [
            {
                "role": "user",
                "content": "预订从上海到广州机场的航班。并预订附近的桔子酒店。"
            }
        ]
    }
):
    print(chunk)
    print("\n")


运行结果截图(返回结果)

在这里插入图片描述

在这个例子中,create_handoff_tool函数创建了一个转接工具,它允许一个智能体将控制权转交给另一个智能体,并传递必要的信息。

总结

LangGraph的多智能体系统通过分工合作的方式,让智能对话变得更高效。无论是监督者架构还是群体架构,都能根据任务的需要灵活地分配任务和切换控制权。

交接机制则让智能体之间的协作更加顺畅。在实际应用中,多智能体系统可以大大简化复杂的任务,让我们的生活更加便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2385175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聚铭安全管家平台2.0重磅发布——大模型智驱高效降本新方向

【聚铭安全管家平台2.0正式发布】在数字化安全威胁日益严峻的背景下,聚铭网络创新推出安全管家平台2.0,首创"云端智能区域中台本地终端"三级协同架构,深度融合AI安全大模型技术,实现威胁智能研判与自动化响应。该平台通…

使用注解动态映射:根据实体List列表动态生成Excel文件

我们一般通过POI来生成对应的Excel文件,绝大多数情况是需要手动编写单元格内容,然后顺序填充值,今天我们将动态根据实体来生成Excel表头,同时自动填充内容。 文章目录 1. 定义注解2. 实体类应用注解3. 动态导出工具类 1. 定义注解…

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png,显示检查栏,序列栏 第六章 stack viewport 显…

【循环位运算——uint32,DP】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; using uint unsigned;const int N 1010;ll f[N][N]; uint a[N]; int n, m;int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i 1; i < n; i)cin …

贪心介绍 LeetCode 455.分发饼干 LeetCode 376. 摆动序列 LeetCode 53. 最大子序和

贪心介绍 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 eg: 有一堆钞票&#xff0c;你可以拿走十张&#xff0c;如果想达到最大的金额&#xff0c;你要怎么拿&#xff1f; 指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的钱。每次拿最大的就…

Postgresql 数据库体系架构

1 postgresql 软件目录 rootu24-pg-110:~# tree -L 1 /usr/local/postgresql-17/ /usr/local/postgresql-17/ ├── bin #可执行二进制文件 ├── include ├── lib └── share 2 数据库目录及文件 #目录结构 base --每个数据库的子目录 global --数据库集簇范…

Vue框架1(vue搭建方式1,vue指令,vue实例生命周期)

一.VUE vue概述(vue.js) vue是前端JavaScript框架,对JavaScript进行封装,是一套用于构建用户界面的渐进式框架.vue的核心只关注图示层,不仅易上手,还便于与第三方库或既有的项目整合. vue.js和Angular.js,React.js一起,并称为前端三大主流框架 注意: 在此初步学习的是vue…

skywalking 10.2 源码编译

1.源码下载 Downloads | Apache SkyWalking 选择 SkyWalking APM 最新版下载&#xff0c; 下载后&#xff0c;在本地解压。 2.Idea加载工程 2.1 根目录pom文件删除checkstyle 插件 后续做二开时避免代码风格校验报错 2.2 删除apm-webapp 工程中 frontend-maven-plugin插件…

C++ --- string

C --- string 简介1、构造函数2、迭代器&#xff08;主流的遍历方式&#xff09;2.1字符串经典遍历和修改的方式2.2使用迭代器遍历和修改字符串2.3使用范围for遍历对象&#xff08;C11支持的新特性&#xff09; 3、常见&#xff0c;常用方法或重载3.1查询大小和容量管理3.2增3.…

Android Studio 连接夜神模拟器 自动断开的问题

版本情况&#xff1a; Android Studio Meerkat Feature Drop | 2024.3.2 Build #AI-243.25659.59.2432.13423653, built on April 30, 2025 Runtime version: 21.0.6-13368085-b895.109 amd64夜神模拟器 V7.0.5.9046 问题描述&#xff1a; cmd命令行使用adb连接夜神模拟器成…

Python入门手册:Python中的数据结构类型

在Python中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;它们允许你以高效的方式操作和处理数据。Python提供了几种内置的数据结构&#xff0c;包括列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;和字典&a…

巡礼中国西极·跨越昆仑天山 | 北斗卫星徽章护航昆仑科考

神秘深邃&#xff0c;遗世独立。帕米尔高原&#xff0c;横亘于中亚东南部&#xff0c;我国的最西端&#xff0c;面积约10万平方千米&#xff0c;平均海拔4500米以上&#xff0c;古代丝绸之路在此经过。昆盖山&#xff0c;一座掩藏在帕米尔高原褶皱深处、鲜为人知的山脉&#xf…

Vue常用自定义指令-积累的魅力【VUE】

前言 在【自定义指令—v2与v3之间的区别【VUE基础】一文中&#xff0c;整理了自定义指令部分vue2和vue3 两个版本的区别&#xff0c;有兴趣的伙伴或者针对自定义部分比较迷茫的伙伴可以跳转看一下。此次主要介绍一些自己积累的一些自定义指令的代码&#xff0c;与大家一起分享。…

LangChain4j第三篇: RAG的简单应用与实践

引言:RAG 构建属于你的大模型 大语言模型(LLM)的知识体系本质上仅限于它所接受的训练数据。 其一在知识时效性方面,模型参数固化于训练完成的时点,而现实世界中的知识和信息持续动态更新。 其二在非公开数据层面,企业内部的机密文档(如产品设计图、商业策略等)及个人隐…

功能强大且易于使用的 JavaScript 音频库howler.js 和AI里如何同时文字跟音频构思想法

howler.js 是一个功能强大且易于使用的 JavaScript 音频库&#xff0c;它提供了跨浏览器的音频播放功能&#xff0c;支持多种音频格式&#xff0c;并且具有丰富的 API&#xff0c;可以方便地控制音频的播放、暂停、循环、音量等。下面是如何在 Vue 项目中使用 howler.js 实现音…

如何使用patch-package给npm包打补丁

一、背景 在移动应用开发中,轮播是一种很常见的效果,我们项目采用的是RN跨平台技术,RN的轮播我们直接使用的是第三方插件:react-native-snap-carousel。不过,当我们在项目中使用的时候却发现Android和iOS的表现不一致:https://stackoverflow.com/questions/60711611/rea…

maxkey单点登录系统

github地址 https://github.com/MaxKeyTop/MaxKey/blob/master/README_zh.md 1、官方镜像 https://hub.docker.com/u/maxkeytop 2、MaxKey:Docker快速部署 参考地址&#xff1a; Docker部署 | MaxKey单点登录认证系统 拉取docker脚本MaxKey: Dromara &#x1f5dd;️MaxK…

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内

windows bat 在目录下(包括子目录)搜索批量指定文件名称复制到另一个文件夹内 前言&#xff1a;最近遇到一个需求&#xff0c;我有15个文件夹(可能包含子文件夹) &#xff0c;目前我有一批文件名称&#xff0c;需要在这15个文件夹中查找出来&#xff0c;并拷贝到一个新的文件夹…

Notepad++ 下载与安装教程(小白专属)

文章目录 Notepad下载渠道的专业选择1. 官方网站下载&#xff08;海外用户或网络条件优越者首选&#xff09;2. 国内优化下载地址&#xff08;国内用户高效选择&#xff09; Notepad精细化安装流程解析总结与后续建议 在当前的开发与文本处理工作中&#xff0c;Notepad无疑是一…

Spring Cloud Gateway 微服务网关实战指南

上篇文章简单介绍了SpringCloud系列OpenFeign的基本用法以及Demo搭建&#xff08;Spring Cloud实战&#xff1a;OpenFeign远程调用与服务治理-CSDN博客&#xff09;&#xff0c;今天继续讲解下SpringCloud Gateway实战指南&#xff01;在分享之前继续回顾下本次SpringCloud的专…