项目概述
LangGraph 是一个用于构建有状态、多角色应用程序的低级编排框架。该项目基于 Google 的 Pregel 论文和 Apache Beam 理念,采用参与者模型(Actor Model)和 Bulk Synchronous Parallel(BSP)执行模式。
核心特性
- 持久化执行:支持长时间运行的有状态工作流
- 人机交互:无缝集成人工干预和审核
- 全面内存:支持短期工作内存和长期持久内存
- 调试支持:与 LangSmith 集成,提供深度可视化
- 生产就绪:可扩展的基础设施部署
Monorepo 结构
graph TD
A[LangGraph Monorepo] --> B[libs/]
B --> C[checkpoint/]
B --> D[checkpoint-postgres/]
B --> E[checkpoint-sqlite/]
B --> F[cli/]
B --> G[langgraph/]
B --> H[prebuilt/]
B --> I[sdk-js/]
B --> J[sdk-py/]
style G fill:#f9f,stroke:#333,stroke-width:4px
style H fill:#bbf,stroke:#333,stroke-width:2px
style C fill:#bfb,stroke:#333,stroke-width:2px
依赖关系图
checkpoint
├── checkpoint-postgres
├── checkpoint-sqlite
├── prebuilt
└── langgraph
prebuilt
└── langgraph
sdk-py
├── langgraph
└── cli
sdk-js (standalone)
整体架构设计
1. 核心架构组件
graph TB
subgraph "用户接口层"
UI[用户接口]
API[REST API]
CLI[命令行工具]
end
subgraph "高级API层"
PREBUILT[Prebuilt APIs]
REACT[ReAct Agent]
TOOLS[Tool Node]
end
subgraph "核心框架层"
GRAPH[StateGraph]
PREGEL[Pregel 执行引擎]
CHANNELS[通道系统]
NODES[节点系统]
end
subgraph "持久化层"
CHECKPOINT[Checkpoint]
POSTGRES[PostgreSQL]
SQLITE[SQLite]
MEMORY[内存存储]
end
subgraph "运行时层"
RUNTIME[Runtime]
EXECUTOR[执行器]
SCHEDULER[调度器]
end
UI --> PREBUILT
API --> GRAPH
CLI --> GRAPH
PREBUILT --> GRAPH
REACT --> TOOLS
GRAPH --> PREGEL
PREGEL --> CHANNELS
PREGEL --> NODES
PREGEL --> RUNTIME
RUNTIME --> EXECUTOR
RUNTIME --> SCHEDULER
PREGEL --> CHECKPOINT
CHECKPOINT --> POSTGRES
CHECKPOINT --> SQLITE
CHECKPOINT --> MEMORY
2. Pregel 算法架构
LangGraph 的核心基于 Pregel 算法,采用 Bulk Synchronous Parallel (BSP) 模型:
sequenceDiagram
participant Input as 输入
participant Pregel as Pregel引擎
participant Actors as 参与者节点
participant Channels as 通道
participant Output as 输出
Input->>Pregel: 提交任务
loop 执行步骤
Note over Pregel: 计划阶段
Pregel->>Pregel: 选择要执行的参与者
Note over Pregel: 执行阶段
Pregel->>Actors: 并行执行选中的参与者
Actors->>Channels: 写入数据到通道
Note over Pregel: 更新阶段
Pregel->>Channels: 更新通道值
Channels->>Pregel: 通知更新完成
alt 有更多参与者要执行
Pregel->>Pregel: 继续下一步
else 无更多参与者
Pregel->>Output: 返回最终结果
end
end
3. 状态管理架构
graph LR
subgraph "状态定义"
SCHEMA[状态模式]
TYPED[TypedDict]
PYDANTIC[Pydantic模型]
end
subgraph "通道类型"
LAST[LastValue]
TOPIC[Topic]
BINARY[BinaryOp]
EPHEMERAL[Ephemeral]
end
subgraph "状态更新"
REDUCER[Reducer函数]
UPDATE[状态更新]
MERGE[状态合并]
end
SCHEMA --> LAST
TYPED --> TOPIC
PYDANTIC --> BINARY
LAST --> REDUCER
TOPIC --> UPDATE
BINARY --> MERGE
核心概念详解
1. StateGraph(状态图)
StateGraph 是 LangGraph 的主要接口,允许开发者定义节点和边的有向图:
关键特性:
- 节点通过共享状态通信
- 支持条件边和并发执行
- 内置状态验证和类型检查
- 支持中断和恢复机制
2. Pregel 执行引擎
Pregel 是 LangGraph 的运行时执行引擎:
执行模式:
- 计划阶段:确定哪些参与者在此步骤中执行
- 执行阶段:并行执行所有选定的参与者
- 更新阶段:用参与者写入的值更新通道
3. 通道系统
通道用于参与者之间的通信:
通道类型:
- LastValue:存储发送到通道的最后一个值
- Topic:可配置的发布订阅主题
- BinaryOperatorAggregate:使用二元运算符聚合值
- Context:管理外部资源的生命周期
4. Checkpoint 机制
Checkpoint 提供版本化的"短期记忆":
功能特性:
- 支持图的暂停、恢复和重放
- 多后端支持(内存、SQLite、PostgreSQL)
- 自动状态持久化
- 支持时间旅行调试
数据流架构
flowchart TD
A[用户输入] --> B[StateGraph]
B --> C[状态验证]
C --> D[Pregel编译]
D --> E[执行计划]
E --> F{有待执行节点?}
F -->|是| G[选择节点]
F -->|否| P[返回结果]
G --> H[并行执行]
H --> I[更新通道]
I --> J[Checkpoint保存]
J --> K{需要中断?}
K -->|是| L[中断处理]
K -->|否| F
L --> M[等待恢复]
M --> F
API 设计模式
1. 构建器模式
# StateGraph 使用构建器模式
graph = StateGraph(StateSchema)
graph.add_node("agent", agent_node)
graph.add_node("tools", tool_node)
graph.add_edge(START, "agent")
graph.add_conditional_edges("agent", tools_condition)
graph.set_finish_point("tools")
compiled = graph.compile(checkpointer=memory)
2. 装饰器模式
# 使用装饰器定义工具
@tool
def search_web(query: str) -> str:
"""搜索网络内容"""
return f"搜索结果:{query}"
3. 依赖注入模式
# 运行时依赖注入
def node_function(state: State, runtime: Runtime[Context]) -> dict:
context = runtime.context
return {"result": process_with_context(state, context)}
性能优化策略
1. 并行执行
- 支持节点级别的并行执行
- 通道更新的原子操作
- 异步执行支持
2. 内存管理
- 惰性状态加载
- Checkpoint 压缩
- 垃圾回收优化
3. 缓存机制
- 节点结果缓存
- 状态快照缓存
- 执行计划缓存
扩展机制
1. 自定义通道
开发者可以实现自定义通道类型:
class CustomChannel(BaseChannel):
def update(self, values: Sequence[Any]) -> None:
# 自定义更新逻辑
pass
2. 自定义节点
支持多种节点类型:
- 函数节点
- Runnable 节点
- 异步节点
- 流式节点
3. 中间件支持
提供中间件机制用于:
- 请求/响应拦截
- 日志记录
- 性能监控
- 错误处理
总结
LangGraph 通过精心设计的架构,提供了一个强大而灵活的框架来构建复杂的AI应用程序。其核心优势在于:
- 模块化设计:清晰的分层架构便于扩展和维护
- 强类型支持:完整的类型系统确保运行时安全
- 灵活的执行模型:基于Pregel的BSP模型支持复杂的执行流程
- 完善的持久化:多样化的Checkpoint后端满足不同需求
- 丰富的工具生态:预构建的组件加速开发过程
在后续的模块分析中,我们将深入探讨每个组件的实现细节和最佳实践。