在使用智能体时,很多情况下需要与智能体进行多个轮次的交互。为支持多轮次交互,使用多智能体架构实现时,需要增加一个特殊节点,在该节点内部产生中断并收集用户的输入,再携带用户输入跳转到其他的智能体,然后对智能体进行封装,基于智能体的调用结果,跳转到特殊节点。

        本文实现一个多智能体,实现影院推荐和就餐场所推荐,帮助先欣赏电影,再享受美食。选择就餐场所时需要参考影院的位置。  下面将分步骤实现。    

     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 InMemorySaver

model = 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. 点一锅暖暖的**小吊梨汤**,来碗**炸酱面**,结束完美夜晚
    
    ---
    
    ✅ 温馨提示:周末晚间可能需等位,建议提前通过“大众点评”或“美团”线上取号。
    
    祝您电影看得精彩,晚餐吃得暖心!🍐🍜


 

Logo

更多推荐