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

LangGraph入门教程:构建循环状态管理的LLM应用

LangGraph入门教程:构建循环状态管理的LLM应用

在大型语言模型(LLM)应用开发中,我们常常需要处理复杂的工作流程,而不仅仅是简单的线性执行。LangGraph作为LangChain的高级库,为我们提供了构建具有循环能力的LLM应用的强大工具。本文将通过一个简单的天气查询示例,带你入门LangGraph的核心概念和基本使用方法。

LangGraph核心概念

LangGraph是LangChain的一个高级库,它最大的特点是为LLM应用带来了循环能力,而不仅仅是传统LangChain的线性工作流。这使得我们可以构建更复杂、更智能的应用程序。LangGraph的核心组件包括:

  • 状态:维护过程上下文,实现累计数据的动态决策
  • 节点:带边计算步骤,制定特定的任务,适应不同的工作流
  • :连接节点,定义工作流的执行路径,实现复杂的工作流程控制

构建一个天气查询应用

下面,我们将通过构建一个简单的天气查询应用来展示LangGraph的基本用法。

1. 环境准备和导入依赖

首先,我们需要导入必要的库和设置环境:

import os
from typing import Literalfrom dotenv import load_dotenv
from langchain_core.messages import HumanMessage
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI# 导入检查点,用于持久化保存
from langgraph.checkpoint.memory import Checkpoint, MemorySaver# 导入图以及状态
from langgraph.graph import END, StateGraph, MessagesState
# 导入工具节点
from langgraph.prebuilt import ToolNode
load_dotenv()

2. 定义工具

接下来,我们定义一个用于获取天气的简单工具:

@tool
def get_weather(region: str):"""获取指定地区的天气:param region: 地区:return:"""return f"{region}晴天,25度"# 将工具放入工具列表中
tools = [get_weather]# 创建工具节点
tool_node = ToolNode(tools)

3. 初始化模型并绑定工具

我们使用ChatOpenAI模型,并将工具绑定到模型上:

model = ChatOpenAI(base_url="https://openrouter.ai/api/v1", api_key=os.getenv("OPENAI_KEY"),model="google/gemini-2.0-flash-001", temperature=0
).bind_tools(tools)

4. 定义决策函数和模型调用函数

这是LangGraph的关键部分,我们需要定义一个决策函数来控制工作流的流向,以及一个用于调用模型的函数:

def should_continue(state: MessagesState) -> Literal["tools", END]:print("messages:", state['messages'])messages = state['messages']last_message = messages[-1]# 如果llm调用了工具,则转到"tools"节点if last_message.tool_calls:return "tools"# 否则,停止return ENDdef call_model(state: MessagesState):messages = state['messages']# 调用模型ai_msg = model.invoke(messages)# 返回列表并将最新生成的消息添加到列表中return {"messages": [ai_msg]}

5. 构建状态图

现在,我们可以开始构建状态图了:

