langgraph实现多轮对话
本文提出了一种支持多轮交互的多智能体架构,通过引入特殊中断节点实现用户输入收集与智能体跳转。文章以影院和餐厅推荐为例,详细介绍了实现步骤:1)初始化大模型和检查点;2)创建影院推荐智能体,根据用户位置推荐3家影院;3)创建就餐推荐智能体,基于影院位置推荐周边餐厅;4)设计特殊节点处理用户中断输入;5)封装两个智能体节点;6)构建网状多智能体图结构。测试结果表明,该系统能有效实现"观影-用
在使用智能体时,很多情况下需要与智能体进行多个轮次的交互。为支持多轮次交互,使用多智能体架构实现时,需要增加一个特殊节点,在该节点内部产生中断并收集用户的输入,再携带用户输入跳转到其他的智能体,然后对智能体进行封装,基于智能体的调用结果,跳转到特殊节点。
本文实现一个多智能体,实现影院推荐和就餐场所推荐,帮助先欣赏电影,再享受美食。选择就餐场所时需要参考影院的位置。 下面将分步骤实现。
1.准备工作
准备工作导入必要的库,初始化大模型和检查点,具体代码如下:
from langgraph.graph import MessagesState, StateGraph, START
from langgraph.prebuilt import create_react_agent, InjectedState
from langgraph.types import Command, interrupt
from langgraph.checkpoint.memory import InMemorySaver
from langchain_openai import ChatOpenAI
from langchain_mcp_adapters.client import MultiServerMCPClient
from typing import Literal
from langgraph.checkpoint.memory import InMemorySavermodel = ChatOpenAI(
model = 'qwen-plus',
api_key = "sk-*",
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1")checkpointer = InMemorySaver()#因为有中断所以必须要有检查点
2.创建影院推荐智能体
影院推荐智能体根据用户提供的地理位置及其他要求进行推荐,具体代码如下:
cinema_mentor = create_react_agent(
model,
tools=[],
prompt=(
"你是一个电影爱好者,对于北京的影院都很熟悉,包括位置、特点等"
"你能够根据用户的位置和要求给用户推荐影院,数量不超过3个"
"如果需要咨询就餐问题,直接求助 consult_restaurant_mentor"
"在跳转到其他智能体时必须携带对人来说友好易读的推荐结果."
"不需额外发挥"
),
)
调用影院推荐智能体:
cinema_mentor.invoke(
{'messages':
[
{'role':'user', 'content':'请推荐北京市西城区西直门附近5公里以内的\
3家影院,要求环境舒适和安静。'}]}
)['messages'][-1]
输出结果如下:
AIMessage(content='当然可以!以下是北京市西城区西直门附近5公里以内,环境舒适且安静的3家影院推荐:\n\n1. **保利国际影城(北辰店)** \n - **地址**:西城区北三环中路29号院2号楼(近马甸桥东南角,距西直门约3.5公里) \n - **特点**:影厅空间宽敞,座椅舒适,隔音效果好,观影氛围安静。影城整体装修现代,常有IMAX场次,适合追求高品质观影体验的观众。 \n - **交通便利**:地铁10号线安贞门站B口出步行约8分钟。\n\n2. **星美国际影商城(凯德MALL西直门店)** \n - **地址**:西城区西直门外大街1号凯德MALL购物中心5层(距西直门地铁仅200米) \n - **特点**:地理位置极佳,商场内环境整洁,影厅采用杜比全景声技术,座位间距合理,观影时干扰少,整体较为安静。适合观影后顺便逛街或用餐。 \n - **注意**:周末人流略多,建议选择工作日或早场以获得更安静体验。\n\n3. **UME影城(双井店,西直门西北方向约4.8公里)** \n - **地址**:海淀区中关村南大街2号中关村广场购物中心(近国家图书馆站,距西直门约4.8公里) \n - **特点**:虽然位于海淀交界,但在服务和环境上口碑极佳。影厅私密性强,空调与灯光控制得当,座椅为皮质沙发式设计,整体安静舒适,是文艺片和小众影片爱好者的优选。 \n\n如您需要在观影前后安排用餐,我可以为您推荐周边高评分餐厅。是否需要我为您咨询就餐建议? \n👉 需要的话,请告诉我您的口味偏好,我将为您跳转至 **consult_restaurant_mentor** 获取贴心推荐。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 436, 'prompt_tokens': 106, 'total_tokens': 542, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'qwen-plus', 'system_fingerprint': None, 'id': 'chatcmpl-f72f6a08-7982-4b26-a494-e5a9fce2f303', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--de437c86-c6c6-4688-a7f6-dbbd7ed5059e-0', usage_metadata={'input_tokens': 106, 'output_tokens': 436, 'total_tokens': 542, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}})
3.创建就餐推荐智能体
就餐推荐智能体根据观影地点及菜系、菜品、价格等因素推荐对应的餐馆,具体代码如下:
restaurant_mentor = create_react_agent(
model,
tools=[],
prompt=(
"你是一个美食家,对于北京的就餐场所都很熟悉,包括位置、菜品、菜系、价格等"
"你能够根据用户的位置和要求给用户推荐就餐场所"
"如果需要咨询影院问题,直接求助 consult_cinema_mentor"
"在跳转到其他智能体时必须携带对人来说友好易读的推荐结果."
"不需额外发挥"
),
)
调用就餐推荐智能体,具体代码如下:
restaurant_mentor.invoke({'messages':[{'role':'user', 'content':'请推荐北京市西直门附近的中餐馆。'}]})
输出结果如下:
{'messages': [HumanMessage(content='请推荐北京市西直门附近的中餐馆。', additional_kwargs={}, response_metadata={}, id='2e73ff4d-5462-4342-8266-18ca6db1d28a'),
AIMessage(content='当然可以!以下是北京市西直门附近几家口碑不错的中餐馆推荐,适合不同口味和预算需求:\n\n---\n\n**1. 小吊梨汤(枫蓝国际店)** \n- **菜系**:京味菜 / 老北京风味 \n- **推荐菜**:小吊梨汤、炸酱面、京酱肉丝、爆肚 \n- **人均消费**:约 80 元 \n- **地址**:西城区西直门枫蓝国际购物中心4楼 \n- **特点**:环境古色古香,菜品地道,适合家庭聚餐或朋友小聚。\n\n---\n\n**2. 海底捞火锅(西直门店)** \n- **菜系**:川味火锅 \n- **推荐菜**:番茄锅底、手切牛肉、虾滑、毛肚 \n- **人均消费**:约 120 元 \n- **地址**:西城区西直门外大街1号凯德MALL 5层 \n- **特点**:服务极佳,适合多人聚餐,提供免费美甲、小吃等贴心服务。\n\n---\n\n**3. 大董烤鸭店(西直门店)** \n- **菜系**:新京菜 / 高端烤鸭 \n- **推荐菜**:酥不腻烤鸭、樱桃鹅肝、凉拌木耳 \n- **人均消费**:约 300 元 \n- **地址**:西城区西直门外大街1号凯德MALL 4层 \n- **特点**:环境优雅,适合商务宴请或重要节日聚餐,烤鸭品质上乘。\n\n---\n\n**4. 簋街胡大饭馆(西直门店)** \n- **菜系**:川菜 / 湘菜,以小龙虾闻名 \n- **推荐菜**:麻辣小龙虾、馋嘴蛙、干锅肥肠 \n- **人均消费**:约 100 元 \n- **地址**:西城区西直门外大街凯德MALL 3层 \n- **特点**:人气火爆,口味偏重,适合喜欢辣味的朋友。\n\n---\n\n**5. 味千拉面(西直门凯德店)** \n- **虽然主打日式拉面,但也提供中式简餐** \n- **推荐菜**:红烧牛肉面、小笼包、卤味拼盘 \n- **人均消费**:约 50 元 \n- **地址**:凯德MALL 1层 \n- **特点**:快捷方便,适合工作日简餐。\n\n---\n\n如您有具体偏好(如清淡/重口、预算范围、是否需要包间等),我可以进一步为您筛选推荐。需要订座建议或近期优惠信息也可以告诉我哦!\n\n如果您计划观影后用餐,我也可以帮您联动影院信息 —— 只需告诉我您的观影安排即可(可使用 `consult_cinema_mentor` 获取影院建议)。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 627, 'prompt_tokens': 95, 'total_tokens': 722, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'qwen-plus', 'system_fingerprint': None, 'id': 'chatcmpl-ccf0b08c-258a-42f6-9382-3fadbede7ae4', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None}, id='run--c63a71b1-1ac4-47e6-9b0b-048e53c1562e-0', usage_metadata={'input_tokens': 95, 'output_tokens': 627, 'total_tokens': 722, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}})]}
4.定义特殊节点
该节点内调用interrupt产生中断,并且等待用户输入,然后携带用户输入调到当前前一个激活节点(也就是进入本节点之前的节点),具体代码如下:
class State(MessagesState):
prev_active_agent: str #prev_activate_agent保存当前激活的节点def human_node(
state: State, config
) -> Command[Literal["consult_cinema_mentor", "consult_restaurant_mentor", "human_node"]]:
"""A node for collecting user input."""
user_input = interrupt(value="Ready for user input.")active_agent = state["prev_active_agent"]
return Command(
update={
"messages": [
{
"role": "human",
"content": user_input,
}
]
},
goto=active_agent,#返回前一个激活节点
)
5.封装影院推荐智能体封装
定义一个节点,在节点内调用影院推荐智能体,并携带智能体返回的结果跳转至特殊节点human_node,具体代码如下:
def consult_cinema_mentor(state: State):
response = cinema_mentor.invoke(state)#调用影院推荐智能体
return Command(
goto='human_node',
update={"messages":[response['messages'][-1]], 'prev_active_agent':'consult_restaurant_mentor'}#设置自己为前一个激活节点
)
6.封装就餐推荐智能体
定义一个节点,在节点内调用就餐推荐智能体,并携带智能体返回的结果跳转至特殊节点human_node,具体代码如下:
def consult_restaurant_mentor(state: State):
response = restaurant_mentor.invoke(state)#调用就餐推荐智能体
return Command(
goto='human_node',
update={"messages":[response['messages'][-1]], 'prev_active_agent':'consult_restaurant_mentor'}#设置自己为前一个激活节点
)
7.构建多智能体
基于图和以上的特殊节点和两个封装节点构建多智能体,该多智能体位网状多智能体,具体代码如下:
multi_agents_graph = (
StateGraph(State)
.add_node(consult_cinema_mentor)
.add_node(consult_restaurant_mentor)
.add_node(human_node)
.add_edge(START, "consult_cinema_mentor")
.compile(checkpointer=checkpointer)
)
8.测试
发起咨询请求,具体代码如下:
config = {"configurable": {"thread_id": "1"}}
for chunk in multi_agents_graph.stream(
{
"messages": [
{
"role": "user",
"content": "我家住在北京市西城区西直门附近,我想在家附近5公里内的影院看电影,然后再进餐。"
}
]
},
config=config,
subgraphs=True
):
pretty_print_messages(chunk)
输出如下:
Update from subgraph consult_cinema_mentor:
Update from node agent:
================================== Ai Message ==================================
以下是为您推荐的北京市西城区西直门附近5公里内的三家优质影院,交通便利,观影后可轻松就近用餐:
1. **星美国际影城(凯德MALL·西直门店)**
- 地址:西城区西直门外大街136号凯德MALL 4层(距西直门地铁站步行约5分钟)
- 推荐理由:地理位置极佳,就在您家附近,商场环境舒适,影厅设备新,排片丰富,支持多种购票优惠。
- 餐饮配套:商场内餐饮选择丰富,观影后可直接用餐。
2. **金逸影城(北京动物园店)**
- 地址:西城区西外大街143号国奥体育中心商业楼3层(距西直门约3公里)
- 推荐理由:人流量适中,观影体验安静舒适,部分影厅配备4D特效,适合家庭或朋友结伴观影。
- 餐饮配套:周边有华宇购物中心和中瑞美食街,餐饮氛围浓厚。
3. **保利国际影城(北沙滩店)**
- 地址:海淀区北三环中路67号(距西直门约4.5公里,地铁10号线直达)
- 推荐理由:IMAX巨幕效果出色,是追求高品质视听体验的优选。
- 餐饮配套:紧邻牡丹园商圈,多家连锁餐厅集中,适合观影后聚餐。
📌 **首选推荐**:建议优先选择**星美国际影城(凯德MALL·西直门店)**,位置最近,观影与用餐一站式完成,省时省力。
consult_restaurant_mentor 我已为家住西直门的用户确定三家5公里内的推荐影院,尤其是星美影城(凯德MALL店)为首选。请根据凯德MALL及周边实际餐饮情况,推荐几家步行可达、口碑好、适合观影后用餐的餐厅,覆盖中餐、火锅、轻食等类型,并区分人均消费(如80元以下、80-120元),方便用户按预算选择。
在consult_restaurant_mentor产生中断,等待用户输入,模拟用户输入:
for chunk in multi_agents_graph.stream(
Command(resume="保利国际影城(北沙滩店))很好,继续推荐餐馆"),
config=config,
subgraphs=True
):pretty_print_messages(chunk)
输出如下:
Update from subgraph consult_restaurant_mentor:
Update from node agent:
================================== Ai Message ==================================
您选择的**保利国际影城(北沙滩店)**位于海淀区北三环中路67号,紧邻地铁10号线**牡丹园站**,交通便捷,是北京北部地区观影体验一流的影院之一,尤其以IMAX厅画面震撼、音效出色著称。观影结束后,周边步行10分钟内有丰富餐饮选择,满足不同口味与预算需求。
以下是为您精选的、**影院周边步行可达、口碑优良、适合观影后用餐**的餐厅推荐:
---
### 🍽 保利国际影城(北沙滩店)周边餐厅推荐
#### 1. **眉州东坡酒楼(牡丹园店)**
- 距离:约300米,步行4分钟
- 菜系:经典川菜(连锁品牌,环境优雅)
- 推荐菜:东坡肘子、口水鸡、宫保鸡丁、毛血旺
- 人均:90–120元
- 适合:家庭聚餐、朋友聚会
- 特点:口味正宗但不过于辛辣,老少皆宜,服务稳定。
#### 2. **云海肴(牡丹园店)**
- 距离:约400米,步行6分钟
- 菜系:云南菜(主打天然食材、健康风味)
- 推荐菜:汽锅鸡、黑松露炒饭、玫瑰鲜花饼、凉米线
- 人均:80–95元
- 适合:喜欢清淡、养生饮食的观众
- 特点:汤品鲜美,菜品颜值高,环境清新。
#### 3. **将太无二(牡丹园店)**
- 距离:约200米,步行3分钟
- 菜系:创意日料 / 融合料理
- 推荐菜:鳗鱼寿司、辣味增汤、鹅肝酱芦笋、三文鱼刺身
- 人均:95元左右
- 适合:轻食爱好者、情侣约会
- 特点:上菜快,摆盘精致,适合不想吃太油腻的夜晚。
#### 4. **小吊梨汤(牡丹园店)**
- 距离:约500米,步行7分钟
- 菜系:京味融合菜(主打养生汤品)
- 推荐菜:小吊梨汤、老北京炸酱面、糖卷果、乾隆白菜
- 人均:70–85元
- 适合:秋冬季节暖身用餐,怀旧京味
- 特点:汤品润肺解腻,菜品接地气又不失格调。
#### 5. **和合谷(牡丹园店)**
- 距离:约200米,步行3分钟
- 菜系:中式快餐(米饭套餐为主)
- 推荐菜:宫保鸡丁饭、藤椒鸡腿饭、红烧牛肉饭
- 人均:40–60元
- 适合:时间紧张、追求性价比的简餐选择
- 特点:出餐快,干净卫生,支持外带。
---
✅ **按需求推荐组合**:
- 💼 想吃得讲究一点:选 **眉州东坡** 或 **将太无二**
- 🍲 偏好清淡养生:选 **云海肴** 或 **小吊梨汤**
- ⏱ 时间紧/预算有限:选 **和合谷**
所有推荐餐厅均在影院出口步行范围内,无需额外交通工具,轻松实现“看完电影,马上开饭”。
祝您观影愉快,晚餐也吃得满足!🎬🍽
在consult_restaurant_mentor内产生中断,等待用户输出,模拟用户输入:
for chunk in multi_agents_graph.stream(
Command(resume="小吊梨汤(牡丹园店)."),
config=config,
subgraphs=True
):pretty_print_messages(chunk)
输出如下:
Update from subgraph consult_restaurant_mentor:
Update from node agent:
================================== Ai Message ==================================
您选择了**小吊梨汤(牡丹园店)**,这是一家极具京味情怀又注重养生的融合菜餐厅,距离**保利国际影城(北沙滩店)**仅约500米,步行7分钟即可到达,是观影后温暖惬意用餐的理想选择。
---
### 🍐 小吊梨汤(牡丹园店)用餐指南
- **地址**:北京市海淀区牡丹园西里13号(近北三环中路,牡丹园地铁站C口向西约400米)
- **营业时间**:10:30 – 22:00(建议观影结束后前往,避开高峰)
- **人均消费**:70–85元
- **推荐理由**:菜品融合老北京风味与现代健康理念,汤品暖心,适合秋冬季节,也适合不想吃太油腻的夜晚。
---
### 🌟 必点推荐菜
1. **小吊梨汤**(招牌必喝)
- 用雪梨、银耳、枸杞慢炖而成,清甜润肺,解腻又养生,特别适合看完电影后饮用。
2. **老北京炸酱面**
- 手工面条劲道,炸酱咸香适中,搭配六样菜码(黄瓜丝、豆芽、萝卜等),地道京味十足。
3. **糖卷果**(传统京味甜点)
- 糯米裹山药、红枣油炸后撒上糖桂花,外酥内糯,香气扑鼻,是老北京人记忆中的味道。
4. **乾隆白菜**
- 用芝麻酱拌新鲜白菜心,口感爽脆,微甜开胃,适合搭配主食或火锅类菜品。
5. **京味烤鸭卷**(迷你版)
- 小份量体验烤鸭风味,饼皮柔软,搭配甜面酱和葱丝,方便分享。
---
### 👨👩👧👦 适合场景
- 家庭聚餐:长辈喜欢的传统口味
- 情侣约会:环境温馨,灯光柔和
- 朋友小聚:菜品多样,氛围轻松
---
🎬 **观影+用餐动线建议**:
1. 在**保利国际影城**观看19:00左右的电影
2. 电影结束后(约21:00)步行前往小吊梨汤
3. 点一锅暖暖的**小吊梨汤**,来碗**炸酱面**,结束完美夜晚
---
✅ 温馨提示:周末晚间可能需等位,建议提前通过“大众点评”或“美团”线上取号。
祝您电影看得精彩,晚餐吃得暖心!🍐🍜
更多推荐


所有评论(0)