Reducer 是什么?多个节点如何安全更新状态

LangGraph实战解析 — Reducer函数在状态管理中的高级应用 本文深入解析了LangGraph中Reducer函数在状态管理中的高级应用。通过生活化比喻和实战案例,详细阐述了Reducer如何作为状态更新的“交通警察”,确保复杂AI工作流中数据传递的安全与有序。文章重点介绍了内置Reducer(如覆盖与累加更新)与自定义Reducer的实现,并结合MessageGraph,展示了如何构建稳定、可控的动态对话管理系统,是掌握LangGraph核心机制的关键。 阅读详情

上一篇文章里,我们讨论了 Edge 和 Conditional Edge。

一个重要结论是:

Edge 让流程可以分支,也可以回到前面的节点。

但一旦流程变复杂,就会遇到另一个问题:

多个节点如何安全更新同一份 State?

这就是 Reducer 要解决的事。

很多人第一次接触 LangGraph 时,会把 Reducer 看成一个不太重要的细节。

实际上,它非常关键。

因为它决定了状态更新是覆盖、追加,还是按规则合并。

State 更新为什么需要规则?

最简单的状态更新,看起来像这样:

旧值 + 新值 = 新状态

但真实流程里,情况没有这么简单。

比如:

一个节点追加消息
一个节点更新检索结果
一个节点记录工具调用
一个节点补充人工审核意见

如果这些更新都写到同一个 State,系统必须知道:

哪些字段该覆盖
哪些字段该追加
哪些字段该合并
哪些字段不该丢失

没有这个规则,状态就会乱。

Reducer 的作用是什么?

Reducer 的作用,就是定义 State 某个字段的合并方式。

简单说:

当新更新到来时,如何和旧状态合并

如果没有 reducer,很多字段默认可能是覆盖。

但在 Agent Workflow 里,覆盖并不总是你想要的。

比如消息列表通常应该追加,而不是覆盖。

而某些标量字段,比如:

task_status
retry_count
need_human_review

则可能更适合覆盖或替换。

所以不同字段需要不同更新策略。

追加型字段和覆盖型字段

可以先把 State 字段分成两类。

第一类是追加型字段。

比如:

messages
logs
tool_calls
retrieval_candidates
notes

这些字段通常需要保留历史。

第二类是覆盖型字段。

比如:

current_step
task_status
need_human_review
final_answer
retry_count

这些字段更像当前值。

Reducer 的价值,就是让这两类字段都能按正确方式更新。

为什么消息列表最常见?

LangGraph 里最常见的 reducer 场景,就是消息列表。

比如一个对话 Agent,每次模型输出都要追加到消息历史里。

如果没有合适的合并规则,后面的节点只会看到最后一条消息。

那系统就失去上下文了。

所以消息类字段通常需要“追加”语义。

这也是为什么很多 Agent 应用都非常重视 history、messages 或 events 这类字段。

它们不是一次性输入,而是持续积累的过程。

并行更新时,Reducer 更重要

Reducer 最关键的场景,往往出现在并行或多来源更新。

比如:

一个节点返回检索结果
另一个节点返回工具结果
还有一个节点返回人工补充信息

这些更新可能都要写回同一个 State。

这时候就必须清楚:

是追加?
是合并?
还是后者覆盖前者?

如果规则不明确,结果就不可预测。

Reducer 让这种合并变得确定。

Reducer 让 State 更稳定

很多 Agent 出问题,不是因为模型不行,而是状态被更新乱了。

比如:

检索结果被覆盖
消息历史被截断
工具结果被误删
中间步骤没留下痕迹

有了合并规则,系统会更稳定。

因为每个字段都知道自己应该怎么更新。

这对复杂图尤其重要。

Reducer 不等于随便拼接

一个常见误区是:

认为 reducer 就是简单把内容拼起来。

不是。

Reducer 的核心不是“拼”,而是“按规则合并”。

有些字段适合追加。

有些字段适合取最新值。

有些字段适合做去重。

有些字段适合保留最大值或最可信值。

不同字段的语义不同,合并策略也不同。

