LangGraph入门:核心概念与基础组件
在上一篇文章中,我们讨论了LCEL和AgentExecutor的局限性。今天,我们将介绍一个强大的解决方案——LangGraph,它是如何通过图和状态机的概念来解决这些问题的。
LangGraph简介
LangGraph是LangChain生态系统中的一个新成员,它提供了一个基于图(Graph)的框架来构建复杂的LLM应用。通过将应用逻辑组织成有向图的形式,LangGraph使得构建复杂的对话流程变得更加直观和灵活。
主要特性
-
循环和分支能力
- 支持条件语句和循环结构
- 可以根据状态动态决定执行路径
- 轻松实现复杂的对话流程控制
-
状态持久化
- 自动保存和管理状态
- 支持暂停和恢复执行
- 便于处理长时间运行的对话
-
人机交互支持
- 可以在执行过程中插入人工审核
- 支持编辑和修改状态
- 灵活的交互控制机制
-
流式处理
- 支持流式输出
- 实时反馈执行状态
- 提升用户体验
-
与LangChain无缝集成
- 复用现有的LangChain组件
- 支持LCEL表达式
- 丰富的工具和模型支持
核心概念
1. 状态(State)
状态是LangGraph应用的基础,它可以是一个简单的字典或者Pydantic模型。状态包含了应用运行时需要的所有信息:
from typing import List, Dict from pydantic import BaseModel class ChatState(BaseModel): messages: List[Dict[str, str]] = [] current_input: str = "" tools_output: Dict[str, str] = {} final_response: str = ""
2. 节点(Node)
节点通常是Python函数,用于处理状态并返回更新后的状态:
async def process_input(state: ChatState) -> ChatState: # 处理用户输入 messages = state.messages + [{"role": "user", "content": state.current_input}] return ChatState( messages=messages, current_input=state.current_input, tools_output=state.tools_output ) async def generate_response(state: ChatState) -> ChatState: # 使用LLM生成回复 response = await llm.ainvoke(state.messages) messages = state.messages + [{"role": "assistant", "content": response}] return ChatState( messages=messages, current_input=state.current_input, tools_output=state.tools_output, final_response=response )
3. 边(Edge)
边定义了节点之间的连接关系和路由逻辑:
from langgraph.graph import StateGraph, END # 创建图结构 workflow = StateGraph(ChatState) # 添加节点 workflow.add_node("process_input", process_input) workflow.add_node("generate_response", generate_response) # 定义边和路由逻辑 workflow.add_edge("process_input", "generate_response") workflow.add_edge("generate_response", END)
实战示例:简单聊天机器人
让我们通过一个简单的聊天机器人示例来展示LangGraph的基本用法:
from typing import List, Dict, Tuple from pydantic import BaseModel from langgraph.graph import StateGraph, END from langchain_core.language_models import ChatOpenAI # 1. 定义状态 class ChatState(BaseModel): messages: List[Dict[str, str]] = [] current_input: str = "" should_continue: bool = True # 2. 定义节点函数 async def process_user_input(state: ChatState) -> ChatState: """处理用户输入""" messages = state.messages + [{"role": "user", "content": state.current_input}] return ChatState( messages=messages, current_input=state.current_input, should_continue=True ) async def generate_ai_response(state: ChatState) -> ChatState: """生成AI回复""" llm = ChatOpenAI(temperature=0.7) response = await llm.ainvoke(state.messages) messages = state.messages + [{"role": "assistant", "content": response}] return ChatState( messages=messages, current_input=state.current_input, should_continue=True ) def should_continue(state: ChatState) -> str: """决定是否继续对话""" if "goodbye" in state.current_input.lower(): return "end" return "continue" # 3. 构建图 workflow = StateGraph(ChatState) # 添加节点 workflow.add_node("process_input", process_user_input) workflow.add_node("generate_response", generate_ai_response) # 添加边 workflow.add_edge("process_input", "generate_response") workflow.add_conditional_edges( "generate_response", should_continue, { "continue": "process_input", "end": END } ) # 4. 编译图 app = workflow.compile() # 5. 运行对话 async def chat(): state = ChatState() while True: user_input = input("You: ") state.current_input = user_input state = await app.ainvoke(state) print("Bot:", state.messages[-1]["content"]) if not state.should_continue: break # 运行聊天 import asyncio asyncio.run(chat())
这个示例展示了LangGraph的基本用法:
- 定义状态模型
- 创建处理节点
- 构建图结构
- 定义路由逻辑
- 编译和运行
最佳实践
在使用LangGraph时,有一些最佳实践值得注意:
-
状态设计
- 保持状态模型简洁明确
- 只包含必要的信息
- 使用类型提示增加代码可读性
-
节点函数
- 保持单一职责
- 处理异常情况
- 返回新的状态对象而不是修改现有状态
-
边的设计
- 使用清晰的条件逻辑
- 避免复杂的循环依赖
- 考虑所有可能的路径
-
错误处理
- 在关键节点添加错误处理
- 提供回退机制
- 记录详细的错误信息
结语
LangGraph通过提供直观的图形结构和状态管理机制,极大地简化了复杂LLM应用的开发。它不仅解决了LCEL和AgentExecutor的局限性,还提供了更强大的功能和更好的开发体验。
在下一篇文章中,我们将深入探讨LangGraph的高级特性,包括条件边的高级用法和如何实现复杂的工具调用Agent。我们将通过更复杂的实例来展示LangGraph在实际应用中的强大能力。
分类:
LangGraph 开发教程
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 上周热点回顾(2.17-2.23)