《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 工作流能够持续演进。


相关推荐
W***25929 分钟前
2026深度解读:Work Agent长程任务的执行机制与落地形态
人工智能
正经教主17 分钟前
【FDE系列】阶段3:Day 73:RAGAS 评测 — 用数据证明改动有效
人工智能·rag·fde
deepseek2324 分钟前
硬预算帽默认值拆解:AWS 九月上线支出上限、GCP 七月跟进,Agent 时代按量付费必须默认断供
人工智能·llm·云计算·agent·aws
Alice-YUE26 分钟前
前端 × AI:从 Cursor 到 Transformer,一份完整认知路径
前端·人工智能·transformer·ai编程·前端开发·cursor
weixin_3823952329 分钟前
本地部署 ERP 选型记录:从 Excel 到轻量系统的这几年
数据库·人工智能·数据挖掘
迁移科技31 分钟前
小体积蕴含大能量:Epic Eye Pixel Mini轻量化相机的应用美学
人工智能·3d·自动化·视觉检测
诺伦35 分钟前
AI Agent编排实战:用四层架构搭建增长运营垂类Agent系统 | RiseClaw玄策
人工智能·ai agent·mcp·agent编排·增长运营
阿部多瑞 ABU43 分钟前
UGC问题下偷拍悖论法律教案
人工智能
小猴子爱上树44 分钟前
跨马翻译:批量图片翻译与视频字幕、智能抠图一站式在线图片翻译工具
大数据·人工智能·python·音视频
W***25921 小时前
2026 企业 AI 办公工具选型指南:能力评估与平台全景分析
大数据·人工智能