如果把所有东西都当成字符串拼接,State 很快会变脏。

一个简单例子

假设有一个字段叫 messages。

每次节点输出一条消息,应该追加到列表里。

而如果有一个字段叫 attempt_count,每次重试应该加一。

再比如 final_answer,通常只在最后写入一次。

这三种字段明显不该用同一种更新逻辑。

Reducer 的意义,就是把这种差异化更新表达出来。

Reducer 和可观测性有关

Reducer 不只是状态合并问题。

它也关系到排查问题。

因为如果状态字段被覆盖或丢失,你会很难知道是哪一步改掉了什么。

如果 reducer 规则清楚,后面你就能更容易复盘:

哪个节点更新了什么
哪个字段被追加
哪个字段被覆盖
哪个状态是最终生效的

这会显著降低调试成本。

Reducer 设计要和 State 一起做

Reducer 不是事后补丁。

它应该和 State 设计一起完成。

当你设计一个字段时,就应该想清楚:

这个字段是追加型还是覆盖型?
多个节点会不会同时写它?
如果会,应该怎么合并?
这个字段要不要保留历史?

如果这些问题一开始没想清楚,后面很容易返工。

常见误区

第一个误区,是以为 reducer 不重要。

其实它是 State 正确更新的核心。

第二个误区,是所有字段都用同一种更新方式。

不同字段语义不同,规则也应不同。

第三个误区,是只考虑单节点写入,不考虑并行或回边。

流程一复杂,状态冲突就很常见。

第四个误区,是 reducer 规则不透明。

看不懂规则,图就难维护。

第五个误区,是把 reducer 当成字符串拼接器。

它应该是状态合并规则,而不是简单连字符。

总结

Reducer 的作用,是定义多个节点更新 State 时的合并规则。

它让:

消息可以追加
日志可以保留
结果可以覆盖
计数可以累加

一个复杂 Agent 图,如果没有合适的 reducer,状态很容易乱。

而状态一乱,路由判断、调试和恢复都会变得很困难。

所以 LangGraph 里,State 不只是字段集合,Reducer 也不是小细节。

它们一起决定了图的稳定性。

下一篇文章,可以继续讨论 Tool Node。

因为 Agent 真正变得有用,很大一部分来自工具调用。

LangGraph状态管理实战 — Reducer机制与消息处理优化 本文深入探讨了LangGraph中的Reducer机制,这是其状态管理的核心。通过对比默认覆盖与operator.add追加行为,并引入add_messages实现基于ID的智能消息合并与替换,文章解决了复杂AI应用中的对话历史管理难题。实战部分展示了如何利用Reducer和MessageGraph优化消息处理流程,构建出稳定、可维护的智能体应用。 阅读详情

相关推荐

信号编辑软件ZX/SignalEditing

信号编辑软件ZX/SignalEditing

weixin_45661395的博客 954

深入 LangGraph State:Reducer 是如何让状态“自动合并”的

本文是 LangGraph 实战第二篇,详解 Reducer 状态合并:默认字段新值直接覆盖,借助Annotated+Reducer可实现数据累加;讲解 Channel 底层原理、源码与三类实战案例,罗列常见踩坑点并给出生产优化方案,区分覆盖 / 累加选型。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 3万+

STM32新手必看:AHT20温湿度传感器实战指南(附完整I2C代码)

本文详细介绍了如何使用STM32驱动AHT20温湿度传感器,包括硬件连接、I2C通信协议解析、驱动代码优化及实战调试技巧。通过对比AHT20与DHT11、SHT30等传感器的性能,突出AHT20的高性价比优势,并提供完整的I2C代码示例,帮助新手快速上手嵌入式传感器开发。

weixin_29163857的博客 291

LangGraph状态管理中Reducer函数的使用

字典类型定义状态:在LangGraph里,字典常被用作状态模式。在一个简单工作流程示例中,有如下代码:在这段代码中,首先定义了两个节点函数addition和,分别实现对状态中x值的加法和减法操作。通过创建图,并添加节点和边,最后编译图并传入初始状态{"x": 10}启动执行。字典作为状态模式,节点可自由读写状态,但需注意键值一致性,若访问不存在的键,如将函数中state["x"]改为state["z"],运行时会报错中断。2.TypedDict定义状态:使用TypedDictx: int。

