第 1 章:LangGraph 的背景与设计哲学
1.1 大模型时代的编排需求:从提示工程到智能体编排
提示工程的局限性
在大模型应用的早期阶段,开发者主要依赖**提示工程(Prompt Engineering)**来构建应用:
- 单次交互:一次请求-响应的简单模式
- 上下文限制:难以管理长对话和复杂上下文
- 缺乏控制流:无法实现复杂的条件判断和循环逻辑
- 工具调用困难:集成外部工具和 API 需要大量手动编码
智能体编排的崛起
随着大模型能力的提升,应用需求从简单的问答转向复杂的智能体系统:
传统提示工程:
用户输入 → LLM → 单次输出
智能体编排:
用户输入 → [规划] → [工具调用] → [结果验证] → [迭代优化] → 最终输出
↑___________________|
智能体编排的核心需求:
- 多步骤推理:将复杂任务分解为多个可管理的步骤
- 动态决策:根据中间结果动态调整执行路径
- 工具集成:无缝集成搜索、计算、数据库等外部工具
- 状态管理:在多轮交互中维护和更新上下文
- 可观察性:追踪执行过程,便于调试和优化
从 CoT 到 ReAct 到 Multi-Agent
演进路径:
- Chain-of-Thought (CoT):让模型展示推理步骤
- ReAct:推理(Reasoning)+ 行动(Acting)循环
- Multi-Agent:多个专业化智能体协作完成复杂任务
LangGraph 正是为了支持这种演进而诞生的编排框架。
1.2 LangChain 的局限与 LangGraph 的诞生
LangChain 的贡献与不足
LangChain 的创新:
- 提供了丰富的组件库(LLMs、Prompts、Tools)
- 引入了链(Chain)的概念进行流程编排
- 建立了大模型应用的开发范式
LangChain 的局限:
-
线性思维限制
python# LangChain LCEL 的链式结构 chain = prompt | llm | output_parser # 难以实现循环和条件分支 -
状态管理困难
- 链式调用难以在步骤间共享和更新复杂状态
- 缺乏对长期对话历史的有效管理
-
缺乏循环支持
- 无法原生支持 Agent 的迭代决策过程
- ReAct 模式需要手动实现循环逻辑
-
调试和可观察性不足
- 复杂链的执行过程难以追踪
- 错误定位困难
LangGraph 的诞生
LangGraph 由 LangChain 团队于 2023 年推出,专门解决上述问题:
设计目标:
- ✅ 支持循环 和分支的复杂控制流
- ✅ 内置状态管理机制
- ✅ 提供可视化 和可观察性
- ✅ 支持人机协作(Human-in-the-loop)
- ✅ 实现检查点(Checkpointing)和可恢复执行
LangGraph 发展时间线
2022 年末 - 2023 年初:LangChain 早期阶段
- 2022 Q4:LangChain 正式开源,提供基础组件库
- 2023 Q1:社区快速增长,Chain 模式成为主流
2023 年中:LCEL 时代
- 2023 Q2:ReAct Agent 模式流行,但实现复杂
- 2023 Q3:LangChain Expression Language (LCEL) 发布
- 统一的链式语法
chain = prompt | llm | parser - 但仍无法原生支持循环和复杂分支
- 统一的链式语法
2023 年末至今:LangGraph 时代
- 2023 Q4:LangGraph 正式对外发布(v0.1.x)
- 引入 StateGraph 核心概念
- 支持循环和条件路由
- 内置 Checkpointing 机制
- 2024 Q1:LangGraph 快速迭代
- 添加 Human-in-the-loop 支持
- 推出 LangGraph Studio 可视化工具
- 发布企业级持久化方案
- 2024 Q2-Q3:生态成熟
- 与 LangSmith 深度集成
- 发布 LangGraph Cloud 托管服务
- 社区涌现大量生产级应用案例
- 2024 Q4:持续演进
- 增强多 Agent 协作能力
- 优化性能和可扩展性
- 推出更多预构建模板
版本演进里程碑:
v0.1.0 (2023-10) 核心 StateGraph API
v0.2.0 (2023-12) Checkpointing 持久化
v0.3.0 (2024-02) Human-in-the-loop
v0.4.0 (2024-04) 性能优化 & 异步支持
v0.5.0 (2024-06) LangGraph Studio
v0.6.0 (2024-08) 企业级特性
v1.0.0 (预计) 生产就绪稳定版
LangChain vs LangGraph 架构对比
LangChain (LCEL) 架构:
┌─────────────────────────────────────────┐
│ LangChain LCEL │
├─────────────────────────────────────────┤
│ │
│ Prompt → LLM → Parser → Output │
│ │ │ │ │
│ └───────┴──────┘ │
│ 线性流水线 │
│ │
│ 特点: │
│ ✓ 简单直观 │
│ ✓ 适合单向流程 │
│ ✗ 不支持循环 │
│ ✗ 状态管理困难 │
│ ✗ 难以实现复杂决策 │
└─────────────────────────────────────────┘
LangGraph 架构:
┌─────────────────────────────────────────┐
│ LangGraph │
├─────────────────────────────────────────┤
│ │
│ ┌──────────┐ │
│ ┌───→│ Node A │───┐ │
│ │ └──────────┘ │ │
│ │ ↓ │
│ Start ┌──────────┐ │
│ │ │ Node B │ │
│ │ ┌─────────┴──────────┴───┐ │
│ │ │ │ │
│ └───→│ Conditional Router │ │
│ └─────────┬──────────┬────┘ │
│ │ │ │
│ ┌────▼───┐ ┌──▼────┐ │
│ │ Node C │ │ Node D│ │
│ └────┬───┘ └──┬────┘ │
│ │ │ │
│ └────┬────┘ │
│ ↓ │
│ [END] │
│ │
│ 特点: │
│ ✓ 支持循环和迭代 │
│ ✓ 条件分支和动态路由 │
│ ✓ 显式状态管理 │
│ ✓ 可视化和可观察性 │
│ ✓ 适合复杂 Agent 系统 │
└─────────────────────────────────────────┘
关键差异对比:
| 维度 | LangChain LCEL | LangGraph |
|---|---|---|
| 架构模式 | 线性管道 | 有向图 |
| 执行流 | 单向顺序执行 | 支持循环、分支、回溯 |
| 状态管理 | 隐式传递(通过 RunnablePassthrough) | 显式 StateGraph |
| 条件逻辑 | RunnableBranch(有限) | add_conditional_edges(灵活) |
| 可视化 | 线性链条 | 复杂图结构(Mermaid) |
| 持久化 | 需要手动实现 | 内置 Checkpointing |
| 人工干预 | 不支持 | interrupt_before/after |
| 适用场景 | RAG、简单问答 | ReAct Agent、多 Agent 协作 |
| 学习曲线 | ⭐⭐ 简单 | ⭐⭐⭐ 中等 |
| 表达能力 | ⭐⭐ 有限 | ⭐⭐⭐⭐⭐ 强大 |
1.3 有向多节点图(StateGraph)思想
图论基础
LangGraph 将应用建模为有向图(Directed Graph):
节点(Node):执行具体计算的单元
↓
边(Edge):定义节点间的数据流向
↓
状态(State):在节点间传递的共享数据
StateGraph 的核心思想
1. 节点即函数
python
def research_node(state: State) -> State:
"""研究节点:搜索相关信息"""
results = search(state["query"])
return {"research_results": results}
2. 边即控制流
python
# 无条件边
graph.add_edge("research", "analyze")
# 条件边
graph.add_conditional_edges(
"decision",
lambda s: "continue" if s["quality"] > 0.8 else "retry",
{"continue": "output", "retry": "research"}
)
3. 状态即上下文
python
class State(TypedDict):
query: str
research_results: list
analysis: dict
final_output: str
图 vs 链的对比
| 特性 | 链(Chain) | 图(Graph) |
|---|---|---|
| 结构 | 线性序列 | 有向图 |
| 循环 | ❌ 不支持 | ✅ 原生支持 |
| 条件分支 | ⚠️ 有限 | ✅ 灵活支持 |
| 状态管理 | ⚠️ 隐式传递 | ✅ 显式管理 |
| 可视化 | ⚠️ 简单链式 | ✅ 复杂图结构 |
| 适用场景 | 简单流程 | 复杂 Agent 系统 |
1.4 为什么是"图"而不是"链"?
现实世界的复杂性
真实的智能体决策过程:
用户请求
↓
[理解意图] → [规划任务]
↓ ↓
[执行步骤1] → [验证结果] → 成功?
↑ ↓ 否
└──────────[调整策略]
通过?→ 是 → [整合结果] → 输出
↓ 否
[人工审核] → 继续/修改
这种循环、分支、回溯的模式无法用线性链表达。
图的表达能力
1. 循环(Loops)
python
# Agent 可以迭代优化
graph.add_edge("evaluate", "improve")
graph.add_edge("improve", "evaluate") # 形成循环
2. 并行分支(Parallel Branches)
python
# 多个专家同时工作
graph.add_edge("task", "expert_1")
graph.add_edge("task", "expert_2")
graph.add_edge("task", "expert_3")
3. 条件路由(Conditional Routing)
python
# 根据结果动态决定路径
def route(state):
if state["confidence"] > 0.9:
return "output"
elif state["attempts"] < 3:
return "retry"
else:
return "human_review"
4. 子图嵌套(Subgraphs)
python
# 复杂任务可以分解为子图
main_graph.add_node("research", research_subgraph)
图的数学优势
- 可达性分析:确保所有路径都能到达终点
- 环路检测:避免无限循环
- 拓扑排序:优化执行顺序
- 最短路径:找到最优执行路径
1.5 面向确定性、可调试性与可观察性的设计哲学
确定性(Determinism)
问题: LLM 的非确定性给调试和测试带来困难。
LangGraph 的解决方案:
-
显式状态管理
python# 所有状态变化都是明确的 def node(state: State) -> dict: return {"field": "new_value"} # 清晰的状态更新 -
确定性的图结构
python# 图的拓扑结构是固定的 graph.add_edge("A", "B") # 明确的执行顺序 -
可重现的执行
python# 通过种子和检查点实现可重现 llm = ChatOpenAI(temperature=0, seed=42)
可调试性(Debuggability)
1. 可视化图结构
python
# 生成 Mermaid 图
print(app.get_graph().draw_mermaid())
# 或生成图片
display(Image(app.get_graph().draw_mermaid_png()))
2. 流式输出中间状态
python
for step in app.stream(input_data, stream_mode="debug"):
print(f"Node: {step['node']}")
print(f"State: {step['state']}")
3. 检查点回放
python
# 保存执行历史
checkpointer = SqliteSaver(...)
app = graph.compile(checkpointer=checkpointer)
# 查看历史状态
history = app.get_state_history(config)
可观察性(Observability)
集成 LangSmith 实现全链路追踪:
python
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "my-langgraph-project"
# 自动追踪:
# - 每个节点的输入输出
# - LLM 调用的 token 使用
# - 工具调用的参数和结果
# - 执行时间和性能指标
可观察性的三大支柱:
- 日志(Logging):记录关键事件和状态变化
- 指标(Metrics):追踪性能、成本、成功率
- 追踪(Tracing):完整的执行路径和时间线
设计哲学总结
LangGraph 的核心设计原则:
- 显式优于隐式:所有状态和控制流都是明确定义的
- 可测试性优先:图结构便于单元测试和集成测试
- 渐进式复杂性:从简单图到复杂多 Agent 系统
- 生产就绪:内置持久化、错误处理、监控能力
本章小结
LangGraph 的出现标志着大模型应用从提示工程时代 进入智能体编排时代:
- 背景:大模型应用需要更复杂的控制流和状态管理
- 动机:LangChain 的线性链无法满足循环和分支需求
- 核心:基于有向图的 StateGraph 设计思想
- 优势:图比链具有更强的表达能力
- 哲学:确定性、可调试、可观察的工程实践
在下一章,我们将深入探讨 LangGraph 的核心原理和技术实现。