Type something to search...
使用 LangGraph 构建 AI 🤖 代理:第 11 部分 - 构建餐厅和天气推荐...

使用 LangGraph 构建 AI 🤖 代理:第 11 部分 - 构建餐厅和天气推荐...

Welcome back to the LangGraph系列! 🎉 在这一部分,我们将把迄今为止学到的所有内容提升到一个新水平,创建一个完全整合的现实世界用例:餐厅与天气推荐系统。想象一下你正在计划一个约会之夜——如果有一个AI可以根据活动和天气建议最佳餐厅,那该多好啊?这正是我们今天要构建的内容!

有什么新内容?🌟 在这篇文章中,你将了解:

  • 多智能体协调: 多个AI智能体(如天气和餐厅搜索)如何协同工作以实现共同目标。
  • 工具集成: 使用外部API(如DuckDuckGo和OpenWeatherMap)获取实时数据。
  • 状态管理: 在子图和父图之间共享和转换数据。
  • 现实世界应用: 创建一个基于事件的实用推荐系统。

目标 🎯 我们正在构建一个系统,其中:

  1. 用户请求特定地点和事件的餐厅推荐。
  2. 系统检查天气预报。
  3. 它获取该地点该事件的高评分餐厅。
  4. 最后,AI根据天气条件建议最佳去处——或者是否更适合待在家里。

让我们深入代码吧! 💻

1️⃣ 设置环境 🛠️

我们将首先加载必要的库并初始化Groq模型:

import datetime
from dotenv import load_dotenv
from typing_extensions import TypedDict, Annotated

from langgraph.prebuilt import ToolNode, tools_condition
from langchain_groq import ChatGroq
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages

from langchain_community.tools import DuckDuckGoSearchRun

load_dotenv()

llm = ChatGroq(model="llama-3.3-70b-versatile")

2️⃣ 定义状态和工具 🧠

我们为天气和餐厅子图定义状态。

class WeatherState(TypedDict):
    messages: Annotated[list, add_messages]
    weather_report: str

class Restaurant(TypedDict):
    name: Annotated[str, ..., "餐厅名称"]
    address: Annotated[str, ..., "餐厅地址"]
    details: Annotated[str, ..., "餐厅详情"]

class RestaurantState(TypedDict):
    messages: Annotated[list, add_messages]
    location: str
    event: str
    date: str
    restaurants: list[Restaurant]

3️⃣ 构建天气子图 🌦️

天气子图获取实时天气数据并进行格式化。

def weather_assistant(state: WeatherState):
    return {"messages": [llm.invoke(state["messages"])]}

def weather_formatter(state: WeatherState):
    weather_report = ""
    for message in state['messages']:
        weather_report += message.content
    return {"weather_report": weather_report}

weather_builder = StateGraph(WeatherState)
weather_builder.add_node("weather_assistant", weather_assistant)
weather_builder.add_node("weather_formatter", weather_formatter)
weather_builder.add_edge(START, "weather_assistant")
weather_builder.add_edge("weather_assistant", "weather_formatter")
weather_builder.add_edge("weather_formatter", END)

weather_graph = weather_builder.compile()

4️⃣ 构建餐厅子图 🍽️

我们使用DuckDuckGo的搜索工具获取餐厅建议。

def get_restaurants_duckduckGo_tool(query: str) -> str:
    search = DuckDuckGoSearchRun()
    return search.invoke(query)

tools = [get_restaurants_duckduckGo_tool]
llm_with_restaurant_tool = llm.bind_tools(tools)

def restaurant_assistant(state: RestaurantState):
    result = llm_with_restaurant_tool.invoke(state["messages"])
    return {"messages": [result]}

def restaurants_list_formatter(state: RestaurantState):
    search_result = state["messages"][-1].content
    structured_llm = llm.with_structured_output(Restaurant)
    restaurants = structured_llm.invoke(search_result)
    return {"restaurants": restaurants}

restaurant_builder = StateGraph(RestaurantState)
restaurant_builder.add_node("restaurant_assistant", restaurant_assistant)
restaurant_builder.add_node("restaurants_list", restaurants_list_formatter)
restaurant_builder.add_edge(START, "restaurant_assistant")
restaurant_builder.add_edge("restaurant_assistant", "restaurants_list")
restaurant_builder.add_edge("restaurants_list", END)

restaurant_graph = restaurant_builder.compile()

5️⃣ 将子图组合成父图 🌐

父图调用两个子图并提供最终推荐。

class ParentState(TypedDict):
    messages: Annotated[list, add_messages]
    location: str
    date: str
    event: str
    restaurants: list[Restaurant]
    weather_report: str
    recommendation: str