qq_43588095的博客 1396

电脑的kernelbase.dll故障怎么处理?kernelbase.dll是什么文件

kernelbase.dll​是一个系统文件,属于Microsoft Windows操作系统的一部分。该DLL(动态链接库)文件包含了许多基本且低级的系统函数,这些函数被Windows上运行的各种程序和进程调用。kernelbase.dll通常与Kernel32.dll紧密相关,它是实现许多Windows API(应用程序编程接口)的封装。这些API涉及到内存管理、输入输出操作、进程和线程管理以及其他许多核心的操作系统功能。

电脑修复君的博客 4533

【机器学习】Anaconda安装后打不开jupyter notebook(网页不自动跳出)

anaconda安装成功以后,jupyter notebook可以出现打开的路径,能够手动复制粘贴地址路径打开,却不能自动跳转到网页。解决的办法是在配置文件中加入指定的浏览器配置信息。

weixin_43416960的博客 4万+

LangGraph并行节点数据丢失:Reducer机制详解与实战避坑

在构建复杂工作流时,状态管理是核心挑战之一,尤其在并发场景下,多个节点同时更新共享状态可能导致数据竞争与丢失。其原理在于系统需要一套明确的规则来协调并行更新,这就是Reducer机制。理解并正确配置Reducer对于确保数据一致性、提升系统可靠性具有重要技术价值,广泛应用于多轮对话、文档分析、并行工具调用等场景。本文聚焦LangGraph中的三种核心Reducer——last_writer_wins、append和merge,深入解析其语义差异与适用场景,帮助开发者精准控制数据流向,有效解决因并发更新导致的

weixin_30315723的博客 376

射频工程师必须了解的S参数四项要点

本文围绕单端 6 英寸走线的 S 参数展开深入分析,核心包含四项关键要点:低频下导线电学长度远小于信号波长,S11 呈大负分贝值、S21 接近 0 分贝;端口与走线的阻抗不匹配引发反射叠加,形成 S11 首个峰值(对应传输线四分之一波长频率);S21 相位可作为一致性检查依据,其 90° 相位差与 S11 峰值吻合;理想建模中 S11 峰值随频率上升因损耗下降,实际测量因连接器等阻抗不连续性,S11 会出现振荡上升。分析依托 Keysight ADS 工具与电磁求解器原理,为 S 参数解读提供科学支撑。

一只豌豆象的博客 1283

LangGraph并行节点数据丢失?详解Reducer机制与选型指南

在构建复杂的AI工作流或数据处理管道时,并行执行是提升效率的关键技术。其核心原理在于将任务拆分为多个可同时执行的子任务,但随之而来的挑战是如何协调各子任务对共享状态的修改,避免数据竞争和不一致。Reducer(归约器)正是解决这一问题的核心技术组件,它定义了多个并行节点输出结果的合并规则,直接决定了数据是协同构建还是相互覆盖。从技术价值看,正确的Reducer选型能保障数据一致性、提升系统可靠性,是构建健壮并行系统的基石。其应用场景广泛,包括智能客服路由中的意图分类、多源数据聚合、日志收集以及分布式计算中的

weixin_30271335的博客 438

【Mode】多模干涉仪的设计 Multi-mode interferometer(MMI)

与 Splitter 器件一样,MMI 器件也是一种常见的分光器件,可以根据用户的需求将光束分成不同的比例。本文,我们将介绍如何仿真 MMI 器件。这里我们使用的是 1x2 MMI,其本质上是由四个部分组成的,中间的矩形多模式干涉区域以及左右两侧的三个 taper 模式转换区域。之前的教程中我们也提及了,为了获取稳定的模式场分布,通常,我们需要进行模式收敛性扫描。这里以官网给出的案例为例。如何提取 S 参数我们先暂时不做介绍,后续有时间了我们再做介绍。

u011699626的博客 1212

ArduPilot简介

