🕸️ LangGraph:构建状态化智能体的低编排框架

源码解析与实践指南

源码级别解析 · 深度剖析·状态化工作流·智能体编排
2026-04-19 | 每日技术深度解读

为什么选择 LangGraph?

企业级智能体开发解决方案
  • 低级别编排框架,专注智能体核心能力
  • 支持长时间运行、状态化的工作流
  • 被 Klarna、Uber、J.P. Morgan 等公司采用
  • 与 LangChain 生态系统无缝集成

LangGraph 核心特性

五大核心优势
  • 🔄 持久化执行 (Durable Execution)
  • 👥 人机协作 (Human-in-the-loop)
  • 🧠 全面内存系统 (Comprehensive Memory)
  • 🔍 调试支持 (LangSmith 集成)
  • 🚀 生产就绪部署 (Production Deployment)

相比传统框架,LangGraph 提供更底层、更灵活的编排能力

快速开始 - 安装

pip install -U langgraph

# 或使用 uv
uv add langgraph

支持 pip 和 uv 两种安装方式

Hello World 示例

基础智能体构建
  • 创建基于图状态 (StateGraph) 的智能体
  • 定义节点 (nodes) 和边 (edges)
  • 编译并运行智能体

Hello World - 基础架构

from langgraph.graph import StateGraph, MessagesState, START, END

def mock_llm(state: MessagesState):
    return {"messages": [{"role": "ai", "content": "hello world"}]}

graph = StateGraph(MessagesState)
graph.add_node(mock_llm)
graph.add_edge(START, "mock_llm")
graph.add_edge("mock_llm", END)
graph = graph.compile()

LangGraph 的基础架构模式

架构概览

LangGraph 架构图
  • 🎯 StateGraph:图状态管理核心
  • 🔄 节点系统:LLM 调用、工具执行
  • 🛣️ 边系统:条件路由、循环控制
  • 💾 检查点:状态持久化
  • 👥 人机交互:中断与恢复

LangGraph 架构图

``` ┌─────────────────┐ ┌─────────────┐ ┌─────────────────┐ │ StateGraph │────│ Nodes │────│ Edges │ │ │ │ │ │ │ │ - State Mgmt │ │ - LLM Node │ │ - Conditional │ │ - Checkpointer │ │ - Tool Node │ │ - Normal │ │ - Persistence │ │ - Custom │ │ - Loop │ └─────────────────┘ └─────────────┘ └─────────────────┘ │ │ ▼ ▼ ┌─────────────────┐ ┌─────────────┐ ┌─────────────────┐ │ State │ │ Input │ │ Output │ │ │ │ │ │ │ │ - Messages │ │ - User Msg │ │ - Agent Reply │ │ - Tool Results │ │ - Tools │ │ - Final Result │ │ - LLM Calls │ │ - Config │ │ - Error Info │ └─────────────────┘ └─────────────┘ └─────────────────┘ ```

LangGraph 的核心架构组件及其交互关系

状态管理 (State Management)

智能体的记忆系统
  • 📝 MessagesState:消息集合管理
  • ⚡ 使用 Annotated[operator.add] 累积消息
  • 🔄 状态在节点间自动传递
  • 💼 支持自定义状态类型

状态定义示例

from typing_extensions import TypedDict, Annotated
from langchain.messages import AnyMessage
import operator

class MessagesState(TypedDict):
    messages: Annotated[list[AnyMessage], operator.add]
    llm_calls: int
    tool_results: list[dict]

LangGraph 的状态定义模式,使用类型注解确保状态一致性

节点系统 (Nodes)

图中的执行单元
  • 🤖 LLM 节点:大语言模型调用
  • 🔧 工具节点:外部工具执行
  • 🎯 条件节点:业务逻辑判断
  • 📋 自定义节点:业务逻辑实现

LLM 节点实现

from langchain.messages import SystemMessage

def llm_call(state: dict):
    """LLM 节点:决定是否调用工具"""
    return {
        "messages": [
            model_with_tools.invoke(
                [
                    SystemMessage(
                        content="You are a helpful assistant..."
                    )
                ] + state["messages"]
            )
        ],
        "llm_calls": state.get('llm_calls', 0) + 1
    }

LLM 节点的标准实现模式

工具节点实现

from langchain.messages import ToolMessage

