LangGraph 第1章:为什么选择 LangGraph

传统 LLM Chain 的局限性

在使用 LangChain 等框架构建 LLM 应用时,我们通常采用 Chain(链式)模式。这种模式将多个步骤线性排列,每个步骤依次执行:

from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

# 一个简单的链:输入 -> 翻译 -> 总结
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run("Hello world")

这种 Chain 模式存在几个明显的局限性:

局限性说明实际影响
线性执行步骤必须严格按顺序执行,无法跳转或循环无法实现 Agent 的"推理-行动-观察"循环
无状态管理每一步之间没有共享的状态容器需要在步骤间手动传递数据
分支困难根据条件走不同路径需要复杂的条件判断难以实现动态决策流
无法暂停执行一旦开始就必须全部完成无法实现人工审核等需要等待的场景
调试困难无法查看中间状态,出了问题只能从头排查开发和排错效率低

LangGraph 的图计算优势

LangGraph 将工作流建模为有向图(Directed Graph),从根本上解决了上述问题:

  1. 灵活的执行流:节点之间可以任意连接,支持循环、分支、并行等多种模式
  2. 统一的状态管理:所有节点共享同一个 State 对象,通过 Reducer 机制控制状态合并
  3. 条件路由:节点可以根据当前状态动态决定下一步走向
  4. 中断与恢复:支持在执行过程中暂停,等待外部输入后继续
  5. 可观测性:每个节点的输入输出都可通过 Checkpointer 记录,支持时间旅行调试

StateGraph 核心思想

StateGraph 是 LangGraph 的核心类,它的设计思想可以概括为三点:

1. 状态驱动(State-Driven)

图的执行完全由状态驱动。每个节点读取当前状态,执行操作,然后返回状态更新:

from langgraph.graph import StateGraph
from typing import TypedDict

# 定义状态结构
class MyState(TypedDict):
    input: str
    output: str
    steps: list

# 节点函数:接收状态,返回状态更新
def process_node(state: MyState):
    # 读取当前状态
    current_input = state["input"]
    # 执行操作
    result = current_input.upper()
    # 返回状态更新
    return {"output": result, "steps": ["processed"]}

2. 图结构(Graph Structure)

节点(Node)是执行单元,边(Edge)定义流转路径,条件边(Conditional Edge)实现动态路由:

Node A --> Edge --> Node B --> Edge --> Node C
                    |
                    +--> (Conditional) --> Node D

3. 编译执行(Compile & Execute)

图需要先编译(compile)才能执行,编译过程会进行拓扑排序和优化:

# 构建图
graph = StateGraph(MyState)
graph.add_node("process", process_node)
graph.set_entry_point("process")
graph.add_edge("process", "__end__")

# 编译
app = graph.compile()

# 执行
result = app.invoke({"input": "hello", "output": "", "steps": []})

适用场景概览

LangGraph 特别适合以下场景:

  • Agent 系统:需要多步推理、工具调用的自主 Agent
  • 多轮对话:有状态、需要上下文的对话系统
  • 复杂工作流:涉及分支、循环、并行的工作流
  • 人机协作:需要审批、审核等人工介入的场景
  • 多 Agent 系统:多个 Agent 协同完成复杂任务

与其他框架的对比

特性LangChain ChainLangGraph自定义代码
执行模型线性链有向图任意
状态管理隐式传递显式 State自行实现
条件分支困难原生支持灵活但繁琐
循环支持不支持原生支持自行实现
暂停/恢复不支持通过 Interrupt自行实现
可视化LangGraph Studio
学习曲线

LangGraph 的核心价值在于:它在灵活性和易用性之间找到了一个很好的平衡点。对于需要复杂控制流的 LLM 应用,LangGraph 是目前最强大的选择之一。