当前位置: 首页 > article >正文

LangGraph实现多智能体的方法

生活中我们常常需要同时处理多个任务,比如预订旅行时,既要订机票,又要订酒店。如果有一个智能助手能同时帮你搞定这些事情,那该有多方便啊!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-turbotemperature=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-turbotemperature=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-swarmtransfer_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_supervisorfrom 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-turbotemperature=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的多智能体系统通过分工合作的方式,让智能对话变得更高效。无论是监督者架构还是群体架构,都能根据任务的需要灵活地分配任务和切换控制权。

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

相关文章:

LangGraph实现多智能体的方法

生活中我们常常需要同时处理多个任务,比如预订旅行时,既要订机票,又要订酒店。如果有一个智能助手能同时帮你搞定这些事情,那该有多方便啊!LangGraph的多智能体系统就能做到这一点。它就像一个超级助手团队&#xff0c…...

wordpress主题开发中常用的12个模板文件

在WordPress主题开发中,有多种常用的模板文件,它们负责控制网站不同部分的显示内容和布局,以下是一些常见的模板文件: 1.index.php 这是WordPress主题的核心模板文件。当没有其他更具体的模板文件匹配当前页面时,Wor…...

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

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

Android singleTop启动模式开启新页面

在Android开发中,Activity的启动模式(Launch Mode)对应用的行为和用户体验影响非常大。其中,singleTop是一种常见的启动模式,但它常常让开发者困惑:当一个Activity设置为singleTop时,如何才能重新打开一个新的页面(实例)? 本文将详细解析singleTop启动模式的机制,为…...

使用注解动态映射:根据实体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;最终结果就是拿走最大数额的钱。每次拿最大的就…...

算法学习笔记·数学·快速幂

题目:(AcWing) 给定 n 组 ai,bi,pi&#xff0c;对于每组数据&#xff0c;求出 aibimodpi 的值。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含三个整数 ai,bi,pi。 输出格式 对于每组数据&#xff0c;输出一个结果&#xff0c;表示 abiimodpi 的值。 每…...

Postgresql 数据库体系架构

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

[创业之路-377]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观之社会发展趋势:数字化、智能化、个性化的趋势对初创公司的战略机会

数字化、智能化、个性化趋势为初创公司带来了捕捉长尾需求、提升运营效率、创新商业模式等战略机会&#xff0c;具体分析如下&#xff1a; 一、数字化趋势带来的战略机会 捕捉长尾需求&#xff1a;数字化技术能够帮助初创公司更好地捕捉市场中的长尾需求&#xff0c;满足那些…...

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

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

分布式系统核心技术全解析

目录 分布式系统的本质 分布式系统的核心特点 分布式系统的典型应用场景 分布式系统的挑战 CAP理论 一、CAP 三要素定义 1. 一致性&#xff08;Consistency&#xff09; 2. 可用性&#xff08;Availability&#xff09; 3. 分区容错性&#xff08;Partition Tolerance…...

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…...

《P3435 [POI 2006] OKR-Periods of Words》

题目描述 一个字符串是由有限个小写英文字母组成的序列。特别地&#xff0c;它可以是一个空序列&#xff0c;即由 0 个字母组成的序列。我们用 ABC 表示字符串 A 是通过连接字符串 B 和 C&#xff08;按此顺序&#xff09;得到的&#xff08;即一个接一个地写在一起&#xff0…...

C/C++---隐式显式转换

1. 隐式转换&#xff08;Implicit Conversion&#xff09; 隐式转换是编译器主动进行的类型转换&#xff0c;无需程序员额外编写代码。这种转换一般发生在赋值、函数调用、表达式计算等场景中。 1.1 隐式转换的常见场景 数值类型转换&#xff1a;从较小的类型转换为较大的类…...

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

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

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

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

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

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

机器学习第二十六讲:官方示例 → 跟着菜谱学做经典菜肴

机器学习第二十六讲&#xff1a;官方示例 → 跟着菜谱学做经典菜肴 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 以跟着菜谱学…...

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

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

品鉴JS的魅力之防抖与节流【JS】

前言 小水一波&#xff0c;函数的防抖与节流。 文章目录 前言介绍实现方式防抖节流 介绍 防抖与节流的优化逻辑&#xff0c;在我们的日常开发中&#xff0c;有着一定的地位。 防抖和节流是两种常用的性能优化技术&#xff0c;用于限制某个函数在一定时间内被触发的次数,减少不…...

如何使用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的专…...