# 初始化图。定义新的状态图
workflow = StateGraph(MessagesState)
# 定义图节点
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)# 定义入口和图边
# 第一个被调用的节点是agent
workflow.set_entry_point('agent')# 添加条件边
workflow.add_conditional_edges(# 起始节点,使用agent"agent",# 传递下一个调用节点的数据should_continue)# 添加从tools到agent的普通边
# 这就意味着调用tools节点后,返回到agent节点继续处理
workflow.add_edge("tools", "agent")

6. 设置检查点和编译图

# 初始化内存,在图运行之间的持久化状态
checkpointer = MemorySaver()  # 也可在redis、MongoDB中存# 编译图
# 这将其编译成一个LangChain可运行的对象
app = workflow.compile(checkpointer)

7. 执行图并获取结果

最后,我们可以执行这个图并获取结果:

final_state = app.invoke({"messages": [HumanMessage(content="今天上海天气如何?")]},config={"configurable": {"thread_id": 42}},  # 使用检查点来保存状态
)# 从final_state获取最后一条消息的内容
result = final_state['messages'][-1].content
print(result)

8. 测试会话状态保持

LangGraph一个重要的特性是可以保持会话状态。我们可以继续提问,系统会记住之前的上下文:

final_state = app.invoke({"messages": [HumanMessage(content="我问的是哪个城市?")]},config={"configurable": {"thread_id": 42}},  # 使用检查点来保存状态
)# 从final_state获取最后一条消息的内容
result = final_state['messages'][-1].content
print(result)

当我们运行这段代码时,第二次调用会记住之前我们问的是上海的天气,这说明LangGraph成功地维护了会话状态。

LangGraph工作原理解析

让我们来分析一下这个天气查询应用是如何工作的:

  1. 状态管理:使用MessagesState来保存所有的消息历史,实现上下文记忆。
  2. 节点定义:定义了两个主要节点 - agenttools,分别负责调用LLM和执行工具。
  3. 路径决策:通过should_continue函数动态决定工作流的执行路径。
  4. 循环流程:当LLM需要调用工具时,工作流会从agent节点转到tools节点,执行完工具后再返回agent节点,形成一个循环。
  5. 状态持久化:通过checkpointer实现会话状态的持久化,使得多次调用之间可以保持上下文连贯性。

LangGraph的优势

相比传统的LangChain线性工作流,LangGraph具有以下优势:

  1. 循环能力:能够表达复杂的循环和分支逻辑,支持更复杂的任务处理。
  2. 状态管理:内置状态管理机制,使得维护上下文变得简单。
  3. 动态决策:可以基于当前状态动态决定下一步的执行路径。
  4. 模块化设计:节点和边的抽象使得工作流的定义更加清晰和模块化。
  5. 持久化支持:支持状态的持久化存储,便于构建长会话应用。

总结

本文通过一个简单的天气查询示例,展示了如何使用LangGraph构建具有循环能力的LLM应用。我们学习了LangGraph的核心概念,包括状态、节点和边,并了解了如何定义条件流程和持久化状态。这些基础知识将帮助你构建更复杂、更智能的LLM应用。

LangGraph的出现,大大拓展了LangChain的能力边界,使得构建复杂的交互式LLM应用变得更加容易。随着你对LangGraph的深入理解,你将能够构建更加复杂和智能的应用程序,如多轮对话、递归思考、自我批评和改进等高级功能。

希望这个教程能够帮助你快速入门LangGraph,开始构建自己的循环状态管理LLM应用!

http://www.xdnf.cn/news/1010575.html

相关文章:

  • 哪些方面可以做PCDN
  • Memory Repair (五)
  • SMB协议在Windows内网中的核心地位
  • Java SE - 继承与多态
  • 广东省省考备考(第二十七天6.12)—言语:逻辑填空(练习)
  • Sentinel 流量控制安装与使用
  • 【游戏设计】游戏视角类型及核心特点分析
  • 脑电震动音频震动信号模拟器设计资料:758-2路32bit DA 脑电震动音频信号模拟器
  • 单连杆倾角估计:互补滤波器的 MATLAB 仿真实现
  • 【Python打卡Day35】模型可视化与推理@浙大疏锦行
  • bindService 和 startService 生命周期对比
  • JavaWeb期末速成 Servlet
  • qemu-guest-agent详解
  • 亚马逊woot常见问题第三弹
  • LevelDB介绍和内部机制
  • CC工具箱使用指南:【面要素四至】
  • 深度学习5——循环神经网络
  • 智能PDU:从单一功能到多维度升级
  • 洛谷P4555 最长双回文串
  • Ntfs!NtfsFreeRestartTableIndex函数分析
  • 图片压缩工具类
  • Photoshop 2025 性能配置全攻略:硬件选购与软件优化指南
  • 医疗器械行业系统如何提升医疗器械企业的核心竞争力?
  • JavaWeb(Servlet预习)
  • CANopen转PROFINET网关应用:西门子S7-1500主站控制台达AS系列CANopen设备
  • 【金仓数据库征文】_KingbaseES V8R6 运维最佳实践
  • 报表工具顶尖对决系列 --- 文本数据源
  • 大数据学习(139)-数仓设计
  • 量化投资中的Alpha模型与Beta模型的结合
  • 基于鹅优化算法(GOOSE)和三次样条插值的机器人路径规划MATLAB完整实现方案