为什么需要工作流编排?
想象一下,你要做一个智能客服系统。最简单的做法是:用户提问 → 调用大模型 → 返回答案。但在真实业务中,事情远没那么简单:
- 需要先判断用户意图(是退货、查询订单还是闲聊?)
- 可能要从数据库查询用户信息
- 如果需要退货,要调用订单系统的API
- 遇到复杂问题可能需要多次调用大模型
- 某些步骤需要人工审核
- 出错需要重试机制
这就是工作流编排的价值所在——把多个步骤组织成一个可管理、可调试、可扩展的流程。
从有向无环图说起
传统的工作流通常采用DAG(有向无环图)结构。你可以把它想象成一条单行道,节点A到节点B到节点C,方向固定,不能走回头路,更不能形成环路。
传统DAG工作流示意
用户输入 → 意图识别 → 调用API → 生成回复 → 输出结果这种结构简单清晰,但面对复杂的AI应用场景时,局限性就暴露出来了。
为什么要引入循环和状态?
真实的人机对话天然就是循环的,比如:
用户:我想买一件羽绒服
AI:您需要什么颜色的?
用户:黑色
AI:什么尺码?
用户:XL
AI:为您推荐以下商品...这里AI需要记住之前对话的所有信息(颜色、尺码等),并在多轮对话中不断更新状态。传统的DAG无法优雅地处理这种场景,这正是LangGraph要解决的问题。
LangGraph是什么
官方定义解读
LangGraph是LangChain生态中专门用于构建有状态、多角色、循环工作流的图基(Graph-based)编排框架。它的核心理念是:将复杂的AI应用建模为由节点和边组成的图结构,其中节点代表处理步骤,边代表控制流与数据流。
用一句话概括:LangGraph = 图结构 + 状态管理 + 循环能力 + 大模型集成
通俗类比:智能工厂流水线
把LangGraph想象成一座高度智能化的工厂流水线:
- 节点:每个工作站(质检、加工、包装等)
- 边:工作站之间的传送带
- 状态:记录每个产品当前加工进度、参数、质量数据的信息卡
- 条件边:根据质检结果决定产品是进入下一环节还是返工
- 循环:不合格产品可以送回维修工位
传统流水线只能单向流动,而LangGraph可以让产品在工位间灵活流转,甚至形成反馈闭环。
LangGraph的历史渊源
LangGraph由LangChain团队开发,于2023年底首次发布。它的诞生背景是:
- LangChain的局限性:原生的
Chain和LCEL(LangChain Expression Language)虽然强大,但主要面向线性流程 - Agent需求的爆发:ReAct Agent、Plan-and-Execute Agent等复杂架构需要循环和状态控制
- 借鉴经典思想:从Google的Pregel图计算模型和Actor模型中汲取灵感
技术栈定位
LangGraph在整个技术栈中的位置可以这样理解:
应用层:你的业务代码
↓
编排层:LangGraph(本课程核心)
↓
组件层:LangChain(提示词模板、工具调用、输出解析器等)
↓
模型层:OpenAI、Claude、通义千问、文心一言等大模型
↓
基础设施层:向量数据库、Redis、PostgreSQL等和LangChain/普通工作流区别
这是很多人最困惑的地方,我们来彻底理清楚。
LangGraph vs LangChain:不是替代,是增强
LangChain的核心定位:提供构建AI应用的基础组件(组件化思维)
- 提示词模板(PromptTemplate)
- 模型抽象(ChatModel)
- 工具调用(Tools)
- 输出解析器(OutputParser)
- 简单的链式组合(LCEL)
LangGraph的核心定位:提供复杂的流程控制能力(图编排思维)
- 状态管理和传递
- 循环和分支控制
- 人机交互(Human-in-the-Loop)
- 持久化和时间旅行
协同使用的最佳实践:
# LangChain提供组件
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# LangGraph负责编排
from langgraph.graph import StateGraph, Message
# 典型组合:LangChain组件作为节点,LangGraph负责流程
model = ChatOpenAI(model="gpt-4")
@tool
def search(query: str) -> str:
"""搜索工具"""
return f"搜索结果: {query}"
# 在LangGraph节点中调用LangChain组件
def call_model(state):
response = model.invoke(state["messages"])
return {"messages": state["messages"] + [response]}LangGraph vs 普通工作流(如Prefect、Airflow)
传统工作流引擎主要用于数据处理ETL、任务调度,特点是:
- 步骤通常是确定性的(没有LLM的不确定性)
- 循环需求少(更多是批处理)
- 状态管理简单(主要是任务依赖)
LangGraph专门为AI Agent场景设计:
- 支持LLM的动态决策(下一步走哪个分支可能由模型决定)
- 原生支持循环(多轮对话、自我反思)
- 状态持久化(保存对话历史、中间结果)
- Human-in-the-Loop(人工介入决策)
核心对比一览表
| 维度 | LangGraph | LangChain原生Chain | 传统工作流引擎 |
|---|---|---|---|
| 主要用途 | 复杂AI Workflow/Agent | 简单链式调用 | 数据处理/任务调度 |
| 流程结构 | 图(支持循环) | 链/有向无环图 | 有向无环图 |
| 状态管理 | 强大的状态持久化 | 仅链式传递 | 主要是任务状态 |
| LLM集成 | 一等公民 | 一等公民 | 不支持或弱支持 |
| 人工介入 | 原生支持 | 需额外实现 | 部分支持 |
| 调试工具 | 时间旅行/可视化 | 基本日志 | DAG可视化 |
| 学习曲线 | 中等 | 低 | 中高 |
为什么要同时学LangChain和LangGraph?
这是一个常见的疑问。我的建议是:
- LangChain是基础:提示词模板、模型调用、工具定义这些基本能力是通用需求
- LangGraph是进阶:当你的场景需要循环、多轮对话、复杂状态管理时再用
- 两者是互补关系:80%的LangGraph代码其实是调用LangChain的组件
学习路径建议:先掌握LangChain核心概念 → 再用LangGraph做流程编排 → 最后深入LangGraph高级特性。
核心架构拆解
让我们从架构层面理解LangGraph的四大核心模块。
模块一:状态管理(State Management)
State是什么?
State是贯穿整个工作流的全局数据容器,可以理解为一个JavaScript对象或Python字典,在每个节点之间传递和更新。
from typing import TypedDict, List, Annotated
from operator import add
# 定义状态结构
class AgentState(TypedDict):
messages: Annotated[List[str], add] # 使用add reducer自动追加
user_query: str
intermediate_results: List[dict]
iteration_count: int状态更新机制(Reducers):
- 默认覆盖:新值直接替换旧值
- 自定义Reducer:如
add可以累加列表,max可以保留最大值 - Annotated类型:为字段指定更新策略
状态的隔离与共享:
- 单工作流实例中,State是全局共享的
- 多实例之间状态完全隔离
- 持久化时可选保存完整历史
模块二:节点系统(Node System)
节点的本质:节点就是普通的Python函数,接收State,返回更新后的State(或部分更新)。
def node_function(state: AgentState) -> dict:
# 读取state
user_input = state["user_query"]
# 执行具体逻辑(调用LLM、API、数据库等)
result = do_something(user_input)
# 返回需要更新的字段
return {"intermediate_results": [result], "iteration_count": state["iteration_count"] + 1}节点的核心特征:
- 无副作用设计:节点的输入只有State,输出也只通过State传递
- 可组合性:节点可以任意编排组合
- 可测试性:纯函数设计让单元测试变得简单
- 异步支持:节点可以是async函数
节点类型(按功能划分):
- 处理节点:核心业务逻辑(调用LLM、处理数据)
- 决策节点:根据条件决定路由(通常配合条件边)
- 工具节点:调用外部API、数据库操作
- 人工节点:需要人工介入的节点(审批、确认)
模块三:边与路由(Edges & Routing)
边的类型:
- 普通边(Normal Edge):固定路径,节点A执行完必然到节点B
graph.add_edge("node_a", "node_b")- 条件边(Conditional Edge):根据状态决定下一个节点
graph.add_conditional_edges(
"decision_node",
lambda state: "continue" if state["quality"] > 0.8 else "rework",
{
"continue": "next_step",
"rework": "start_over"
}
)- 入口边(Entry Point):指定工作流的起始节点
graph.set_entry_point("start_node")- 结束边:终止工作流(到达END节点)
路由策略设计模式:
- 简单if-else路由
- 多分支switch路由
- 动态路由(基于LLM决策)
- 并行路由(多个节点同时执行,需配合
SendAPI)
模块四:持久化与检查点(Persistence & Checkpoint)
这是LangGraph的企业级特性,让工作流可以"暂停-恢复"。
检查点(Checkpoint):
- 在每个节点执行前后自动保存状态快照
- 支持保存到内存、文件、数据库、Redis
- 保存每次状态变更的历史记录
时间旅行(Time Travel):
# 获取历史状态
history = graph.get_state_history(config)
# 回滚到任意历史版本
graph.update_state(config, state, as_node="某个节点")
# 从历史分支继续执行
graph.invoke(None, config=历史config)生产级持久化方案:
- 使用Redis:适合高并发场景
- 使用PostgreSQL:适合需要强一致性的事务场景
- 自定义存储后端:实现
BaseCheckpointSaver接口
适用业务场景
LangGraph已经在多个领域得到验证,以下是典型的应用场景。
场景一:客服智能体
业务痛点:
- 需要多轮对话收集信息
- 需要查询订单、物流等外部系统
- 需要人工审核退款等敏感操作
LangGraph解决方案:
开始 → 意图识别 →
分支1(退货):收集信息 → 查询订单 → 人工审核 → 调用退货API → 结束
分支2(查询):查询物流 → 返回结果 → 结束
分支3(投诉):转人工客服 → 记录投诉 → 结束场景二:代码助手
业务痛点:
- 需要先生成代码,再执行测试
- 测试失败需要重新生成
- 可能需要人工审查关键代码
LangGraph解决方案:
用户需求 → 生成代码 → 执行单元测试 →
如果通过:代码审查 → 输出结果
如果失败:分析错误 → 重新生成(循环最多3次)场景三:RAG问答系统
传统RAG的局限:一次检索就生成答案,无法应对复杂问题
LangGraph增强版RAG:
用户问题 → 问题重写 → 多路检索(向量+关键词+网络)→
结果融合 → 相关性判断 →
如果相关:生成答案 → 检查结果 →
如果不相关:追问用户或重新检索场景四:多角色协作系统
典型架构:
用户输入 → 调度器Agent →
分支:
- 编程任务 → 程序员Agent → 代码审查Agent →
- 写作任务 → 编辑Agent → 校对Agent →
- 数据分析 → 数据科学家Agent → 可视化Agent →
结果汇总 → 输出场景五:数据标注与验证
业务流程:
待标注数据 → AI预标注 → 抽样检测 →
如果质量达标:批量应用 → 结束
如果质量不达标:人工复审 + 模型微调 → 重新标注竞品框架对比
了解LangGraph在生态中的位置,有助于做出技术选型决策。
AutoGen(微软)
定位:多Agent对话框架
优势:
- 多Agent间自然语言对话
- 支持Agent自动组队
- 代码执行沙箱
劣势:
- 流程控制弱(对话即逻辑)
- 状态管理不明确
- 调试困难
vs LangGraph:AutoGen更简单,适合快速原型;LangGraph更强大,适合复杂工程。
LangGraph vs CrewAI
CrewAI定位:角色扮演Agent框架
优势:
- 概念简单(Agent、Task、Crew)
- 代码量少
- 适合任务编排
劣势:
- 灵活性不足
- 循环支持弱
- 状态管理简单
vs LangGraph:CrewAI适合明确分工的场景;LangGraph适合需要精细控制流的场景。
LangGraph vs Semantic Kernel(微软)
定位:传统工作流+AI集成
优势:
- 企业级集成好
- 支持C#/Python
- 规划器(Planner)功能强
劣势:
- 学习曲线陡
- 社区小
- 中文资料少
vs LangGraph:Semantic Kernel适合.NET技术栈企业;LangGraph在Python生态更有优势。
为什么选择LangGraph?
- 背靠LangChain生态:最大的LLM应用开源社区
- 原生Python:Python是AI开发的第一语言
- 灵活性与可控性平衡:既有高级抽象,又允许底层控制
- 企业级特性:状态持久化、时间旅行是竞品普遍缺失的
- 持续迭代:LangChain团队全职维护,更新活跃
为什么要学LangGraph
从技术趋势看
2024-2025年,AI应用开发正在经历从"单一调用"到"复杂编排"的演进:
- 单次LLM调用 → Chain of Thought → ReAct Agent → Multi-Agent System
- 简单问答 → RAG → GraphRAG → Self-RAG
- 一次性生成 → 循环优化 → 决策树搜索
LangGraph正是这一演进过程中的关键基础设施。
从就业市场看
头部公司招聘需求已经出现:
- 岗位要求:熟悉LangChain/LangGraph,有Agent开发经验
- 薪资水平:相比普通AI工程师高出30-50%
- 稀缺性:熟练掌握LangGraph的人才目前非常稀缺
从能力提升看
学习LangGraph不只是学一个框架,更是培养:
- 系统设计思维:如何拆解复杂AI任务
- 状态管理能力:如何处理有状态工作流
- 工程化意识:如何编写可维护、可测试的AI代码
这些能力在任何AI工程岗位上都是通用的。