一,什么是ArduPilot? ArduPilot是一个可信的,多用途的,开源的自动驾驶系统。该系统支持了非常多的交通工具类型,包括多旋翼无人机,传统直升机,固定翼飞行器,船,潜艇,巡逻车等。源码由大型开发者社区的专家和爱好者共同开发和维护。也欢迎更多的开发者加入源码的迭代演进,最好的“打开”方式就是加入开发者团队论坛。该论坛对所有人开放,在这里可以深入感受到开发者们对ArduPilot的热爱。 论坛链接:ArduPilot Discourse 开发者指南:Welcome to the ArduPil

从0到1,突破自己 5450

【LangGraph】reducer 函数(State状态字段合并与更新)

Reducer 函数是 LangGraph 中用于处理状态字段更新的可调用对象(函数或类),通常与 Annotated 类型注解结合使用,声明式地指定字段如何合并或更新。Reducer 的核心思想是将字段的更新逻辑从业务代码中解耦,通过类型注解绑定到字段上,实现声明式状态管理。内置 reducer(如 add_messages、operator.add、update_dict)覆盖常见场景,自定义 reducer(函数或类)提供灵活性。

彬彬侠的博客 2020

SAP GR(Group Reporting)合并报表内容及功能简介(五)-合并和抵消

随着合并和收购数量的显著增加,企业在全球经济中面临着诸多挑战。其中最常见的是法律实体与子公司之间缺乏透明度,导致无法以经济高效的方式对账法律实体与子公司之间的公司间交易,从而造成结算出现重大延迟。公司间匹配和对账功能允许用户在关账过程中进行早期分析,以避免公司间差异,并缩短关账时的延迟。公司间匹配和对账功能交易级别匹配和实时对账基于各种组织维度(如公司、利润中心和合并单位)的灵活建模自动差异解决。应用内通信和工作流。与公司间抵销集成。

weixin_43853754的博客 4399

终极指南:Mist中的节点reducer如何高效管理以太坊网络状态

Mist作为以太坊网络上浏览和使用去中心化应用(Ðapps)的核心工具,其节点状态管理是确保应用稳定运行的关键。本文将深入解析`reducer.js`文件如何通过优雅的状态管理机制,帮助开发者和用户理解以太坊节点的工作原理。 ## 什么是节点reducer?核心功能解析 在Mist应用中,节点reducer(位于`modules/core/nodes/reducer.js`)扮演着"状态管家"

gitblog_00318的博客 338

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LangGraph 状态与节点:从 TypedDict 规约到 reducer 合并语义的落地路径

梳理 LangGraph 中 State、Node、Edge 的协作方式,给出 TypedDict 规约、覆盖与追加两种合并语义的对照、自定义 reducer 写法与条件路由示例,并附排错速查表。

2301_78967866的博客 286

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Mist中的设置reducer:reducer.js与配置状态

