《LangGraph 状态管理:State、Node 和 Reducer 到底是什么?》

这一篇只解决一个问题:

LangGraph 中的数据是如何在节点之间流转的?

不要先背 API,先理解它的运行模型。


1. 为什么 Agent 需要 State?

普通函数:

css 复制代码
function add(a, b) {
  return a + b;
}

数据通过参数传递:

复制代码
输入
 ↓
函数
 ↓
输出

但是 Agent 工作流:

复制代码
用户输入

↓

分析任务

↓

调用工具

↓

获取结果

↓

总结回答

中间会产生大量数据:

例如:

css 复制代码
{
  question:"查询订单",
  userId:"1001",
  orderInfo:{},
  toolResult:"",
  answer:""
}

这些数据需要在不同步骤之间共享。

所以 LangGraph 引入:

State(状态)


2. State 是什么?

State 可以理解为:

整个 Graph 执行过程中的共享数据对象。

例如:

css 复制代码
{
  query:"",
  answer:""
}

流程开始:

css 复制代码
State

{
 query:"1+2",
 answer:""
}

经过节点:

css 复制代码
Node

↓

更新 State

↓

{
 query:"1+2",
 answer:"3"
}

3. 如何定义 State?

LangGraph 使用:

scss 复制代码
Annotation.Root()

定义状态结构。

例如:

javascript 复制代码
const StateAnnotation = Annotation.Root({

  query: Annotation({
    reducer: (_prev,next)=>next,
    default:()=> ""
  }),

  answer: Annotation({
    reducer: (_prev,next)=>next,
    default:()=> ""
  })

});

表示:

我们的 State 有两个字段:

erlang 复制代码
State

├── query
└── answer

4. Node 是什么?

Node 就是一个执行步骤。

本质:

perl 复制代码
(state)=>update

例如:

javascript 复制代码
const answerNode = (state)=>{

  return {
    answer:`你的问题是:${state.query}`
  }

}

输入:

css 复制代码
{
 query:"hello",
 answer:""
}

返回:

css 复制代码
{
 answer:"你的问题是:hello"
}

注意:

Node 不直接修改 State。

错误:

ini 复制代码
state.answer="xxx"

LangGraph 推荐:

kotlin 复制代码
return {
 answer:"xxx"
}

为什么?

因为 LangGraph 会统一管理:

  • 状态更新
  • 状态合并
  • 历史保存

5. Node 返回的是完整 State 吗?

不是。

这是很多人的第一个疑惑。

比如:

当前 State:

css 复制代码
{
 query:"hello",
 answer:""
}

Node:

kotlin 复制代码
return {
 answer:"你好"
}

不是变成:

css 复制代码
{
 answer:"你好"
}

而是:

LangGraph 合并:

css 复制代码
{
 query:"hello",
 answer:"你好"
}

所以:

Node 返回的是 State 的部分更新。


6. Reducer 是干什么的?

问题:

如果多个节点修改同一个字段怎么办?

例如:

两个节点:

Node1:

kotlin 复制代码
return {
 messages:["hello"]
}

Node2:

kotlin 复制代码
return {
 messages:["world"]
}

最终:

复制代码
messages?

怎么办?

这就是 Reducer 的作用。


覆盖模式

默认:

lua 复制代码
(prev,next)=>next

表示:

新的覆盖旧的。

例如:

之前:

vbnet 复制代码
answer:"A"

节点返回:

vbnet 复制代码
answer:"B"

结果:

vbnet 复制代码
answer:"B"

累积模式

聊天记录:

css 复制代码
messages: Annotation({

 reducer:(prev,next)=>[
   ...prev,
   ...next
 ]

})

第一次:

css 复制代码
[ "你好"]

第二次:

css 复制代码
[ "你好", "你好,请问..."]

7. 一个完整 Demo

状态:

vbnet 复制代码
const StateAnnotation = Annotation.Root({

 text:Annotation({
   reducer:(prev,next)=>next,
   default:()=> ""
 })

});

节点:

javascript 复制代码
const step1=(state)=>({

 text:`${state.text}->step1`

});


const step2=(state)=>({

 text:`${state.text}->step2`

});

流程:

sql 复制代码
START

↓

step1

↓

step2

↓

END

输入:

arduino 复制代码
{
 text:"hello"
}

执行:

第一次:

rust 复制代码
hello

↓

hello->step1

第二次:

rust 复制代码
hello->step1

↓

hello->step1->step2

最终:

arduino 复制代码
{
 text:"hello->step1->step2"
}

8. 用一句话理解 State + Node

不要记 API。

记这个模型:

markdown 复制代码
当前 State

    ↓

Node读取

    ↓

Node返回部分更新

    ↓

Reducer合并

    ↓

新的 State

    ↓

下一个 Node

总结

LangGraph 的状态模型:

概念 作用
State 保存整个工作流的数据
Node 执行任务并返回状态更新
Reducer 决定状态如何合并
Annotation 定义 State 结构

一句话:

LangGraph 通过 State 在节点之间传递上下文,Node 负责产生状态更新,Reducer 负责控制更新方式,从而让整个 Agent 工作流能够持续演进。


相关推荐
在所不辞兄35 分钟前
【零基础学智能仿真-63】ABACUS作业工具与MCP接口
人工智能·深度学习·神经网络·机器学习·智能仿真
楚山之石41 分钟前
【Medical Image Analysis】深度学习医学图像合成综述:伪CT、合成MRI与合成PET的架构、性能与临床边界
图像处理·人工智能·学习·mr·mri
blackappleD1 小时前
百度 Unlimited OCR 2 拆解:SR-SWA 如何让百页文档的 KV 缓存不再涨
人工智能·llm
数字新视界1 小时前
国产动环数据库在智能机房环境监控中的应用与优势分析
大数据·人工智能·数据中心·机房管理·模块化机房
holly就是我1 小时前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
雨中飘荡的记忆1 小时前
额度又见底了?这个开源项目,给 AI 编程助手接上 61 家"加油站"
人工智能
天远Date Lab1 小时前
零信任架构实战:基于天远企业年报信息核验构建自动化商业保理财务与社保穿透评估网关
人工智能·架构·自动化
EnCi Zheng1 小时前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
loulanyue_1 小时前
给概率大模型套上确定性缰绳:GraphRAG、神经符号与知识超图重构可信AI底座——读陈华钧杨博等CNCC2026第十届知识图谱论坛实录
人工智能·rag
古法老登瞎折腾2 小时前
大数据智能运维实战(九):让 AI 查日志——找到异常,也保留上下文
java·大数据·运维·人工智能·spring ai·mcp