LangGraph 基础入门:从 StateGraph 到状态管理,一篇搞懂核心运行逻辑
最近在学习 LangGraph,发现它和 LangChain 的关系很容易混在一起:LangChain 更像是上层 Agent 开发框架,而 LangGraph 更像是底层的“流程编排引擎”。如果想真正理解 Agent 是怎么一步一步运行、怎么分支、怎么保存状态、怎么循环调用工具的,LangGraph 是绕不开的。
这篇文章按由浅到深的顺序,整理 LangGraph 的基础知识:整体定位、图的基本组成、运行机制、Graph API、State 定义、Reducer 合并规则,以及 MessagesState 等常见状态类型。
一、LangGraph 是什么?
LangGraph 是一个用于构建有状态、多步骤、可控制流程的图编排框架。它可以把一个复杂任务拆成多个节点,每个节点负责一部分逻辑,再通过边把这些节点连接起来。
可以先这样理解:
LangGraph = State + Node + Edge
也就是:
- State:图运行时共享的状态数据
- Node:真正执行任务的节点,通常是一个 Python 函数
- Edge:节点之间的连接关系,决定下一步去哪
一个最简单的图大概长这样:
START -> node_1 -> node_2 -> END
其中 START 和 END 是 LangGraph 内置的起点和终点。
二、LangChain 和 LangGraph 的区别
LangChain 更偏上层,适合快速构建 Agent 应用;LangGraph 更偏底层,适合精细控制 Agent 或复杂工作流。
| 定位 | Agent 高层开发框架 | 底层流程编排框架 / Agent Runtime |
| 核心入口 | create_agent | StateGraph、@entrypoint |
| 适合场景 | 结构比较直接的 Agent | 多节点、多分支、循环、人工介入、持久化状态 |
| 流程控制 | 框架自动管理 Agent 循环 | 手动控制节点、边、条件分支 |
| 学习成本 | 相对低 | 相对高 |
简单说:如果只是快速做一个普通 Agent,可以先用 LangChain;如果你想自己控制“什么时候调用模型、什么时候调用工具、什么时候结束、状态怎么合并”,就需要 LangGraph。
三、LangGraph 的三个核心元素
1. State:状态
State 是整张图运行时共享的数据结构。
比如:
from typing import TypedDict, Annotated
from operator import add
class OverAllState(TypedDict):
logs: Annotated[list[str], add]
cur_id: str
这里定义了两个状态字段:
- logs:保存运行日志
- cur_id:保存当前执行到哪里
注意这里的 Annotated[list[str], add] 很重要,它表示多个节点返回 logs 时,不是覆盖,而是用 add 合并。
如果多个节点分别返回:
{
\”logs\”: [\”node_1 执行完成\”]}
{
\”logs\”: [\”node_2 执行完成\”]}
最终会合并成:
{
\”logs\”: [\”node_1 执行完成\”, \”node_2 执行完成\”]}
2. Node:节点
节点通常就是一个函数。它接收当前状态,返回对状态的部分更新。
def node_1(state: OverAllState) –> OverAllState:
pre_id = state[\”cur_id\”]
return {
\”logs\”: [\”node_1 执行完成\”],
\”cur_id\”: pre_id + \”, node_1\”
}
这里要注意:节点返回的不是完整状态,而是“我想更新哪些字段”。
比如上面返回:
{
\”logs\”: [\”node_1 执行完成\”],
\”c




