深度解析LangGraph:从入门到动态工作流,彻底搞懂它与LangChain的爱恨情仇(含节点/边/状态管理/条件路由核心源码)

大家好,我是你们的技术伙伴。👋

在2026年的AI应用开发中,我们已经不再满足于简单的"输入字符串,输出字符串"。我们需要构建的是能够自主思考、调用工具、甚至在节点间循环往复的智能体(Agent)。

在这一领域,LangChain 无疑是大家最熟悉的名字,但随着业务逻辑的复杂化,单纯的"链式"结构(Chain)开始显露出它的局限性。此时,LangGraph应运而生,它将开发者的视角从"线性流水线"提升到了"图状拓扑结构"。

今天,我将带你深入这场 "从链到图"的架构进化。我们将详细探讨LangChain与LangGraph的关系,并基于核心代码,解析如何利用LangGraph构建具备复杂状态管理的智能体。

本文核心硬核点:

  1. 辨析:LangChain与LangGraph的爱恨情仇(谁是谁的基础?)。
  2. 核心:深度解析LangGraph的五大基石(Graph与Node、Condition Edge、聚合操作、消息机制、Schema应用)。
  3. 进阶 :揭秘Send函数如何实现动态节点调度与Fan-out模式。
  4. 实战:基于StateGraph与Pydantic的工业级代码实现。

🤝 第一部分:厘清关系------LangChain与LangGraph的爱恨情仇

在开始编码之前,我们必须先搞清楚一个经常被混淆的概念:到底什么时候用LangChain,什么时候用LangGraph?

1. 什么是智能体(Agent)?

根据我们的研究,智能体的本质公式可以概括为:

智能体 = 大模型 (LLM) + 工作流 (Workflow) + 工具 (Tool)

  • 大模型 (LLM) :负责"思考"和逻辑判断。
  • 工具 (Tool) :负责执行具体的动作(如调用API、操作数据库)。
  • 工作流 (Workflow) :负责编排这一切,决定下一步该做什么。

2. LangChain vs LangGraph:链与图的区别

  • LangChain (链)

    • 特点:线性、单向。像一条流水线,A -> B -> C,顺序固定。
    • 适用场景:简单的数据处理、RAG(检索增强生成)、固定的多步骤任务。
    • 局限:一旦遇到"如果...就..."的复杂判断,或者需要循环回去重新执行某一步,LangChain就会变得非常臃肿和难以维护。
  • LangGraph (图)

    • 特点非线性、动态、有向图。节点(Node)之间可以任意跳转,可以循环,可以聚合。
    • 核心优势状态机(State Machine) 。它允许我们定义一个共享的"状态(State)",所有节点都可以读取和修改这个状态。
    • 关系LangGraph是LangChain的"超集"和"底层引擎" 。你可以把LangGraph看作是构建复杂交通网络的"地基",而LangChain则是建立在这地基上的"豪华跑车"。LangGraph处理的是最底层的调度逻辑,而LangChain提供了更高层的语义封装。

一句话总结:如果你只需要一条直线走到底,用LangChain;如果你需要构建一个复杂的、会"回头"、会"分叉"的智能大脑,请务必使用LangGraph。


🧩 第二部分:核心解剖------LangGraph的五大核心机制

LangGraph之所以强大,是因为它引入了 "图" 的概念。在图论中,最核心的元素是节点(Node)边(Edge)

1. Graph与Node:构建基础拓扑

在LangGraph中,我们通过StateGraph来定义一个图。图由多个节点组成,每个节点本质上是一个函数(Function)。

代码示例:定义一个简单的加法与乘法节点

python 复制代码
from langgraph.graph import StateGraph, START, END

def add_node(state):
    # 节点逻辑:将x和y相加
    return {"x": state["x"] + state["y"], "y": state["y"]}

def mul_node(state):
    # 节点逻辑:将x和y相乘
    return {"x": state["x"] * state["y"], "y": state["y"]}

# 构建图
builder = StateGraph(dict)
builder.add_node("add_node", add_node)
builder.add_node("mul_node", mul_node)

# 定义边:START -> add_node -> mul_node -> END
builder.add_edge(START, "add_node")
builder.add_edge("add_node", "mul_node")
builder.add_edge("mul_node", END)

graph = builder.compile()

解读 :这里的StateGraph就像一张地图,add_nodemul_node是地图上的城市,add_edge则是连接城市的道路。

2. Condition Edge:智能的"交通警察"

这是LangGraph的灵魂。在现实世界中,流程往往不是一条直线。比如:如果数字是偶数,就除以2;如果是奇数,就减1。这种条件路由 就是由add_conditional_edges实现的。

代码示例:奇偶数判断分流

python 复制代码
def condition_edge_bool(state):
    # 判断逻辑:根据x的奇偶性,返回不同的路径标识
    if state["x"] % 2 == 0:
        return True  # 走偶数路线
    else:
        return False # 走奇数路线

# 将判断函数挂载到节点上
# 当从"node"节点出来时,会调用condition_edge_bool函数
# 根据返回值True/False,决定去"even_node"还是"odd_node"
builder.add_conditional_edges("node", condition_edge_bool, 
                             {True: "even_node", False: "odd_node"})

解读:这就像十字路口的红绿灯,大模型(或函数)根据当前的"状态"(路况),决定下一秒车流(数据)的走向。

3. 聚合操作(Reducers):解决"状态冲突"的利器

在图结构中,数据可能会从四面八方汇聚到一个节点。比如:节点A生成了列表["hello"],节点B生成了列表["world"],当它们同时到达节点C时,状态里的列表到底是["hello"]还是["world"]聚合操作就是用来解决这个问题的。

  • 默认策略:覆盖(Overwrite)。
  • 常用策略:累加(Add)。