在Mist中,[reducer.js](https://link.gitcode.com/i/046bd8c4be95e95d42da969dcdf42b39)扮演着管理应用配置状态的关键角色。它定义了应用程序的初始状态和各种状态转换规则,是理解Mist配置系统的重要入口。 ## 初始状态设计 reducer首先定义了应用的初始状态结构: ```javascript export const...

gitblog_00926的博客 691

Mist中的UI reducer:reducer.js与界面状态

你是否曾好奇Mist钱包的界面状态是如何管理的?为什么点击不同功能按钮时窗口能精准响应?本文将带你揭开UI状态管理的核心——**reducer.js**的工作原理,只需5分钟,你就能理解界面状态如何被优雅地控制。 ## 什么是UI Reducer? 在Mist中,**UI Reducer**(状态管理器)是控制界面行为的"大脑",它通过[reducer.js](https://link.git...

gitblog_01111的博客 718

LangGraph中的Reducer是什么

问题答案Reducer 是什么?一个定义 State 字段更新规则的函数默认行为是什么?覆盖(新值替换旧值)Reducer 改变什么?从"覆盖"变成"合并/累加/自定义"Reducer 的参数?为什么需要它?因为图有分支和循环,需要累积而非覆盖内置的有哪些?能自己写吗?能,任何符合签名的函数都可以。

m0_64363449的博客 269

【python】LangGraph 从入门到精通(一):状态管理与 Reducer 优化详解

LangGraph 是实现复杂 AI Agent 的底层关键。本文带你从零开始,深入理解其状态管理与 Reducer 机制,涵盖 Multi-Schema 设计模式与 add_messages 等实战技巧。全篇干货,配有完整可运行代码,推荐收藏!

m0_74821874的博客 1306

5个关键技巧:掌握Mist浏览器中的reducer测试与状态管理

Mist浏览器作为以太坊网络上的去中心化应用浏览器,其核心功能依赖于高效的状态管理机制。本文将深入探讨Mist项目中reducer测试的重要性,帮助开发者理解如何通过reducer.test.js确保状态更新的正确性,从而构建更可靠的以太坊应用。 [![以太坊状态管理架构](https://raw.gitcode.com/gh_mirrors/mi/mist/raw/81228a3102c544

gitblog_00758的博客 893

LangGraph——reducer

LangGraph中reducer的使用

qq_50863584的博客 366

LangGraph状态管理进阶:Reducer函数在并发更新中的实战应用

本文深入探讨了LangGraph中Reducer函数在并发状态管理中的关键作用与应用实践。通过分析内置Reducer的智能合并策略和自定义Reducer的设计方法,帮助开发者解决多节点并发更新导致的数据一致性问题,提升系统性能和可靠性。文章特别介绍了时间窗口聚合、版本化合并等高级模式,并提供了性能优化和调试的实战技巧。

fun88的博客 923

langgraph教程系列-03-状态如何在图里流动-reducer机制

本文是「LangGraph 教程系列」第 3 篇。写作时基于 langgraph 1.2.10、langchain 1.3.14、langchain-openai 1.4.1、Python 3.12+。配套代码仓库 https://github.com/wxj006007/deep-research-assistant ,本篇对应 tagv0.2。上一篇结尾埋了颗雷,「第二次检索的结果会把第一次的覆盖掉」。这一篇我们先把雷踩响,再用一行代码拆掉它。

2401_88756258的博客 515

LangGraph状态管理实战:如何用Reducer函数优化AI Agent工作流

本文深入探讨了如何利用LangGraph的Reducer函数优化AI Agent工作流的状态管理。通过对比基础的字典状态与引入TypedDict的类型安全方法,文章详细解析了Reducer的工作原理,并提供了消息列表合并、多Agent投票系统等实战案例,展示了如何通过自定义Reducer实现状态的精细化控制,从而构建更健壮、高效的复杂协作应用。

solidity8miner的博客 667

LangGraph基础知识(Reducer/MessageGraph)(二)

在`LangGraph`框架中,**不论构建的代理简单或复杂,其本质都是通过节点(Node)和边(Edge)的有机组合来形成一个完整的图(Graph)**。这种构建方式所形成的工作流逻辑十分清晰:每个节点在完成其任务后,都会通过边来指示下一个工作步骤,从而赋予整个应用系统更高的灵活性和可扩展性。掌握三个核心组件——状态(State)、节点(Node)和边(Edge)。

m0_37242314的博客 957

【LangGraph】作为节点添加与状态共享

在上一篇文章中,我们学习了如何从主图节点函数内部手动调用子图。这种方式灵活但需要编写胶水代码来处理状态转换将子图直接作为节点添加到主图中此时,子图和主图共享状态(可以部分重叠),LangGraph 会自动传递状态和配置,本文将详细介绍这种模式,并通过实际案例展示如何利用状态共享简化开发主图和子图使用相同的状态类型(或子图状态是主图状态的子集)。当主图执行到子图节点时,LangGraph 会自动将当前主图状态作为子图的初始状态传入;子图执行完毕后,其返回的状态更新会合并回主图状态。

zhai0104的博客 458
上一篇: Edge 和 Conditional Edge:让流程根据状态分支
下一篇: Tool Node:如何把外部工具接入 LangGraph
沐泽百川
博客等级 码龄6年 824粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值