def query_analyzer(state: ParentState):
    return {
        "location": "班加罗尔",
        "date": "星期天",
        "event": "约会夜",
        "messages": state['messages']
    }

def recommendation_analyzer(state: ParentState):
    summary_prompt = (
        f"天气报告: {state['weather_report']}\\n"
        f"餐厅: {state['restaurants']}\\n"
        "根据这些信息,建议外出是否是个好主意,或者待在家里更好。"
    )
    result = llm.invoke(summary_prompt)
    return {"recommendation": result.content}

entry_builder = StateGraph(ParentState)
entry_builder.add_node("query_analyzer", query_analyzer)
entry_builder.add_node("weather_graph", weather_graph)
entry_builder.add_node("restaurant_graph", restaurant_graph)
entry_builder.add_node("recommendation_analyzer", recommendation_analyzer)

entry_builder.add_edge(START, "query_analyzer")
entry_builder.add_edge("query_analyzer", "weather_graph")
entry_builder.add_edge("query_analyzer", "restaurant_graph")
entry_builder.add_edge("weather_graph", "recommendation_analyzer")
entry_builder.add_edge("restaurant_graph", "recommendation_analyzer")
entry_builder.add_edge("recommendation_analyzer", END)

graph = entry_builder.compile()
result = graph.invoke({
    "messages": ["告诉我下周日班加罗尔约会夜的最佳餐厅"]
})

print(result['recommendation'])

6️⃣ 输出 📝

星期天的天气看起来晴朗宜人——外出夜游的完美天气!🌙 以下是班加罗尔约会夜的一些高评分餐厅:
1️⃣ Grasshopper — 美丽的花园座位和美食菜单。
2️⃣ Olive Beach — 浪漫的氛围与地中海美食。
3️⃣ Byg Brewski Brewing Co. — 极好的氛围,手工啤酒和户外座位。

享受你的夜晚! 💕

7️⃣ 关键要点 🔑

  • 子图的力量: 我们使用子图实现模块化和可重用的工作流。
  • 工具集成: DuckDuckGo和天气API将现实世界数据引入我们的系统。
  • 多智能体系统: 天气和餐厅子图独立工作并无缝结合其结果。
  • 状态管理: 数据在子图和父图之间高效流动。

🎯 结论 在系列的这一部分中,我们探讨了子图如何在LangGraph中实现模块化,使我们能够通过将工作流分解为更小的可重用组件来构建复杂的多智能体系统。我们演示了如何管理父图和子图之间的通信,无论它们是否共享相同的状态架构或需要状态转换。

通过利用子图,我们可以构建执行复杂并行任务的AI代理,同时保持代码的清晰和可管理性。LangGraph使用子图组合复杂系统的能力使其成为开发可扩展、模块化AI代理的优秀工具。

💬 你怎么看? 在下面的评论中分享你的想法、问题或建议!

查看我的YouTube频道以获取更多精彩内容! [YouTube频道链接 — Harsha Selvi]

免责声明: 本文使用AI工具进行了重述,部分内容来源于多个来源,以提供全面的概述。

Related Posts

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

AI 研究报告和论文写作 合并两个系统指令以获得两个模型的最佳效果 Perplexity AI 的 Deep Research 工具提供专家级的研究报告,而 OpenAI 的 ChatGPT-o3-mini-high 擅长推理。我发现你可以将它们结合起来生成令人难以置信的论文,这些论文比任何一个模型单独撰写的都要好。你只需要将这个一次性提示复制到 **

阅读更多
让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

Non members click here作为一名软件开发人员,多年来的一个发现总是让我感到惊讶,那就是人们还在 Excel

阅读更多
使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

10 个常见问题解答 本文是我推出的一个名为“10 个常见问题解答”的新系列的一部分。在本系列中,我旨在通过回答关于该主题的十个最常见问题来分解复杂的概念。我的目标是使用简单的语言和相关的类比,使这些想法易于理解。 图片来自 [Solen Feyissa](https://unsplash.com/@solenfeyissa?utm_source=medium&utm_medi

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

在AI军备竞赛中分辨事实与虚构 DeepSeek AI真的是它所宣传的游戏规则改变者,还是仅仅聪明的营销和战略炒作?👀 虽然一些人将其视为AI效率的革命性飞跃,但另一些人则认为它的成功建立在借用(甚至窃取的)创新和可疑的做法之上。传言称,DeepSeek的首席执行官在疫情期间像囤积卫生纸一样囤积Nvidia芯片——这只是冰山一角。 从其声称的550万美元培训预算到使用Open

阅读更多
Type something to search...