代码示例:自定义聚合函数

python 复制代码
from typing import Annotated
from operator import add

# 定义状态类型
class State2(TypedDict):
    foo: int
    # bar字段:使用Annotated指定聚合方式为add(相加/追加)
    bar: Annotated[list[str], add] 

def node(state):
    # 假设当前state["bar"]是["my"]
    # 节点返回["name"]
    # 聚合后:["my", "name"]
    return {"bar": ["name"]}

解读:聚合操作符(Reducer)告诉LangGraph,当新旧数据冲突时,不要简单地"替换",而是要"合并"或"计算"。

4. 消息机制(Messages):智能体的"记忆"

智能体必须具备记忆能力。LangGraph通过add_messages来管理对话历史。它利用了Annotatedoperator.add的特性,将新产生的消息不断追加到历史消息列表中。

代码示例:增加消息状态

python 复制代码
from langchain_core.messages import AIMessage
from langgraph.graph.message import add_messages

class State2(TypedDict):
    messages: Annotated[list[AnyMessage], add_messages]

def node(state):
    # 向状态中添加一条AI回复消息
    return {"messages": AIMessage(content="你好呀")}

5. 多Schema应用:严谨的数据契约

在复杂的项目中,我们不能让节点随意修改状态。LangGraph支持使用TypedDictPydantic来定义输入(InputSchema)和输出(OutputSchema),确保数据流的严谨性。

代码示例:定义输入输出契约

python 复制代码
class InputState(TypedDict):
    user_input: str  # 规定输入必须包含user_input

class OutputState(TypedDict):
    graph_output: str # 规定输出必须是graph_output

# 构建图时指定契约
builder = StateGraph(OverallState, input_schema=InputState, output_schema=OutputState)

🚀 第三部分:进阶实战------动态调度与Fan-out

LangGraph最强大的功能之一是动态节点生成。传统的流程是预设好的,但LangGraph可以根据输入数据的多少,动态生成任务。

核心武器:Send 函数

Send函数允许我们在一个节点中,根据列表的长度,动态地向图中发送多个任务。这在处理"对列表中每个元素进行操作"时非常有用。

代码示例:批量生成笑话(Fan-out模式)

python 复制代码
from langgraph.types import Send

class OverallState(TypedDict):
    subjects: list[str]  # 主题列表
    jokes: Annotated[list[str], add] # 存放笑话的列表

def continue_to_jokes(state: OverallState):
    # 核心逻辑:遍历所有主题,为每个主题生成一个"Send"指令
    # 指令内容:去"generate_joke"节点,并带上参数{s}
    return [Send("generate_joke", {"subject": s}) for s in state['subjects']]

# 定义图
graph = StateGraph(OverallState)
# 定义具体的处理节点(Lambda函数)
graph.add_node("generate_joke", lambda state: {"jokes": [f"joke about {state['subject']}"]})

# 设置起始边:从START出发,经过continue_to_jokes判断,动态发送任务
graph.add_conditional_edges(START, continue_to_jokes)
graph.add_edge("generate_joke", END)

app = graph.compile()
# 调用:输入两个主题
print(app.invoke({"subjects": ["life", "travel"]}))
# 输出:{'subjects': ['life', 'travel'], 'jokes': ['joke about life', 'joke about travel']}

解读 :这就是Fan-out(扇出) 模式。输入一个列表,动态生成多个并行或串行的任务,最后将结果聚合回流。这是构建高并发智能体的必备技能。


🏁 结语:掌握"图",即掌握AI的未来

回顾全文,我们从LangChain与LangGraph的关系 辨析出发,深入探讨了智能体的本质 。我们发现,LangGraph通过引入图(Graph) 的结构,完美地解决了复杂逻辑编排的问题。

在2026年,掌握LangGraph不再是一个加分项,而是一个必选项 。因为它代表了AI应用开发的终极形态:动态、灵活、具备记忆且能处理复杂状态的自治系统

希望这篇博客能帮你建立起对LangGraph的完整认知。不要只做技术的搬运工,要成为架构的设计者。

如果你觉得有用,希望点赞、收藏、关注

相关推荐
weiwin1232 小时前
MAF 入门(5):多 Agent 编排全解
人工智能·agent
DigitalOcean3 小时前
砍掉 60% AI 推理成本:深度解构 DigitalOcean 推理路由器的 MoE 门控与智能分流机制
llm·aigc·agent
Vergelight3 小时前
实战拆解|三类RAG架构差异:朴素、进阶、多轮RAG落地选型指南
架构·大模型·aigc·agent·ai产品经理·转行·ai后台设计
o_insist4 小时前
LangGraph 入门:用 StateGraph 构建 Agent 的五步流程
人工智能·agent
枫子有风4 小时前
LLM-Agent智能体(大厂面试常问)
面试·职场和发展·llm·agent
昵称好难啊5 小时前
7.OpenClaw源码解析——可靠消息投递
人工智能·llm·agent
爱卜大王5 小时前
第 15 章:修复加固与回归:把前面的能力变成质量门
agent
云烟成雨TD5 小时前
Agent Scope Java 2.x 系列【19】Harness:从零搭建 MySQL 文件系统
java·人工智能·agent
用户329901675057 小时前
Vue3 接 AI 对话框,SSE 流式渲染我踩的几个坑
agent
小撒的私房菜7 小时前
Multi-Agent 里谁来指挥?我用一个调度员,让多个 Agent 开始协作
人工智能·后端·agent