news 2026/10/23 7:51:35

状态更新与 reducer:用 Annotated 做累加

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
状态更新与 reducer:用 Annotated 做累加
个人主页: > for_ever_love__ <(欢迎各位大佬莅临😊)
其他栏目: > 大模型开发从0到1 <
其他栏目: > iOS项目总结大全 <
其他栏目: > 我想学python了 <
其他栏目: > iOS UI <

文章目录

  • 状态更新与 reducer:用 Annotated 做累加
    • 一、默认是覆盖
    • 二、用 Annotated 声明 reducer
    • 三、常见 reducer 套路
    • 四、reducer 只作用于「同字段多次写入」

状态更新与 reducer:用 Annotated 做累加

前面几篇都提到一个关键细节:节点返回的是「要更新的字段」,而 LangGraph 会把这些返回值合并进全局状态。但「合并」默认是覆盖——新值直接盖掉旧值。当你需要的是「追加」而不是「替换」(最典型的就是消息列表),覆盖就不够用了。这就引出 LangGraph 的状态更新函数:reducer。

一、默认是覆盖

看这个例子,notes字段每跑一个节点就被整个替换:

fromtypingimportTypedDictfromlanggraph.graphimportStateGraph,START,ENDclassState(TypedDict):notes:listdefa(state):return{"notes":["A"]}defb(state):return{"notes":["B"]}# 覆盖,不是追加graph=StateGraph(State)graph.add_node("a",a);graph.add_node("b",b)graph.add_edge(START,"a");graph.add_edge("a","b");graph.add_edge("b",END)app=graph.compile()print(app.invoke({"notes":[]})["notes"])# ['B'],A 丢了

跑完只剩['B'],因为b的返回值整体覆盖了notes。

二、用 Annotated 声明 reducer

Annotated[type, reducer_fn]告诉 LangGraph:当多个节点都返回这个字段时,用 reducer_fn 把它们「合并」起来,而不是覆盖。

fromtypingimportTypedDict,Annotateddefadd(a,b):# reducer:旧值 a,新值 b,返回合并结果returna+bclassState(TypedDict):notes:Annotated[list,add]

现在再跑上面的a和b:

print(app.invoke({"notes":[]})["notes"])# ['A', 'B']

a返回["A"],b返回["B"],reducer 把两者加起来,得到['A', 'B']。

三、常见 reducer 套路

  • 列表累加:Annotated[list, lambda a, b: a + b](或operator.add);
  • 取最大值:Annotated[int, max];
  • 集合去重合并:Annotated[set, lambda a, b: a | b];
  • 字典合并:Annotated[dict, lambda a, b: {**a, **b}]。

LangGraph 内置了最常用的「消息累加」reduceradd_messages,专门配合聊天场景,下一篇会直接用。

四、reducer 只作用于「同字段多次写入」

reducer 不改变「节点返回什么」,只改变「多个返回值如何合并」。如果一个字段只有第一个节点写了、后面都没碰,那它一直保持初值,reducer 不会无事生非。

一句话:覆盖适合「结论型字段」(answer、label),reducer 适合「累积型字段」(notes、messages、history)。把这两者分清楚,状态就不会莫名其妙被冲掉。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 7:49:32

两天20道算法题:双指针、动态规划与回溯的刷题复盘笔记

2026年刚开年那阵子&#xff0c;我给自己定了个小目标&#xff1a;把算法题的手感重新捡起来。说实话&#xff0c;工作之后写业务代码的时间多了&#xff0c;很多基础的数据结构和经典题型反而生疏了&#xff0c;碰到稍微绕一点的题就总想去看题解&#xff0c;这让我有点慌。尤…

作者头像 李华
网站建设 2026/10/23 7:28:20

Spark-X2.5-1.7B-Base 推理效率实测:TTFT 与 TOPT 指标全解析指南

【免费下载链接】Spark-X2.5-1.7B-Base 项目地址&#xff1a; https://ai.gitcode.com/SparkLLM/Spark-X2.5-1.7B-Base 点击查看 免费下载 &#x1f4cc; 本文带你快速搞懂 Spark-X2.5-1.7B-Base 的推理效率&#xff1a;这是 SparkLLM 团队推出的 1.7B 级紧凑通用大模型&#…

作者头像 李华
网站建设 2026/10/23 7:24:50

Luckysheet离线表格完整版:本地化部署与Excel导入导出避坑

简介&#xff1a;这份 Luckysheet 完整版资源包面向需要在前端项目中搭建在线表格、并兼顾离线运行能力的开发者&#xff0c;重点解决本地引入时断网报错、字体图标缺失&#xff0c;以及表格数据导入导出等常见问题。压缩包共 82 个文件&#xff0c;约 4.37MB&#xff0c;其中 …

作者头像 李华
网站建设 2026/10/23 7:24:41

Steam挂刀行情怎么盯?SteamTradingSiteTracker 饰品比价追踪指南

Steam挂刀行情怎么盯&#xff1f;SteamTradingSiteTracker 饰品比价追踪指南 【免费下载链接】SteamTradingSiteTracker Steam 挂刀行情站 —— 24小时更新的 BUFF & IGXE & C5 & UUYP & ECO 挂刀比例数据 | Track cheap Steam Community Market items on buff…

作者头像 李华
网站建设 2026/10/23 7:23:39

无名杀武将扩展配置实操:10 分钟挑出适合你的武将包

无名杀武将扩展配置实操&#xff1a;10 分钟挑出适合你的武将包 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 无名杀里的武将包又多又杂&#xff0c;全开容易闪退&#xff0c;不挑又怕错过好武将。这篇文章按“拿到 → 挑选 → 启…

作者头像 李华