1. LangGraph 核心概念解析
LangGraph 是 LangChain 团队推出的低级别智能体编排框架,它基于图计算模型构建有状态的 AI Agent 系统。与传统的线性执行链不同,LangGraph 通过节点(计算单元)、边(流程转换)和状态(全局共享数据)三大核心组件,实现了更复杂的智能体行为编排。
提示:LangGraph 特别适合需要长期记忆、复杂条件分支和人工干预的生产级 AI 应用场景。
1.1 图计算模型 vs 传统链式调用
传统 LangChain 的链式调用存在几个关键限制:
- 状态管理混乱:中间结果需要手动传递
- 执行流程僵化:难以实现循环和条件分支
- 错误恢复困难:失败后需要从头开始执行
LangGraph 的图模型解决了这些问题:
- 显式状态管理:全局状态对象统一管理所有数据
- 灵活流程控制:支持条件分支、循环和并行执行
- 持久化执行:可以从任意检查点恢复执行
1.2 核心架构设计
LangGraph 的运行时基于 Google Pregel 并行图计算模型,执行过程分为三个阶段:
- Plan 阶段:确定本轮要执行的节点
- Execution 阶段:并行执行所有选中节点
- Update 阶段:将节点输出更新到通信通道
这种设计使得 LangGraph 能够:
- 高效处理并行任务
- 支持大规模状态管理
- 实现复杂的控制流
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境配置与基础使用
2.1 开发环境准备
推荐使用 conda 创建隔离的 Python 环境:
bash复制conda create -n langgraph python=3.12
conda activate langgraph
pip install -U langgraph
验证安装成功:
bash复制pip show langgraph
# 应显示类似信息:
# Name: langgraph
# Version: 1.0.5
2.2 最小工作示例
下面是一个最简单的 LangGraph 应用,实现基本的对话响应:
python复制from langgraph.graph import StateGraph, MessagesState
# 定义模拟LLM节点
def mock_llm(state: MessagesState):
return {"messages": [{"role": "ai", "content": "你好,我是AI助手"}]}
# 构建状态图
graph = StateGraph(MessagesState)
graph.add_node("llm_node", mock_llm)
graph.add_edge(START, "llm_node") # 从开始节点连接到LLM节点
graph.add_edge("llm_node", END) # 从LLM节点连接到结束节点
# 编译并执行图
app = graph.compile()
response = app.invoke({"messages": [{"role": "user", "content": "你好"}]})
print(response)
这个示例展示了 LangGraph 的核心工作流程:
- 定义状态类型(MessagesState)
- 创建节点函数
- 构建图结构
- 编译并执行
3. 状态管理与节点设计
3.1 状态(State)详解
State 是 LangGraph 中最重要的概念之一,它定义了图的全局共享数据结构。一个完整的 State 包含两部分:
- Schema:状态结构定义
- Reducer:状态更新逻辑
3.1.1 状态Schema定义
支持三种方式定义状态结构:
- TypedDict:Python 类型注解
- Pydantic Model:更强大的数据验证
- 简单字典:快速原型开发
推荐的生产级写法:
python复制from typing_extensions import TypedDict
from typing import List
class ChatState(TypedDict):
messages: List[dict] # 对话历史
metadata: dict # 附加元数据
retry_count: int # 重试计数器
3.1.2 Reducer更新策略
Reducer 决定了节点返回值如何与全局状态合并。常用策略包括:
| Reducer类型 | 行为 | 适用场景 |
|---|---|---|
| 默认行为 | 直接覆盖字段值 | 普通字段更新 |
| add_messages | 追加消息到列表 | 对话历史管理 |
| operator.add | 数值累加/列表合并 | 计数器/收集结果 |
| 自定义Reducer | 开发者定义合并逻辑 | 特殊业务需求 |
示例:使用 add_messages 管理对话历史
python复制from typing import Annotated
from langgraph.graph.message import add_messages
class ChatState(TypedDict):
messages: Annotated[List[dict], add_messages]
3.2 高级节点功能
3.2.1 节点缓存
对于计算密集型的节点,可以启用缓存避免重复计算:
python复制from langgraph.cache.memory import InMemoryCache
from langgraph.types import CachePolicy
def expensive_computation(state: State):
# 模拟耗时计算
return {"result": complex_calculation()}
graph.add_node(
"expensive_node",
expensive_computation,
cache_policy=CachePolicy(ttl=300) # 缓存5分钟
)
graph.compile(cache=InMemoryCache())
3.2.2 重试机制
为不稳定操作配置自动重试:
python复制from langgraph.types import RetryPolicy
def call_external_api(state: State):
# 可能失败的外部API调用
return api_client.call()
graph.add_node(
"api_call",
call_external_api,
retry_policy=RetryPolicy(
max_attempts=3,
backoff_factor=1.5 # 指数退避
)
)
4. 复杂流程控制
4.1 条件分支实现
LangGraph 支持基于状态的动态路由:
python复制from typing import Literal
def router(state: State) -> Literal["node_a", "node_b"]:
return "node_a" if state["value"] > 0 else "node_b"
graph.add_conditional_edges(
"decision_node",
router,
{"node_a": "node_a", "node_b": "node_b"}
)
4.2 循环与递归
实现循环执行的两种方式:
- 显式循环:通过条件边实现
python复制def should_continue(state: State) -> Literal["process", "exit"]:
return "process" if not state["done"] else "exit"
graph.add_conditional_edges(
"process_node",
should_continue,
{"process": "process_node", "exit": END}
)
- 递归限制:防止无限循环
python复制graph.set_recursion_limit(100) # 最大递归深度
4.3 并行与同步
LangGraph 原生支持并行执行:
python复制graph.add_node("task_a", task_a)
graph.add_node("task_b", task_b)
graph.add_edge(START, "task_a")
graph.add_edge(START, "task_b")
# 同步节点(等待所有前置节点完成)
graph.add_node("sync_node", sync_func, defer=True)
5. 生产环境最佳实践
5.1 错误处理策略
健壮的 LangGraph 应用应包含:
- 节点级错误处理:捕获并转换特定异常
- 全局fallback:提供默认响应
- 监控集成:与 LangSmith 等工具集成
示例节点错误处理:
python复制def safe_operation(state: State):
try:
return risky_operation()
except ExpectedError as e:
return {"error": str(e)}
except:
# 触发重试或fallback
raise
5.2 性能优化技巧
-
节点粒度控制:
- 计算密集型操作单独成节点
- I/O操作合并减少网络开销
-
缓存策略:
- 对纯函数节点启用缓存
- 根据业务特点设置合理TTL
-
资源限制:
python复制graph.set_max_iters(100) # 限制最大迭代次数
5.3 调试与监控
- 执行追踪:
python复制result = app.invoke(
input,
config={"callbacks": [ConsoleCallbackHandler()]}
)
- LangSmith集成:
python复制os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "my_langgraph_app"
6. 实际应用案例
6.1 复杂对话系统
构建支持多轮对话、知识检索和人工审核的智能助手:
python复制class DialogState(TypedDict):
messages: Annotated[List[dict], add_messages]
needs_human: bool
search_results: List[str]
def route_dialog(state: DialogState):
if state["needs_human"]:
return "human_review"
elif needs_search(state["messages"][-1]):
return "search"
else:
return "generate"
# 构建包含多个专业节点的对话图
graph = StateGraph(DialogState)
graph.add_node("classify", classify_intent)
graph.add_node("search", retrieve_knowledge)
graph.add_node("generate", generate_response)
graph.add_node("human_review", human_intervention)
graph.add_conditional_edges("classify", route_dialog)
# ... 更多边连接
6.2 数据处理流水线
实现带错误恢复的数据ETL流程:
python复制class ETLState(TypedDict):
raw_data: List[dict]
processed: List[dict]
errors: List[dict]
graph = StateGraph(ETLState)
graph.add_node("extract", extract_data)
graph.add_node("transform", transform_data)
graph.add_node("load", load_to_db)
graph.add_node("handle_error", error_handler)
graph.add_edge("extract", "transform")
graph.add_conditional_edges(
"transform",
lambda s: "load" if not s["errors"] else "handle_error"
)
我在实际项目中发现,合理设置检查点可以大幅提升长流程的可靠性。特别是在处理大批量数据时,建议在关键节点后添加状态持久化:
python复制from langgraph.checkpoint import FileSystemCheckpointer
app = graph.compile(
checkpointer=FileSystemCheckpointer("./checkpoints")
)
这样即使进程中断,也可以从最近的检查点恢复执行,而不是从头开始。