def tool_node(state: dict):
    """工具节点:执行工具调用"""
    result = []
    for tool_call in state["messages"][-1].tool_calls:
        tool = tools_by_name[tool_call["name"]]
        observation = tool.invoke(tool_call["args"])
        result.append(ToolMessage(
            content=observation, 
            tool_call_id=tool_call["id"]
        ))
    return {"messages": result}

工具节点的实现模式,支持多工具并发调用

边系统 (Edges)

图中的连接逻辑
  • 🔄 普通边 (Normal Edges):固定连接
  • ❓ 条件边 (Conditional Edges):基于条件路由
  • 🔄 循环节点:实现多次迭代
  • 🎯 终止条件:判断何时结束

条件边实现

from typing import Literal

def should_continue(state: MessagesState) -> Literal["tool_node", END]:
    """决定是否继续循环"""
    messages = state["messages"]
    last_message = messages[-1]
    
    if last_message.tool_calls:
        return "tool_node"
    return END

# 使用条件边
agent_builder.add_conditional_edges(
    "llm_call",
    should_continue,
    ["tool_node", END]
)

条件边的标准实现,支持动态路由

持久化执行 (Durable Execution)

智能体状态持久化
  • 💾 自动保存执行状态
  • 🔄 支持中断后精确恢复
  • 🛡️ 处理 LLM 调用超时
  • ⏱️ 长时间运行的任务支持

持久化模式对比

三种持久化模式选择
  • 🚪 "exit":退出时保存
  • 📊 "async":异步保存(推荐)
  • 🔄 "sync":同步保存(最可靠)

根据性能和可靠性需求选择合适的持久化模式

持久化配置

# 持久化模式选择
result = graph.stream(
    {"input": "计算 3+4"},
    durability="sync"  # 同步持久化
)

# 使用检查点
from langgraph.checkpoint.memory import MemoryCheckpointer
checkpointer = MemoryCheckpointer()
graph = graph.compile(checkpointer=checkpointer)

持久化模式的使用和配置

确定性重放

确保状态一致性
  • 🎯 任务封装:包装非确定性操作
  • ⚡ 副作用管理:避免重复执行
  • 🔄 幂等操作:确保重放一致性
  • 🔍 可追溯性:完整的执行路径记录

任务封装示例

# 使用任务包装非确定性操作
from langgraph.prebuilt import InjectedState

def process_file_task(state: dict, file_path: str):
    """包装文件读写操作"""
    with open(file_path, 'r') as f:
        content = f.read()
    return {"processed_content": content}

# 在节点中使用任务
def process_file_node(state: dict):
    task = process_file_task.with_retry(state, "data.txt")
    return task.invoke()

使用任务包装确保操作的可重放性

内存系统 (Memory System)

智能体的记忆架构
  • 💭 短期记忆:对话上下文
  • 💾 长期记忆:跨会话状态
  • 🧠 工作记忆:推理过程中的临时状态
  • 🔄 记忆更新:基于交互动态调整

内存类型

LangGraph 的内存分类
  • 📝 短期内存:当前会话的消息历史
  • 💾 持久化内存:跨会话的状态保存
  • 🔧 工作内存:推理过程中的状态
  • 👥 共享内存:多智能体间的状态共享

内存配置

# 基础内存配置
from langgraph.checkpoint.memory import MemoryCheckpointer
from langgraph.graph import START, END

checkpointer = MemoryCheckpointer()
graph = graph.compile(checkpointer=checkpointer)

# 带线程 ID 的内存
thread_config = {"thread_id": "conversation-123"}
result = graph.invoke(
    {"messages": ["Hello"]},
    config=thread_config
)

内存系统的配置和使用模式

人机协作 (Human-in-the-loop)

智能体与人类协作
  • 🛑 执行中断:随时暂停检查
  • 📝 状态修改:人工干预调整
  • ✅ 结果验证:确认下一步操作
  • 🔄 自定义流程:根据反馈调整

中断类型

LangGraph 的中断机制
  • 🔄 输入中断:执行前检查
  • 🛑 执行中断:执行中暂停
  • ✅ 输出中断:完成后验证
  • 🎯 抽象中断:自定义逻辑触发

中断配置

# 配置中断
from langgraph.checkpoint.memory import MemoryCheckpointer
checkpointer = MemoryCheckpointer()

