【Agent智能体】23LangGraph框架详解 章节二十三LangGraph框架详解一、LangGraph概述1. 是什么LangGraph是一个低级编排框架和运行时环境专门用来构建、管理和部署有状态的智能体Agent。核心理念是把Agent的工作流建模成图Graph。图由三个核心要素构成节点Nodes代表计算单元可以是LLM调用、工具执行或任何自定义逻辑。边Edges定义节点之间的转换逻辑决定执行流程支持条件分支。状态State在整个图执行过程中共享和传递的数据支持多步骤保持上下文。LangGraph提供的核心能力持久化执行支持从故障中恢复和断点续传。人机协作支持在任何时刻检查和修改智能体状态。记忆管理支持短期工作记忆和跨会话长期记忆。流式处理专为流式工作流设计实时输出数据。生产级部署提供可扩展的基础设施。2. 与LangChain的区别一句话总结当LLM应用需要有状态、可循环、可分支的多步骤控制流时LangChain很难优雅完成必须用LangGraph。特性LangGraphLangChain抽象级别低级提供细粒度控制高级开箱即用状态管理内置状态机和检查点需要自行管理执行模型基于图的并行/条件执行线性链式执行持久化原生支持需要额外实现适用场景复杂、有状态的智能体应用简单的链式调用LangGraph更适合复杂的多智能体系统、需要长期记忆的应用、需要人工审核的工作流、后台处理任务和实时交互。二、核心概念1. State状态State是整个图的生命周期中的全局变量所有节点都读写它。可以理解为飞机的黑匣子或游戏的存档文件。定义方式有三种TypedDict推荐给字典的键值指定类型写代码时IDE会提示可用字段拼错键名立刻报错。Pydantic BaseModel不仅定义类型还在运行时强制校验数据。Dataclass自动生成初始化方法等样板代码省事。输入输出隔离初始化StateGraph时可指定三个参数实现数据边界控制state_schema图的完整内部状态所有节点可读写必须指定。input_schema图接受的输入是state_schema的子集不指定则默认等于state_schema。output_schema图返回的输出是state_schema的子集不指定则默认等于state_schema。节点间数据隔离节点函数的参数可以指定不同于全局状态的类型让每个节点只能访问自己需要的数据。2. Reducer函数Reducer定义了节点输出如何和全局状态合并。每个State字段可以指定自己的reducer。三种类型默认覆盖不指定reducer时新值直接替换旧值。内置Reducer如add_messages将新消息追加到列表末尾。自定义Reducer接收当前值和新值两个参数返回合并结果。并行执行时多个节点同时更新同一个字段Reducer负责正确合并。3. 状态存储与恢复Checkpointer检查点在图执行每个节点后自动保存状态快照。支持内存InMemorySaver、数据库SQLite、PostgreSQL等存储后端。thread_id会话隔离标识符相同thread_id代表同一会话保持上下文不同thread_id代表独立会话。实现状态存储三步第一步创建checkpointer实例。第二步编译图时传入checkpointer。第三步调用图时传递thread_id。故障恢复用数据库做持久化存储后节点报错可以从断点继续。恢复时传入None作为初始参数 相同thread_id即可。获取历史状态get_state()获取最新状态get_state_history()获取所有历史状态倒序排列。每个状态快照包含values当前数据、next下一步要执行的节点等信息。4. Node节点节点本质上是Python函数接收以下参数state图的当前状态业务数据。config配置信息包含thread_id等。runtime运行时上下文包含store等信息。config和runtime通过关键字传参注入位置可调换。节点输出规则节点只返回需要更新的字段增量更新不能返回整个状态。返回整个状态会导致并行节点冲突或数据混乱。特殊节点START是图入口将用户输入注入图中END是图出口表示流程终止。节点缓存配置缓存后相同输入直接返回缓存结果。支持内存、Redis、SQLite等后端可设置TTL过期时间。节点重试通过retry_policy配置重试策略指定最大尝试次数和需要重试的异常类型。5. Edge边边分两种普通边从一个节点直接连到下一个节点。条件边调用路由函数根据当前状态动态决定下一步走哪个节点。可控循环通过条件边构建循环结构如ReAct模式中的模型-工具-模型循环。为防止无限循环LangGraph提供递归限制参数默认25步超限抛出GraphRecursionError。6. 流式输出通过stream方法在图执行过程中实时获取数据有六种模式values每步输出完整状态。updates每步输出增量更新。custom节点内部自定义数据。messagesLLM的token流式输出。debug输出所有信息。混合模式同时使用多种模式。7. 人工审核interrupt用interrupt()在节点内暂停执行把数据抛出给用户审核用户确认后通过Command(resume...)恢复执行。注意恢复时节点会从头重新执行所以要保证操作的幂等性或把interrupt放在独立节点中。三、基础实践1. 快速入门用LangGraph构建应用的基本步骤第一步创建conda环境并安装langgraph等依赖。第二步定义State状态类。第三步定义节点函数。第四步创建StateGraph的builder实例添加节点和边。第五步编译builder得到可调用的graph对象。第六步调用graph执行任务。以RAG问答系统为例接收用户问题后分别进行联网搜索和知识库检索得到结果后用LLM总结回答。2. 底层运行算法PregelLangGraph底层用Pregel算法管理执行。图不是传统有向无环图DAG而是通过超步SuperStep驱动。每个超步分三阶段Plan阶段确定本步要执行哪些节点。Execute阶段并行执行选中的节点。Update阶段用节点输出的值更新通道。超步重复执行直到没有节点被选中或达到最大步数。四、进阶实践1. 节点输入输出的深入理解节点输出必须是增量更新只返回需要改的字段不能返回整个state。这是初学者最容易犯的错误。并行节点场景下如果两个节点都返回了完整的stateLangGraph不知道用哪个值会报冲突异常。2. 节点缓存实战第一步在langgraph.cache包中选择缓存后端InMemoryCache、RedisCache、SqliteCache。第二步编译图时传入缓存器。第三步添加节点时通过cache_policy配置TTL和缓存键生成策略。3. 节点重试策略通过RetryPolicy配置重试指定max_attempts最大尝试次数和retry_on触发重试的异常类型。默认不重试编程错误SyntaxError等和数据错误ValueError等只适合重试临时性故障网络超时等。建议显式指定retry_on。4. 人工审核机制在关键决策点如资金转账用interrupt暂停等待用户确认。第一步在节点中调用interrupt()传入待审核数据。第二步图暂停外部系统展示数据给用户。第三步用户审核后通过graph.invoke(Command(resume...))传回决策。第四步图从暂停点继续执行。注意使用interrupt必须配置Checkpointer恢复时节点从头执行副作用操作要保证幂等性。名词解释LangGraphLangChain的扩展框架用图的方式编排复杂AI工作流支持状态管理和循环。LangChain大模型应用开发框架把调用模型、处理数据等步骤串起来。StateLangGraph里的状态对象整个工作流中各节点共享的数据容器。Node图里的节点代表一个处理单元可以是函数调用或模型推理。Edge图里的边连接节点决定数据从哪流向哪。ReducerLangGraph里定义状态如何合并更新的函数。TypedDictPython类型提示工具给字典的键值指定类型写代码更安全。Checkpointer程序运行中的快照出错后可以从这里恢复不用从头来。thread_id会话标识符用来隔离不同用户或不同对话的状态空间。流式处理数据来了就处理不用等全部到齐响应更快。interrupt人工审核机制让图在关键节点暂停等人确认后继续。Agent智能体能自主规划步骤、调用工具来完成任务的AI程序。LLM大语言模型比如ChatGPT、DeepSeek能理解和生成自然语言。RAG检索增强生成先从知识库找资料再让大模型回答减少胡说。