LangGraph 快速体验教程与项目分析报告

1. 项目概述
LangGraph是LangChain Inc开发的编排框架,专门用于构建、管理和部署长时间运行的状态化AI智能体。该项目通过将智能体工作流建模为图结构,结合持久化执行和状态管理,为复杂的多智能体系统提供生产级别的支持。
本文档将深入浅出分析LangGraph项目的部署与启动过程,帮助您快速上手并理解项目的核心概念。
源码地址
前置教程
如想快速启动本LangGraph Demo 项目,你可能需要先完成以下前置教程:
1.1 项目部署与启动指南
1.1.1 快速安装
从网盘下载示例代码后,您可以直接按照下面的命令进行操作:
# 创建虚拟环境 以conda为例:conda create -n langgraph python=3.10conda activate langgraph# 安装项目依赖pip install -r requirements.txt# 依赖包含:# - langgraph (核心框架)# - langchain-openai (OpenAI兼容接口)# - python-dotenv (环境变量管理)1.1.2 环境配置
配置文件
项目包含 .env.example 配置文件,需要先将该文件重命名为 .env 并配置您的模型API密钥。
示例中的模型配置包括智谱 GLM、DeepSeek 和本地 Ollama 模型,你也可以根据需要配置其他模型,如OpenAI的ChatGPT。
# 智谱AI GLMZHIPU_API_KEY=your_api_key_hereZHIPU_API_BASE=https://open.bigmodel.cn/api/paas/v4GLM_MODEL=glm-4.6# DeepSeekDEEPSEEK_API_KEY=your_api_key_hereDEEPSEEK_API_BASE=https://api.deepseek.com/v1DEEPSEEK_MODEL=deepseek-chat# 本地模型 (Ollama)LOCAL_MODEL_URL=http://172.21.48.1:11434/v1 # 测试机的Windows主机IPLOCAL_MODEL_NAME=qwen3:4b-instruct模型选择优先级:本地模型 > 智谱 GLM > DeepSeek
模型管理器
项目提供统一的 ModelManager 类来管理不同模型:
# config/models.pyclass ModelManager: @staticmethod def get_model(model_type: str) -> BaseChatModel: if model_type == "glm": return ModelManager.create_glm_model() elif model_type == "deepseek": return ModelManager.create_deepseek_model() elif model_type == "local": return ModelManager.create_local_model() else: raise ValueError(f"Unsupported model type: {model_type}")def get_default_model(): """自动选择最佳可用模型""" # 1. 优先本地模型 # 2. 其次智谱 GLM # 3. 最后 DeepSeek1.1.3 快速开始
运行示例
项目包含完整可运行的示例:
# eogee/quick_start.pyfrom langgraph.prebuilt import create_react_agentfrom config.models import get_default_model# 距离计算工具def calculate_distance(origin: str, destination: str) -> str: """计算两地间距离和预计时间""" # 实现距离计算逻辑 return f"从{origin}到{destination}的距离是XXX公里"# 创建智能体def quick_react_agent(): model = get_default_model() agent = create_react_agent(model=model, tools=[calculate_distance]) result = agent.invoke({ "messages": [{"role": "user", "content": "从北京到上海的距离?"}] }) print("智能体回复:", result["messages"][-1].content) return resultif __name__ == "__main__": quick_react_agent()启动命令
# 运行基础示例python eogee/quick_start.py# 智能体会自动:# 1. 选择最佳可用模型# 2. 加载距离计算工具# 3. 处理用户查询1.1.5 常见问题与解决方案
模型连接问题
问题:本地模型无法连接
# 错误信息:✗ 本地模型服务不可用# 解决方案:1. 确认 Ollama 服务运行:ollama serve2. 检查服务端口:http://localhost:114343. WSL环境使用:修改配置为 http://172.21.48.1:11434 (Windows主机IP)4. 配置Ollama的环境变量:OLLAMA_HOST=0.0.0.0问题:模型API不可用
# 错误信息:✗ 智谱 GLM API 不可用(余额不足)# 解决方案:1. 检查API密钥有效性2. 确认账户余额充足3. 确认模型服务提供商的base_url是否正确配置1.2 LangGraph vs LangChain 核心区别对比
在深入了解LangGraph的架构之前,理解它与LangChain的关系和区别至关重要。LangGraph并非LangChain的替代品,而是LangChain生态系统中专门用于构建复杂、有状态的AI智能体工作流的编排框架。
对比概览表
详细功能对比
1. 架构设计理念
LangChain:
链式思维:基于链式调用模式,组件按顺序执行
组件化:提供丰富的预制组件(LLM、工具、记忆、提示等)
简单性优先:降低AI应用开发门槛
无状态设计:每次调用相对独立
LangGraph:
图计算模型:基于Pregel和Apache Beam的图计算理念
状态驱动:通过共享状态协调各节点执行
复杂性管理:专为复杂工作流设计
有状态执行:支持跨会话的状态持久化
2. 状态管理能力
# LangChain: 无状态执行chain = prompt | model | parserresult = chain.invoke({"input": "用户输入"})# 每次调用都是独立的,无法记住之前的对话# LangGraph: 有状态执行graph = StateGraph(State).compile(checkpointer=checkpointer)result1 = graph.invoke({"messages": ["你好"]}, config={"thread_id": "user_123"})result2 = graph.invoke({"messages": ["我刚才说了什么?"]}, config={"thread_id": "user_123"})# 智能体能记住之前的对话内容3. 工作流复杂度支持
LangChain适合的场景:
简单的问答系统
单一LLM调用链
基础的工具使用
线性处理流程
LangGraph适合的场景:
多智能体协作系统
需要人工审核的工作流
长时间运行的任务处理
复杂的条件分支和循环
需要状态保持的对话系统
4. 人类介入支持
5. 错误处理和恢复
LangChain:
# 简单的错误处理try: result = chain.invoke(input_data)except Exception as e: # 手动处理错误,无法自动恢复 print(f"执行失败: {e}")LangGraph:
# 自动错误恢复graph = builder.compile( checkpointer=checkpointer, retry_policy=RetryPolicy(max_attempts=3))# 支持从检查点自动恢复,无需手动干预生态系统关系
LangChain生态系统├── LangChain Core # 核心组件库├── LangChain Community # 社区扩展├── LangSmith # 调试和监控平台├── LangGraph # 工作流编排框架 ← 本文重点├── LangServe # 服务部署工具└── LangGraph Platform # 云端部署平台关键关系说明:
互补关系:LangGraph不是替代LangChain,而是补充其工作流编排能力
依赖关系:LangGraph依赖LangChain的组件(LLM、工具等)
集成关系:LangGraph可以无缝使用LangChain的所有组件
选择指南
选择LangChain的情况:
构建简单的AI应用
快速原型开发
学习AI应用开发
单一功能的聊天机器人
选择LangGraph的情况:
构建复杂的多智能体系统
需要状态保持的长期任务
需要人工介入的工作流
生产级的智能体应用
需要可视化和监控的复杂系统
同时使用的情况(推荐):
用LangChain构建基础组件
用LangGraph编排复杂工作流
在同一项目中混合使用两者优势
2. 核心架构
2.1 设计理念
LangGraph的设计灵感来源于Google的Pregel系统和Apache Beam,采用图计算模型来处理智能体工作流。其核心思想是将智能体行为建模为图中的节点和边,通过消息传递机制实现状态管理和控制流。
2.2 主要组件
图引擎:基于Pregel模型的图计算引擎,支持状态化工作流
状态管理:提供共享状态机制,支持短期工作记忆和长期持久化存储
持久化执行:自动检查点机制,支持工作流中断恢复
多智能体协调:支持复杂的多智能体系统编排
API和CLI接口:提供Python和JavaScript两种SDK,以及命令行工具
3. 关键概念
LangGraph使用以下核心数据结构构建智能体工作流:
图(Graph):智能体工作流的整体结构,由节点和边组成
状态(State):共享的数据结构,表示应用程序的当前快照
节点(Node):执行具体逻辑的函数,接收状态作为输入并返回更新后的状态
边(Edge):定义节点间路由逻辑的函数,决定下一步执行哪个节点
检查点(Checkpoint):工作流执行状态的持久化快照
通道(Channel):状态管理中的数据流通道,支持不同类型的数据聚合
4. 工作流构建流程
4.1 标准工作流构建
定义状态模式(TypedDict或Pydantic模型)
创建StateGraph构建器
添加节点和边
配置检查点和运行时参数
编译图
执行工作流
4.1.1 检查点详解
检查点(Checkpoint)是LangGraph中的一个核心概念,它就像是工作流执行过程中的”存档点”或”快照”。理解检查点需要从以下几个维度来把握:
1. 什么是检查点?
检查点是工作流执行状态的完整持久化快照,包括:
当前状态(State):所有状态变量的当前值
执行位置:当前执行到哪个节点,下一步要去哪里
上下文信息:thread_id、时间戳、元数据等
历史记录:之前执行的节点序列和状态变化
2. 为什么需要检查点?
# 场景:客户支持系统# 第1天:客户开始咨询graph.invoke({ "issue": "无法登录系统", "customer_info": {"name": "张三", "id": "12345"}}, config={"configurable": {"thread_id": "support_001"}})# 客户需要找IT部门确认信息,对话中断...# 第2天:客户继续对话,状态完全恢复graph.invoke({ "additional_info": "IT部门说密码重置了"}, config={"configurable": {"thread_id": "support_001"}})# 智能体记得:昨天的对话内容、客户信息、当前问题状态3. 检查点的关键作用
A. 断点续传
工作流可以随时暂停,从上次离开的地方继续
不需要重新执行已完成的步骤
适合长时间运行的任务
B. 人类介入支持
在关键节点暂停,等待人工审核或决策
人工可以修改状态后再继续执行
实现人机协作的工作流
C. 错误恢复
当某个节点执行失败时,可以回滚到上一个检查点
支持重试机制和容错处理
提高系统的可靠性
D. 状态记忆
跨会话保持对话历史和上下文
支持多轮对话和复杂任务处理
提供连续的用户体验
4. 检查点的工作原理
from langgraph.checkpoint.memory import InMemorySaver# 1. 创建检查点存储器checkpointer = InMemorySaver() # 内存存储,适合开发测试# 2. 编译图时配置检查点graph = builder.compile(checkpointer=checkpointer)# 3. 使用thread_id跟踪会话config = {"configurable": {"thread_id": "user_session_001"}}# 4. 执行工作流 - 自动创建检查点result = graph.invoke({"input": "开始任务"}, config)# ↑ 在这个执行过程中,会在以下时机自动创建检查点:# - 每个节点执行前# - 每个节点执行后# - 工作流完成时# 5. 恢复执行 - 从最后检查点继续result = graph.invoke({"input": "继续任务"}, config)5. 检查点存储类型
# 内存存储 - 适合开发和测试from langgraph.checkpoint.memory import InMemorySavermemory_checkpointer = InMemorySaver()# SQLite存储 - 轻量级持久化from langgraph.checkpoint.sqlite import SqliteSaversqlite_checkpointer = SqliteSaver.from_conn_string(":memory:")# PostgreSQL存储 - 生产级数据库from langgraph.checkpoint.postgres import PostgresSaverpostgres_checkpointer = PostgresSaver.from_conn_string( "postgresql://user:pass@localhost/langgraph")6. 检查点的实际价值
检查点让LangGraph能够实现:
有状态的对话系统:智能体记得之前的对话内容
复杂的任务处理:多步骤任务可以分阶段完成
协作式工作流:人和AI可以交替参与任务
可靠的生产系统:具备容错和恢复能力
简而言之,检查点是LangGraph实现”状态化智能体”的关键技术,它让智能体具备了”记忆”和”持续思考”的能力。
4.2 状态管理模式
LangGraph支持多种状态管理模式:
默认状态:所有更新覆盖现有状态
聚合状态:使用reducer函数聚合多个更新
消息状态:专门用于处理对话消息的状态类型
4.2.1 状态管理机制详解
LangGraph的状态管理机制通过共享状态机制实现,支持短期工作记忆和长期持久化存储:
1. 共享状态机制
状态(State) 是一个共享的数据结构,所有节点都可以读取和更新
支持类型化的状态定义(TypedDict或Pydantic模型)
通过reducer函数管理状态更新策略
2. 短期工作记忆 (Short-term Working Memory)
生命周期:仅存在于单次工作流执行期间
访问速度:内存中快速访问
用途:维护当前任务的上下文、临时变量、中间计算结果
示例:当前对话轮次、临时推理结果、正在处理的数据
3. 长期持久化存储 (Long-term Persistent Storage)
生命周期:跨多个工作流执行会话
存储位置:数据库、文件系统等持久化存储
用途:用户偏好、历史记录、知识库、配置信息
恢复能力:支持工作流中断后从上次状态恢复
4. 状态更新机制
LangGraph使用Reducer函数来管理状态更新:
from typing import Annotatedfrom operator import addclass State(TypedDict): # 默认:覆盖更新 current_step: str # 使用add reducer:追加更新 conversation_history: Annotated[list, add] # 使用自定义reducer:聚合更新 total_calls: Annotated[int, lambda x, y: x + y]5. 实际应用示例
from typing_extensions import TypedDictclass CustomerSupportState(TypedDict): # 短期工作记忆 current_issue: str # 当前处理的问题 troubleshooting_steps: list # 当前故障排除步骤 # 长期持久化存储 customer_profile: dict # 客户档案信息 support_history: list # 历史支持记录 customer_preferences: dict # 客户偏好设置这种设计让LangGraph能够:
处理复杂任务:通过短期记忆维护复杂的推理链
保持上下文:通过长期存储记住用户偏好和历史
容错恢复:工作流中断后能精确恢复到中断点
多会话协作:支持跨多个交互会话的连续体验
4.2.2 状态通道详解
状态通道(Channel)是LangGraph中管理状态数据流的底层机制,它定义了状态数据如何在节点之间传递、聚合和更新。理解通道概念对于掌握LangGraph的状态管理至关重要。
1. 什么是状态通道?
状态通道就像是数据流的管道,负责:
数据传递:在节点之间传递状态信息
数据聚合:将多个节点的输出合并成最终状态
数据转换:根据预定义规则处理状态更新
数据同步:确保所有节点看到一致的状态
2. 通道的工作原理
# 传统状态更新(覆盖模式)def node_a(state): return {"messages": ["Hello"]}def node_b(state): return {"messages": ["World"]}# 最终状态:{"messages": ["World"]} - Hello被覆盖了# 使用通道聚合模式from typing import Annotatedfrom operator import addclass State(TypedDict): # 使用add reducer创建聚合通道 messages: Annotated[list, add]def node_a(state): return {"messages": ["Hello"]}def node_b(state): return {"messages": ["World"]}# 最终状态:{"messages": ["Hello", "World"]} - 数据被聚合3. 内置通道类型
A. LastValueChannel(最后值通道)
# 默认行为:新值覆盖旧值class State(TypedDict): current_step: str # 总是保存最后一步 user_input: str # 总是保存最新输入 confidence: float # 总是保存最新置信度B. BinaryOperatorAggregateChannel(二元操作聚合通道)
from typing import Annotatedfrom operator import add, ior, iandclass State(TypedDict): # 使用add操作符聚合列表 messages: Annotated[list, add] # 使用or操作符合并布尔值 any_flag_true: Annotated[bool, ior] # 使用and操作符合并布尔值 all_flags_true: Annotated[bool, iand] # 使用add操作符合并数字 total_cost: Annotated[int, add]C. TopicChannel(主题通道)
# 用于发布-订阅模式from langgraph.channels.topic import Topic# 创建主题通道events_topic = Topic("events")errors_topic = Topic("errors")# 节点可以订阅特定主题def error_handler(state): return {"error_log": errors_topic.get()}def event_processor(state): return {"processed_events": events_topic.get()}4. 自定义通道
from langgraph.channels.base import BaseChannelclass CustomAverageChannel(BaseChannel): """自定义通道:计算平均值""" def __init__(self): self.values = [] self.count = 0 def update(self, value): """更新通道值""" if value is not None: self.values.append(value) self.count += 1 def get(self): """获取当前值""" if self.count == 0: return 0.0 return sum(self.values) / self.count def checkpoint(self): """创建检查点""" return {"values": self.values.copy(), "count": self.count} def from_checkpoint(self, checkpoint): """从检查点恢复""" self.values = checkpoint["values"] self.count = checkpoint["count"]# 使用自定义通道class State(TypedDict): average_score: CustomAverageChannel rating_history: Annotated[list, add]5. 通道的实际应用场景
A. 对话历史管理
class ConversationState(TypedDict): # 消息历史:所有消息都被保留 messages: Annotated[list, add] # 当前主题:只保留最新主题 current_topic: str # 用户偏好:合并更新 user_preferences: Annotated[dict, lambda old, new: {**old, **new}]B. 多智能体协调
class MultiAgentState(TypedDict): # 各智能体的发现 research_findings: Annotated[list, add] # 分析结果 analysis_results: Annotated[dict, lambda old, new: {**old, **new}] # 最终决策(最后一个智能体的决定) final_decision: str # 所有智能体的投票 votes: Annotated[list, add]C. 状态化计算
class CalculationState(TypedDict): # 累积计算 running_sum: Annotated[int, add] # 步骤计数 step_count: Annotated[int, lambda x, y: x + 1] # 当前值(覆盖) current_value: float # 错误列表(累积) errors: Annotated[list, add]6. 通道的核心价值
状态通道让LangGraph能够:
灵活的状态管理:不同字段采用不同的更新策略
数据完整性:确保状态更新的一致性和可预测性
性能优化:避免不必要的数据复制和传输
扩展性:支持自定义复杂的状态处理逻辑
调试友好:清晰的数据流便于追踪和调试
7. 通道与检查点的协作
# 通道状态会被自动包含在检查点中checkpoint = { "values": { "messages": ["msg1", "msg2", "msg3"], # 聚合通道的当前值 "current_step": "analysis", # 最后值通道的当前值 "total_cost": 150, # 聚合通道的当前值 }, "channel_states": { # 通道内部状态(如平均值计算的中间值) "average_score": {"values": [0.8, 0.9, 0.7], "count": 3} }}简而言之,状态通道是LangGraph状态管理系统的”管道系统”,它决定了数据如何在智能体工作流中流动、变换和聚合,是构建复杂状态化应用的基础设施。
4.3 控制流类型
普通边:固定路由,从节点A直接到节点B
条件边:基于状态动态路由到不同节点
入口点:定义工作流的起始节点
条件入口点:基于输入动态选择起始节点
4.3.1 控制流类型详解
控制流类型之所以称之为”控制流”,是因为它们控制着工作流在图结构中的执行流向,决定了智能体在不同情况下应该执行哪个节点,如何从当前状态转换到下一个状态。
1. 控制执行路径
这些类型定义了在图结构中如何从一个节点流向另一个节点,这就是典型的控制流概念。就像编程语言中的:
if-else语句(条件路由)goto语句(固定路由)函数调用入口(入口点)
2. 图结构的路由控制
LangGraph通过这些控制流类型实现了智能体工作流的决策能力:
普通边 (Normal Edge)
# 固定执行路径:A → B → Cbuilder.add_edge("node_a", "node_b")builder.add_edge("node_b", "node_c")条件边 (Conditional Edge)
# 基于状态动态决定执行路径def route_decision(state): if state["confidence"] > 0.8: return "finalize" else: return "gather_more_info"builder.add_conditional_edges("analyze", route_decision, { "finalize": "final_node", "gather_more_info": "research_node"})入口点 (Entry Point)
# 控制工作流的开始位置builder.add_edge(START, "initial_node")条件入口点 (Conditional Entry Point)
# 根据输入条件动态选择开始位置def select_start_node(state): if state["user_type"] == "premium": return "premium_service" else: return "standard_service"builder.add_conditional_edges(START, select_start_node, { "premium_service": "premium_handler", "standard_service": "standard_handler"})3. 工作流的决策逻辑
通过这些控制流类型,LangGraph实现了:
基于当前状态决定下一步行动
根据输入条件选择不同的处理路径
灵活控制工作流的起点和流程
动态适应不同场景和用户需求
这种设计使得LangGraph能够构建智能的、自适应的工作流系统,而不是简单的线性处理流程。
5. 核心功能
5.1 持久化执行
LangGraph的核心特性是持久化执行,支持:
自动检查点:在关键执行点自动保存状态
中断恢复:工作流可以从任意检查点恢复执行
人类介入:支持人工干预和状态修改
容错处理:自动从异常中恢复
5.1.1 持久化执行机制详解
持久化执行是一种技术,工作流在关键点保存进度,允许暂停并在之后从离开的地方恢复执行。这在需要人类介入或长时间运行任务中特别有用。
1. 检查点机制
自动保存:在节点执行前后自动创建检查点
状态快照:保存完整的执行状态和上下文
线程跟踪:通过thread_id跟踪特定工作流实例
2. 持久化模式
LangGraph支持三种持久化模式:
"exit"模式:仅在执行完成时持久化,性能最佳"async"模式:异步持久化,平衡性能和持久性"sync"模式:同步持久化,确保数据一致性
3. 恢复机制
# 第一次执行 - 收集基本信息graph.invoke({ "current_issue": "无法登录系统", "customer_profile": {"name": "张三", "level": "premium"}}, config={"configurable": {"thread_id": "support_123"}})# 用户离开,系统中断...# 几天后恢复执行 - 状态完全恢复graph.invoke(None, config={"configurable": {"thread_id": "support_123"}})# 智能体记得之前的对话上下文和客户信息4. 人类介入支持
中断点:在特定节点设置中断点等待人工输入
状态修改:人工可以检查和修改工作流状态
恢复控制:人工决定何时和如何恢复执行
5. 容错处理
异常恢复:自动从LLM调用失败等异常中恢复
重试机制:支持配置重试策略
状态回滚:在失败时回滚到上一个有效检查点
5.2 多智能体协调
角色分配:不同智能体承担特定角色
协作机制:智能体间通过状态共享进行协作
监督模式:支持监督智能体协调其他智能体
5.2.1 多智能体协调机制详解
LangGraph的多智能体协调通过图结构和共享状态实现复杂的协作模式:
1. 角色专业化
# 定义不同角色的智能体节点def research_agent(state: State): """研究智能体 - 负责信息收集""" return {"research_data": collect_information(state["topic"])}def analysis_agent(state: State): """分析智能体 - 负责数据分析""" return {"analysis": analyze_data(state["research_data"])}def writing_agent(state: State): """写作智能体 - 负责内容生成""" return {"report": generate_report(state["analysis"])}2. 协作模式
并行协作:多个智能体同时处理不同任务
串行协作:智能体按顺序处理任务,每个智能体依赖前一个的结果
监督协作:监督智能体协调其他智能体的工作
3. 状态共享机制
全局状态:所有智能体共享的公共信息
私有状态:特定智能体使用的私有数据
消息传递:通过状态更新实现智能体间通信
4. 监督模式示例
def supervisor_agent(state: State): """监督智能体 - 协调其他智能体""" if state["task_complexity"] == "simple": return {"next_agent": "analysis_agent"} else: return {"next_agent": "research_agent"}# 条件路由graph.add_conditional_edges("supervisor", supervisor_agent)5. 智能体间通信
显式通信:通过状态字段直接传递信息
隐式通信:通过共享上下文间接协作
异步通信:智能体在不同时间点访问共享状态
这种多智能体协调机制使得LangGraph能够构建复杂的协作系统,每个智能体专注于特定任务,通过共享状态实现高效协作。
5.3 流式处理
token级流式:支持LLM响应的实时流式输出
中间步骤流式:实时显示智能体推理过程
状态更新流式:实时监控状态变化
5.3.1 流式处理机制详解
LangGraph的流式处理提供实时的执行反馈,增强用户体验和调试能力:
1. token流式
实时输出:在LLM生成响应时逐令牌输出
低延迟:减少用户等待时间
渐进显示:内容逐步显示,提升交互体验
# 启用流式处理for chunk in graph.stream({"input": "解释人工智能"}, stream_mode="values"): # 实时处理每个输出块 print(chunk)2. 中间步骤流式
推理过程:显示智能体的思考过程和决策步骤
工具调用:实时显示工具执行和结果
状态变化:跟踪状态变量的实时变化
3. 状态更新流式
增量更新:显示状态字段的逐步变化
可视化:便于理解工作流的执行流程
调试支持:帮助识别问题和优化性能
4. 流式模式
LangGraph支持多种流式模式:
"values"模式:流式输出最终值"updates"模式:流式输出状态更新"debug"模式:流式输出调试信息
5. 实际应用场景
用户界面:为聊天应用提供实时响应
监控面板:实时显示智能体执行状态
调试工具:开发时观察工作流执行细节
教育演示:展示智能体的推理过程
流式处理使得LangGraph应用能够提供更流畅的用户体验,同时为开发者提供强大的调试和监控能力。
6. 可扩展性
LangGraph设计了高度可扩展的架构,支持自定义以下组件:
检查点存储:实现自定义检查点存储后端
缓存系统:创建自定义缓存策略
状态通道:实现自定义状态通道类型
工具集成:无缝集成外部工具和API
模型适配:支持多种LLM提供商和自定义模型
7. 项目配置系统
LangGraph采用模块化配置系统:
环境变量:通过.env文件配置敏感信息
运行时配置:通过config参数传递运行时参数
检查点配置:配置持久化存储和检查点策略
缓存配置:配置节点缓存策略
8. 源码项目结构
8.1 核心模块目录
langgraph/├── libs/│ ├── langgraph/ # 核心框架│ │ ├── langgraph/│ │ │ ├── graph/ # 图构建模块│ │ │ │ ├── __init__.py│ │ │ │ ├── state.py # StateGraph实现│ │ │ │ └── message.py # MessageGraph实现│ │ │ ├── channels/ # 状态通道管理│ │ │ │ ├── __init__.py│ │ │ │ ├── base.py # 基础通道接口│ │ │ │ ├── last_value.py # 最后值通道│ │ │ │ └── topic.py # 主题通道│ │ │ ├── pregel/ # Pregel执行引擎│ │ │ ├── func/ # 函数工具和装饰器│ │ │ ├── runtime.py # 运行时管理│ │ │ ├── config.py # 配置管理│ │ │ └── errors.py # 错误处理│ │ └── tests/ # 测试文件│ ├── prebuilt/ # 预构建组件│ │ ├── langgraph_prebuilt/│ │ │ ├── agents.py # 预构建智能体│ │ │ ├── tools.py # 工具节点│ │ │ └── validation.py # 验证节点│ ├── checkpoint/ # 检查点基础接口│ ├── checkpoint-sqlite/ # SQLite检查点实现│ ├── checkpoint-postgres/ # PostgreSQL检查点实现│ ├── cli/ # 命令行接口│ ├── sdk-py/ # Python SDK│ └── sdk-js/ # JavaScript SDK├── docs/ # 项目文档├── examples/ # 示例代码└── benchmarks/ # 性能基准测试8.2 关键模块功能说明
8.2.1 核心框架模块 (libs/langgraph/)
graph模块:提供StateGraph和MessageGraph类,用于构建智能体工作流
channels模块:管理状态数据流,支持不同类型的通道聚合
pregel模块:基于Pregel模型的执行引擎,处理图计算
runtime模块:运行时管理和配置
8.2.2 预构建组件 (libs/prebuilt/)
智能体组件:提供预构建的ReAct智能体等常用模式
工具节点:标准化的工具执行节点
验证节点:输入验证和处理节点
8.2.3 检查点系统 (libs/checkpoint*/)
基础接口:定义检查点存储的通用接口
SQLite实现:基于SQLite的轻量级检查点存储
PostgreSQL实现:基于PostgreSQL的生产级检查点存储
8.2.4 CLI工具 (libs/cli/)
项目管理:项目初始化和配置管理
工作流执行:命令行执行智能体工作流
部署支持:支持部署到LangGraph平台
9. 使用场景
LangGraph特别适用于以下场景:
复杂多智能体系统:需要多个智能体协作的复杂任务
长时间运行工作流:需要持久化状态和中断恢复的应用
人类介入系统:需要人工审核和干预的智能体工作流
生产级智能体应用:需要高可靠性和可扩展性的生产环境
状态化对话系统:需要维护对话历史和上下文的聊天应用
10. 总结
LangGraph是一个强大的状态化智能体编排框架,通过将智能体工作流建模为图结构,结合持久化执行和状态管理,为构建复杂的多智能体系统提供了生产级别的支持。其模块化设计、丰富的生态系统集成和高度可扩展性使其能够适应各种复杂的智能体应用场景。
该框架既提供了低级别的控制能力用于自定义智能体架构,也提供了高级别的预构建组件用于快速开发,使其既适合经验丰富的AI开发者,也适合智能体系统的新手。