# 编译时配置中断
graph = graph.compile(
    checkpointer=checkpointer,
    interrupt_before=["human_review"],
    interrupt_after=["llm_call"]
)

# 运行时中断
config = {"thread_id": "conversation-123"}
result = graph.invoke(
    {"messages": ["Review this document"]},
    config=config
)

中断机制的使用和配置

LangSmith 集成

智能体调试与监控
  • 🔍 执行路径追踪:可视化智能体执行流程
  • 📊 状态监控:实时查看智能体状态变化
  • 🎯 性能指标:响应时间、成功率等
  • 🚨 错误分析:智能体行为异常检测

LangSmith 功能

生产级监控能力
  • 📈 评估指标:智能体输出质量评估
  • 🔄 性能优化:瓶颈识别和优化建议
  • 👥 团队协作:多用户调试和共享
  • 📝 实验管理:A/B 测试和版本控制

LangSmith 配置

# 设置 LangSmith 跟踪
import os
os.environ["LANGCHAIN_TRACING"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"

# 配置跟踪选项
from langgraph.prebuilt import inject_trace

# 编译时注入跟踪
graph = graph.compile(inject_trace=True)

LangSmith 的配置和使用

图 API vs 函数式 API

两种编程模式对比
  • 🎯 图 API:适合复杂工作流,可视化强
  • ⚡ 函数式 API:适合简单任务,代码简洁
  • 🔄 混合使用:根据场景选择最佳模式
  • 🔧 代码复用:不同 API 间的组件共享

图 API 适用场景

StateGraph 的优势
  • 🔄 复杂工作流:多节点、多边的复杂逻辑
  • 📊 可视化需求:便于设计和调试
  • 🎯 重复使用:可重用的节点和边
  • 👥 团队协作:图形化易于理解和维护

函数式 API 适用场景

Function API 的优势
  • ⚡ 简单任务:线性执行流程
  • 📝 代码简洁:减少样板代码
  • 🔧 快速原型:快速验证想法
  • 🎯 单节点应用:专注于核心逻辑

函数式 API 示例

# 函数式 API 使用
from langgraph.graph import MessagesState
from langchain_core.messages import AIMessage, HumanMessage

def agent_with_memory(state: MessagesState):
    """带内存的智能体函数式实现"""
    messages = state["messages"]
    response = model.invoke(messages)
    return {"messages": messages + [response]}

# 使用函数式 API
graph = agent_with_memory.compile()

函数式 API 的简洁实现方式

多智能体系统

构建协作智能体群
  • 🤝 智能体协作:多个智能体协同工作
  • 📊 子图系统:复杂逻辑的模块化
  • 🔄 消息传递:智能体间的通信
  • 🎯 角色分工:不同智能体专注不同任务

子图模式

模块化智能体设计
  • 📦 功能封装:将复杂逻辑封装成子图
  • 🔄 递归设计:子图内可嵌套子图
  • 🔗 接口设计:标准的输入输出格式
  • 🎯 可重用性:可在多个地方重复使用

子图实现

# 子图实现
subgraph = StateGraph(SubAgentState)
subgraph.add_node("search", search_agent)
subgraph.add_node("analyze", analyze_agent)
subgraph.add_edge(START, "search")
subgraph.add_edge("search", "analyze")
subgraph.add_edge("analyze", END)
compiled_subgraph = subgraph.compile()

# 在主图中使用子图
main_graph.add_node("research", compiled_subgraph)

子图的创建和集成方式

工具集成

外部工具集成策略
  • 🔧 LangChain 工具:丰富的工具生态
  • 🌐 API 调用:RESTful API 集成
  • 📊 数据库操作:数据库查询和更新
  • 🔄 文件操作:文件读写和处理

自定义工具集成

# 自定义工具定义
from langchain.tools import tool

tool = tool

def search_web(query: str) -> str:
    """搜索互联网获取信息"""
    # 实现搜索逻辑
    return search_results

def calculate(expression: str) -> float:
    """计算数学表达式"""
    # 实现计算逻辑
    return result

# 工具绑定
model_with_tools = model.bind_tools([search_web, calculate])

自定义工具的创建和绑定方式

错误处理机制

智能体的容错设计
  • 🔄 自动重试:失败任务自动重试
  • 📝 错误捕获:异常情况的优雅处理
  • 🚨 降级策略:失败时的备选方案
  • 🔍 错误分析:详细的错误信息记录

重试策略

LangGraph 的重试机制
  • ⏱️ 指数退避:逐渐增加重试间隔
  • 🎯 最大重试次数:防止无限重试
  • 🔄 条件重试:基于错误类型选择重试
  • 📊 重试统计:重试成功率分析

重试配置

# 节点重试配置
def llm_with_retry(state: dict):
    """带重试的 LLM 节点"""
    try:
        response = model_with_tools.invoke(state["messages"])
        return {"messages": [response]}
    except Exception as e:
        # 记录错误信息
        error_msg = f"LLM 调用失败: {str(e)}"
        return {"messages": [AIMessage(content=error_msg)]}

# 使用 retry 包装器
from langgraph.prebuilt import retry
llm_node = retry(llm_with_retry, max_attempts=3)

节点的重试机制配置

性能优化

智能体性能优化策略
  • 🚀 并行处理:多任务并行执行
  • 💾 状态缓存:避免重复计算
  • 🎯 批处理:批量操作优化
  • ⚡ 流式处理:实时响应优化

并行执行模式

LangGraph 的并发能力
  • 🔄 并行分支:同时执行多个路径
  • ⏱️ 流式输出:逐步返回结果
  • 📊 批处理:批量处理多个输入
  • 🎯 条件并行:基于条件选择并行

并行执行示例

# 并行执行配置
from langgraph.graph import START, END, StateGraph
from langgraph.prebuilt import inject_parallel

def parallel_processor(state: dict):
    """并行处理多个任务"""
    # 使用异步并行处理
    tasks = [
        process_data_async(state["data1"]),
        process_data_async(state["data2"]),
        process_data_async(state["data3"])
    ]
    results = asyncio.gather(*tasks)
    return {"processed_data": results}

# 编译时配置并行
graph = graph.compile(inject_parallel=True)

并行处理的配置和使用

部署策略

生产环境部署方案
  • 🏗️ 容器化:Docker 容器部署
  • ⚡ 云原生:Kubernetes 部署
  • 🔄 扩容策略:自动扩缩容机制
  • 📊 监控告警:实时监控和告警

生产环境配置

生产环境最佳实践
  • 🔒 安全配置:API 密钥和权限管理
  • 📊 日志收集:详细的执行日志
  • 🔄 健康检查:服务健康监控
  • 🚀 性能监控:实时性能指标

LangGraph 生态系统

完整开发工具链
  • 🔗 LangChain:组件和工具生态
  • 🔍 LangSmith:调试和监控平台
  • 🎯 Deep Agents:高级智能体开发
  • 📚 LangChain Academy:学习资源

实际应用案例

企业级应用场景
  • 💼 客户服务:24/7 智能客服
  • 📊 数据分析:自动化数据处理
  • 🎯 内容生成:个性化内容创作
  • 🔄 工作流自动化:业务流程自动化

最佳实践

LangGraph 开发指南
  • 🎯 明确定义状态结构
  • ⚡ 合理使用持久化模式
  • 🔄 妥善处理错误和异常
  • 📊 充分利用监控和调试

基于实际项目经验的开发建议

避免的陷阱

常见问题和解决方案
  • ⚡ 避免无限循环:设置合理的终止条件
  • 🔄 妥善处理非确定性操作:使用任务包装
  • 💾 合理使用内存:避免内存泄漏
  • 🔍 充分测试:覆盖各种异常情况

学习资源

持续学习路径
  • 📚 官方文档:https://docs.langchain.com
  • 🎓 LangChain Academy:结构化课程
  • 👥 社区论坛:技术交流和支持
  • 🔗 GitHub:源码贡献和讨论

总结

LangGraph 核心价值
  • 🎯 状态化智能体:长时间运行的智能体系统
  • 🔄 持久化执行:可靠的工作流管理
  • 👥 人机协作:无缝的协作体验
  • 🚀 生产就绪:企业级部署能力

LangGraph 重新定义了智能体开发和部署的标准

参考资料

  • 源码仓库: https://github.com/langchain-ai/langgraph
  • 官方文档: https://docs.langchain.com/oss/python/langgraph/overview
  • LangSmith: https://www.langchain.com/langsmith
  • 安装指南: https://docs.langchain.com/oss/python/langgraph/quickstart

感谢阅读!
访问 https://atcfu.com/ai-articles/langgraph-stateful-agents/ 回顾本文