尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LangGraph实战:构建有状态、可循环的AI智能体工作流

LangGraph实战:构建有状态、可循环的AI智能体工作流 如果你正在构建AI智能体是否遇到过这样的困境智能体要么像“一次性脚本”执行完就失忆要么像“脱缰野马”在复杂任务中陷入死循环你需要的可能不是一个更强大的模型而是一个能真正管理状态、控制流程、协调多步决策的框架。这正是LangGraph要解决的核心问题。它不是LangChain的替代品而是其“大脑皮层”——专门为构建有状态、可循环、可协作的智能体和工作流而生。如果说LangChain帮你组装了工具链那么LangGraph则为你设计了一套完整的神经系统让智能体具备了“记忆”和“决策回路”。本文将带你从零开始彻底掌握LangGraph。我们不会停留在概念复述而是直接切入实战从最基础的“状态机”思想到构建具备长期记忆和人工干预能力的智能体最后落地一个接近企业级的项目原型。你会看到清晰的代码、可复现的步骤以及那些官方文档里很少提及的“坑”和最佳实践。读完本文你将能透彻理解LangGraph的核心模型StateGraph, Nodes, Edges及其设计哲学。独立搭建一个具备记忆和工具调用能力的对话智能体。掌握Supervisor监督节点和Human-in-the-Loop人工干预机制实现可控的复杂工作流。了解如何将LangGraph与本地模型如Ollama结合构建私有化AI应用。获得一套可直接用于项目开发的思维框架和代码模板。1. 为什么是LangGraph它解决了什么根本问题在LangChain生态中我们熟悉的是“链”Chain—— 一种线性的、确定性的执行顺序。这对于问答、摘要等任务足够好用。但当你试图构建一个能自主规划、使用工具、并根据结果调整策略的智能体时线性链就显得力不从心了。想象一个客服智能体需要处理用户投诉理解用户问题调用LLM。查询订单数据库调用工具。如果查询失败是重试还是转人工条件判断根据查询结果生成补偿方案再次调用LLM。将方案发送给用户并等待确认等待外部输入。用户不满意则进入新一轮协商循环。这个过程充满了分支、循环和状态依赖。传统的链式结构需要写大量胶水代码来管理这些逻辑代码很快就会变得难以维护。LangGraph的答案图GraphLangGraph将智能体的执行过程抽象为一个有向图。图中的节点Node代表一个执行单元如调用LLM、执行工具边Edge代表执行路径。最关键的是它引入了一个全局的状态State对象在整个图执行过程中流转和更新。这种模型天然适合描述上述流程状态State保存着当前的用户输入、数据库查询结果、历史对话、协商轮次等所有信息。节点Node“理解问题”、“查询数据库”、“生成方案”各自是一个节点。边Edge根据“查询是否成功”这个条件决定下一个节点是“生成方案”还是“转人工”。“用户确认”后可以边指向结束也可以边指向新的协商轮次。所以LangGraph解决的根本问题是为复杂、多步、有状态的AI智能体和工作流提供了一套清晰、可维护、可视化的编程范式。它让开发者从繁琐的流程控制代码中解放出来专注于定义“做什么”和“在什么条件下做”。2. 核心概念拆解State, Node, Edge, Graph理解下面四个核心概念是掌握LangGraph的关键。2.1 状态State智能体的“记忆体”State是一个字典或Pydantic模型它定义了在整个图执行过程中需要传递和修改的所有数据。你可以把它想象成智能体的“工作内存”或“上下文”。from typing import TypedDict, List, Annotated import operator class AgentState(TypedDict): # 用户的最新输入 messages: Annotated[List[dict], operator.add] # 智能体需要执行的下一步动作由LLM决定 next: str # 从工具调用中获取的结果 tool_outputs: List[str] # 对话轮次用于控制循环 turn_count: intAnnotated[List[dict], operator.add]这是一个高级用法表示messages字段是一个列表当多个节点修改它时默认使用operator.add即列表拼接的方式来更新而不是覆盖。这非常适合对话历史的管理。next一个字符串指示下一步应该执行哪个节点。这是实现条件路由的关键。tool_outputs存储工具调用的结果。turn_count一个计数器示例中可用于限制对话轮次防止无限循环。设计State的原则只包含必要的数据。State会在每个节点间传递过于庞大可能会影响性能。2.2 节点Node执行单元Node是一个函数它接收当前的State执行一些操作如调用LLM、运行工具然后返回更新后的State。def llm_node(state: AgentState) - dict: 调用LLM生成回复的节点 from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-3.5-turbo) # 1. 从State中获取对话历史 history state[messages] # 2. 构造提示词让LLM根据历史和工具结果思考 prompt f 你是一个助手。这是历史对话{history[-5:]}。 工具调用结果{state.get(tool_outputs, [])}。 请生成回复。 # 3. 调用LLM response llm.invoke(prompt) # 4. 更新State new_state { messages: [{role: assistant, content: response.content}], next: check_turns # 假设下一步是检查轮次 } return new_state def tool_node(state: AgentState) - dict: 执行工具调用的节点 # 假设我们有一个查询天气的工具 city extract_city_from_messages(state[messages]) weather call_weather_api(city) new_state { tool_outputs: [weather], # 将结果存入tool_outputs next: llm_node # 工具执行完后交给LLM节点去解释结果 } return new_state每个Node职责应该单一。一个Node只做一件事调用LLM、执行工具、检查条件等这样图的结构会更清晰。2.3 边Edge控制流Edge定义了节点之间的执行顺序。分为两种起始边Start Edge指定图开始执行的第一个节点。普通边Conditional Edge连接两个节点可以是有条件的。条件边是LangGraph强大之处。它允许根据State中的某个值动态决定下一个节点。from langgraph.graph import END def route_after_tool(state: AgentState) - str: 根据工具调用结果决定下一步 outputs state.get(tool_outputs, []) if not outputs or error in outputs[-1]: # 如果工具调用出错转到人工干预节点或结束 return human_check else: # 工具调用成功交给LLM解释 return llm_node def check_turn_count(state: AgentState) - str: 检查对话轮次防止无限循环 if state[turn_count] 5: return END # 指向特殊的END节点表示图执行结束 return continue2.4 图Graph将它们组装起来Graph是Node和Edge的容器。我们创建图添加节点定义边最后将其编译成一个可执行的对象。from langgraph.graph import StateGraph, END # 1. 创建图并指定State的类型 workflow StateGraph(AgentState) # 2. 添加节点 workflow.add_node(llm_node, llm_node) workflow.add_node(tool_node, tool_node) workflow.add_node(human_check, human_check_node) # 假设有个人工检查节点 # 3. 设置起始节点 workflow.set_entry_point(llm_node) # 4. 添加边 workflow.add_edge(llm_node, tool_node) # LLM之后总是执行工具 workflow.add_conditional_edges( tool_node, route_after_tool, # 上面定义的路由函数 {human_check: human_check, llm_node: llm_node} ) workflow.add_edge(human_check, END) # 人工检查后结束 # 5. 编译图 app workflow.compile()编译后的app就是一个可以调用的智能体。你传入初始State它就会按照图定义的控制流自动执行。3. 环境搭建与快速开始在进入复杂示例前我们先确保环境就绪并运行一个“Hello World”级别的LangGraph智能体。3.1 安装依赖建议使用Python 3.9。创建一个新的虚拟环境然后安装核心包。# 创建并激活虚拟环境以conda为例 conda create -n langgraph-demo python3.10 conda activate langgraph-demo # 安装LangGraph和LangChain这是最核心的 pip install langgraph langchain # 安装LangChain社区工具和OpenAI集成用于示例 pip install langchain-community langchain-openai # 可选安装用于可视化的库 pip install pyvislanggraph核心框架。langchain提供了大量与LLM、工具、记忆等集成的组件。langchain-openai方便调用OpenAI API。如果你使用其他模型如Ollama本地模型则需要安装对应的集成包如langchain-ollama。3.2 一个最简单的对话循环智能体这个智能体只会和你对话并在5轮后自动结束。它展示了最基本的图结构。# simple_agent.py from typing import TypedDict, List, Annotated import operator from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI # 1. 定义State class ConversationState(TypedDict): messages: Annotated[List[str], operator.add] # 存储对话内容 turn_count: int # 记录轮次 # 2. 定义节点函数 def chatbot_node(state: ConversationState): 模拟聊天机器人回复 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0.7) # 获取最新用户消息假设最后一条是用户输入 user_input state[messages][-1] if state[messages] else Hello # 构造简单的提示词 prompt f用户说{user_input}。请用友好、简洁的方式回复。 response llm.invoke(prompt) # 更新State new_message fAI: {response.content} return { messages: [new_message], turn_count: state[turn_count] 1 } def check_turns(state: ConversationState): 检查轮次决定是否继续 if state[turn_count] 5: return end_conversation else: return continue_chat def end_node(state: ConversationState): 结束节点 print(对话已达到5轮结束。) return {messages: [对话已结束。]} # 3. 构建图 workflow StateGraph(ConversationState) workflow.add_node(chatbot, chatbot_node) workflow.add_node(end, end_node) workflow.set_entry_point(chatbot) # 关键使用条件边来实现循环 workflow.add_conditional_edges( chatbot, check_turns, { continue_chat: chatbot, # 继续循环指向自己 end_conversation: end } ) workflow.add_edge(end, END) # 4. 编译 app workflow.compile() # 5. 运行 if __name__ __main__: # 初始状态用户说“Hi”第0轮 initial_state {messages: [User: Hi], turn_count: 0} # 运行图并设置最大执行步数防止意外 final_state app.invoke(initial_state, config{recursion_limit: 20}) print(\n--- 完整对话记录 ---) for msg in final_state[messages]: print(msg)运行与理解python simple_agent.py你会看到AI回复了你的“Hi”然后图会检查轮次。由于turn_count变为1小于5条件边check_turns返回”continue_chat”于是执行流再次指向”chatbot”节点。但此时没有新的用户输入AI会基于它自己上一条回复继续“自言自语”。这个过程会持续5轮后停止。这个简单示例揭示了几个重点循环是如何实现的通过一个节点chatbot的条件边指向它自己。状态如何更新turn_count在每个循环中递增。图的终止通过条件边路由到END特殊节点。当然这个智能体很“蠢”。接下来我们让它变得有用。4. 实战构建具备工具调用能力的智能体一个真正的智能体需要能使用工具如搜索、计算、查询API。我们将构建一个能查询天气的智能体。4.1 定义工具首先我们模拟一个天气查询工具。# weather_tools.py import random def get_current_weather(location: str, unit: str celsius): 模拟获取当前天气的工具。 # 在实际项目中这里会调用真实的天气API如OpenWeatherMap weather_conditions [晴朗, 多云, 小雨, 大雪, 雾] temp random.randint(-10, 35) if unit celsius else random.randint(14, 95) return { location: location, temperature: temp, unit: unit, forecast: random.choice(weather_conditions) } # 为了被LangChain识别我们需要将其包装成StructuredTool from langchain.tools import StructuredTool weather_tool StructuredTool.from_function( funcget_current_weather, nameget_current_weather, description获取指定城市的当前天气。输入应为城市名如‘北京’。, args_schemaNone, # 可以定义更严格的Pydantic模型 )4.2 构建智能体图这个图更复杂包含三个核心节点Agent代理节点调用LLM让它根据对话历史和State决定下一步是“回复用户”还是“使用工具”。Tools工具节点执行Agent节点决定要用的工具。Router路由节点根据工具执行结果决定下一步。# weather_agent.py from typing import TypedDict, List, Annotated, Literal import operator from langgraph.graph import StateGraph, END from langchain_openai import ChatOpenAI from langchain.agents import create_openai_tools_agent from langchain_core.messages import HumanMessage, AIMessage, ToolMessage from weather_tools import weather_tool # 1. 定义更完善的State class AgentState(TypedDict): messages: Annotated[List, operator.add] # 存储LangChain的Message对象 next: str # 下一步动作respond 或 continue # 2. 初始化LLM和Agent执行器 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) tools [weather_tool] agent_runnable create_openai_tools_agent(llm, tools) # 3. 定义节点 def agent_node(state: AgentState): 代理节点调用LLM决定行动 # 调用Agent它会分析messages决定调用工具还是直接回复 response agent_runnable.invoke({input: state[messages]}) # 更新消息列表。Agent的响应是一个AIMessage可能包含ToolCall new_messages [response[messages][-1]] if response.get(messages) else [response] # 判断下一步如果AIMessage中包含ToolCall则需要执行工具 next_step continue if hasattr(new_messages[-1], tool_calls) and new_messages[-1].tool_calls else respond return { messages: new_messages, next: next_step } def tool_node(state: AgentState): 工具节点执行Agent选择的工具 last_message state[messages][-1] tool_calls last_message.tool_calls tool_outputs [] for tool_call in tool_calls: tool_name tool_call[name] tool_args tool_call[args] # 找到对应的工具并执行 for tool in tools: if tool.name tool_name: output tool.invoke(tool_args) tool_outputs.append(ToolMessage(contentstr(output), tool_call_idtool_call[id])) break # 将工具执行结果作为消息加入历史 return { messages: tool_outputs, next: continue # 工具执行完后继续交给Agent处理 } def router(state: AgentState) - Literal[agent, tools, __end__]: 路由节点根据State决定下一个节点 if state[next] respond: # 如果Agent决定直接回复则结束 return __end__ elif state[next] continue: # 检查最新消息类型决定去Agent还是Tools节点 last_msg state[messages][-1] if isinstance(last_msg, AIMessage) and last_msg.tool_calls: return tools else: return agent else: return __end__ # 4. 构建图 workflow StateGraph(AgentState) workflow.add_node(agent, agent_node) workflow.add_node(tools, tool_node) workflow.set_entry_point(agent) # 使用条件边进行路由 workflow.add_conditional_edges( agent, router, { agent: agent, tools: tools, __end__: END } ) workflow.add_conditional_edges( tools, router, { agent: agent, tools: tools, __end__: END } ) app workflow.compile() # 5. 运行示例 if __name__ __main__: # 初始消息 initial_state { messages: [HumanMessage(content上海今天天气怎么样)], next: continue } print(用户上海今天天气怎么样) final_state app.invoke(initial_state, config{recursion_limit: 10}) # 打印AI的最终回复 for msg in final_state[messages]: if isinstance(msg, AIMessage) and not msg.tool_calls: print(fAI: {msg.content})执行流程解析用户输入“上海今天天气怎么样”进入State。Agent节点LLM分析消息发现需要天气信息于是决定调用get_current_weather工具。它在AIMessage中生成一个tool_calls。router函数看到tool_calls将下一步指向tools节点。Tools节点执行get_current_weather(上海)将结果包装成ToolMessage放回State。Router再次判断最新消息是ToolMessagenext为continue于是指向agent节点。Agent节点再次LLM收到工具执行结果上海的天气数据生成一段友好的回复给用户。这次AIMessage没有tool_callsrouter函数判断为respond指向END图执行结束。这个模式Agent - (可能)Tools - Agent - ...是构建工具调用智能体的经典模式。LangGraph清晰地管理了这个循环。5. 高级特性Supervisor与Human-in-the-Loop对于企业级应用智能体不能是“黑盒”。我们需要监控它的决策并在关键节点进行人工干预。这就是Supervisor和Human-in-the-LoopHITL机制的价值。5.1 Supervisor监督节点Supervisor是一个特殊的节点它不直接处理业务而是监督其他节点的执行。它可以校验结果检查工具调用的结果是否合理。安全过滤检查LLM的回复是否包含敏感信息。日志与审计记录每个节点的输入输出。异常处理当某个节点失败时决定重试还是转人工。def supervisor_node(state: AgentState): 一个简单的监督节点检查工具调用结果是否有效 last_message state[messages][-1] if isinstance(last_message, ToolMessage): # 假设我们检查天气工具的结果 content last_message.content import json try: data json.loads(content) if data.get(temperature) 50: # 温度异常高 return { messages: [HumanMessage(content工具返回数据异常温度过高请人工检查。)], next: human_intervention # 触发人工干预 } except: pass # 解析失败也视为异常 # 如果一切正常就原样返回继续流程 return state # 在图中的使用可以在Agent和Tools节点之间插入Supervisor workflow.add_node(supervisor, supervisor_node) # 修改边Agent - Supervisor - (条件判断) - Tools 或 继续5.2 Human-in-the-the-Loop人工干预HITL机制允许在图的执行过程中暂停等待外部人类输入。这是通过中断Interruption和检查点Checkpoint实现的。from langgraph.checkpoint import MemorySaver from langgraph.graph import MessagesState # 1. 使用支持检查点的State class HITLState(MessagesState): 继承MessagesState它内置了对消息列表的支持 waiting_for_human: bool False human_feedback: str # 2. 创建一个带有人工干预节点的图 def human_intervention_node(state: HITLState): 人工干预节点这里会暂停等待外部输入 # 在实际应用中这里可能会 # 1. 将当前状态发送到UI界面。 # 2. 抛出一个特定异常被外层捕获。 # 3. 或者我们模拟一个“等待”状态。 print(\n 需要人工干预 ) print(f当前状态{state[messages][-1]}) # 模拟获取人工输入实际中来自Webhook、API或UI feedback input(请输入您的指令或修正 (输入 continue 继续): ) if feedback.lower() continue: return {waiting_for_human: False, human_feedback: } else: # 将人工输入作为新消息加入并继续执行 new_message HumanMessage(contentf[人工干预] {feedback}) return { messages: [new_message], waiting_for_human: False, human_feedback: feedback } # 3. 在图中配置检查点这是实现“暂停/继续”的关键 memory MemorySaver() # 一个简单的内存检查点存储 workflow StateGraph(HITLState, config_schemaHITLState) workflow.add_node(human_intervention, human_intervention_node) # ... 添加其他节点 # 在条件边中可以路由到 human_intervention 节点 def router_with_hitl(state: HITLState): if state.get(waiting_for_human): return human_intervention # ... 其他路由逻辑 # 编译时传入检查点存储器 app workflow.compile(checkpointermemory) # 4. 模拟一个需要人工干预的流程 config {configurable: {thread_id: user-123}} initial_state HITLState(messages[HumanMessage(content处理这个敏感订单。)]) # 第一次调用假设某个节点设置了 waiting_for_human True result1 app.invoke(initial_state, configconfig) # 此时图会停在 human_intervention 节点等待输入。 # 在另一个时间点如用户在前端点击后从检查点恢复执行 # 我们需要传入之前的人工反馈来更新状态 resume_state HITLState( messages[*result1[messages], HumanMessage(content我确认可以继续。)], waiting_for_humanFalse ) result2 app.invoke(resume_state, configconfig) # 从上次中断处继续HITL的核心价值将AI的自主性与人类的控制权结合起来。对于金融审核、医疗建议、法律咨询等高风险场景在最终动作执行前插入一个人工确认节点是至关重要的安全措施。6. 集成本地模型基于Ollama构建私有智能体使用OpenAI等云端API虽然方便但数据隐私和成本是问题。LangGraph可以轻松与本地模型集成例如通过Ollama运行Llama 3、Qwen等开源模型。6.1 环境准备与模型拉取# 1. 安装Ollama (请参考官网 https://ollama.com/) # 2. 拉取一个模型例如 Llama 3.1 8B ollama pull llama3.1:8b # 3. 安装LangChain的Ollama集成包 pip install langchain-ollama6.2 修改智能体代码以使用本地模型只需将之前示例中的ChatOpenAI替换为ChatOllama即可。# local_agent.py from langchain_ollama import ChatOllama from langchain.tools import Tool import requests # 1. 初始化本地LLM local_llm ChatOllama( modelllama3.1:8b, # 你拉取的模型名 base_urlhttp://localhost:11434, # Ollama默认地址 temperature0.2 # 本地模型建议温度低一些输出更稳定 ) # 2. 定义一个本地可用的工具例如查询系统时间 def get_local_time(query: str) - str: from datetime import datetime return f当前系统时间是{datetime.now().strftime(%Y-%m-%d %H:%M:%S)} local_tool Tool( nameget_local_time, funcget_local_time, description当用户询问时间、日期、现在几点时使用此工具。 ) # 3. 创建使用本地模型的Agent from langchain.agents import create_react_agent from langchain.agents.output_parsers import ReActSingleInputOutputParser from langchain_core.prompts import PromptTemplate prompt PromptTemplate.from_template( 你是一个运行在本地的助手。你可以使用工具。 历史对话{chat_history} 当前问题{input} 你可以使用的工具{tools} 请思考{agent_scratchpad} ) local_agent_runnable create_react_agent( llmlocal_llm, tools[local_tool], promptprompt, output_parserReActSingleInputOutputParser(), ) # 4. 剩下的部分定义State、Node、Graph与之前完全一样 # 只需要将 agent_runnable 替换为 local_agent_runnable。 # ... [StateGraph构建代码省略与weather_agent.py类似]关键变化与注意事项速度与性能本地模型尤其是消费级GPU的响应速度远慢于API在设计交互流程时需考虑延迟。能力差异小参数模型7B/8B的推理和工具调用能力可能不如GPT-4提示词需要更精细的设计。上下文长度注意本地模型的上下文窗口限制。部署真正的企业级私有化部署需要考虑模型服务化、负载均衡、监控等Ollama适合开发和轻量级场景。7. 常见问题与排查指南在开发LangGraph应用时你可能会遇到以下典型问题。问题现象可能原因排查步骤解决方案图编译失败State定义错误例如使用了不支持的Python类型。1. 检查TypedDict或Pydantic模型字段类型。2. 确保Annotated语法正确。使用LangGraph支持的基本类型str,int,list,dict或Message对象。复杂对象需序列化。无限循环条件边逻辑有误导致节点间形成死循环。1. 在app.invoke()中设置config{recursion_limit: N}。2. 打印每个节点执行后的State观察next字段变化。在State中增加计数器如turn_count在路由函数中检查并强制结束。使用END节点。工具调用不生效1. 工具没有正确绑定到Agent。2. LLM生成的工具调用格式不对。1. 检查tools列表是否传递给了create_openai_tools_agent。2. 打印AIMessage查看tool_calls字段是否存在且格式正确。确保使用StructuredTool包装函数并提供清晰的name和description。使用OpenAI模型时工具调用兼容性最好。状态更新不符合预期对Annotated的operator理解有误或节点返回的State键不全。1. 理解operator.add用于列表拼接operator.setitem用于替换。2. 每个节点应返回完整的State更新字典。仔细阅读State更新语义。对于复杂更新逻辑可以在节点内手动处理State而不是依赖operator。Human-in-the-Loop不暂停没有正确使用Checkpointer或者中断逻辑未触发。1. 确认编译时传入了checkpointer参数。2. 检查路由函数是否在特定条件下返回了人工干预节点的ID。参考官方StateGraph与Checkpointer的示例。中断通常需要将图配置为“可中断”并在节点中raise特定异常。与LangChain现有链结合困难试图将整个LCEL链作为一个Node导致状态传递复杂。思考是否真的需要LangGraph。对于线性流程LCEL链更简单。将LCEL链封装成一个工具Tool在LangGraph的tool_node中调用。或者将链的核心逻辑提取为纯函数作为Node。8. 企业级项目实战建议与最佳实践将LangGraph从Demo推向生产环境需要注意以下方面8.1 状态设计规范化使用Pydantic BaseModel替代TypedDictPydantic提供运行时类型验证和数据校验能提前发现许多错误。from pydantic import BaseModel, Field from typing import List class ProductionState(BaseModel): messages: List[dict] Field(default_factorylist) session_id: str user_metadata: dict Field(default_factorydict) # 使用Field提供默认值避免None错误区分会话状态与业务状态将与会话强相关的数据如对话历史和业务逻辑数据分开管理便于持久化和清理。8.2 图的模块化与复用构建子图Subgraph将复杂的、可复用的逻辑如“用户身份验证流程”、“数据查询流程”封装成子图。主图通过节点调用子图使结构更清晰。# 伪代码示例 auth_graph StateGraph(...) # 定义认证子图 main_graph.add_node(authenticate, auth_graph.compile())配置文件化对于节点和边的连接关系可以考虑用YAML或JSON定义实现“配置即代码”动态加载不同的工作流。8.3 可观测性与监控全面日志记录在每个节点的入口和出口记录State的快照、耗时和异常。使用结构化日志如JSON格式便于接入ELK等系统。图执行可视化利用LangGraph的内置功能或pyvis库将图的执行路径可视化对于调试复杂流程和向非技术人员汇报极具价值。from langgraph.graph import StateGraph workflow StateGraph(...) # ... 添加节点和边 app workflow.compile() # 导出为PNG app.get_graph().draw_mermaid_png(output_file_pathworkflow.png)定义关键指标如平均响应时间、工具调用成功率、人工干预率、循环次数等并设置告警。8.4 错误处理与韧性节点级Try-Catch在每个节点函数内部进行细致的异常捕获并根据异常类型更新State如error字段由后续的Supervisor节点或路由函数处理。设置全局超时与重试在调用app.invoke()时配置超时参数。对于可重试的错误如网络超时可以在节点内或通过Supervisor实现重试逻辑。设计降级策略当核心工具如LLM API、数据库不可用时图应能路由到降级节点返回缓存数据或友好提示而不是完全崩溃。8.5 版本管理与部署图的版本化当对图的结构节点、边进行修改时应像对待代码一样进行版本控制。考虑图的序列化与反序列化。蓝绿部署由于图定义了智能体的核心行为变更时建议采用蓝绿部署将流量逐步切换到新版本图并密切监控指标。LangGraph不是一个“开箱即用”的解决方案而是一个强大的“构建框架”。它的价值在于为你提供了管理复杂AI智能体状态的标准化手段。从简单的对话循环到需要人工审核的多步骤业务流程你都可以用“图”这一种思维模型来设计和实现。学习的下一步是深入阅读其官方文档并尝试用LangGraph重构你当前项目中那些充斥着if-else状态判断的胶水代码。你会发现逻辑变得前所未有的清晰。
返回列表