尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
状态更新与 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]}# 覆盖不是追加graphStateGraph(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)appgraph.compile()print(app.invoke({notes:[]})[notes])# [B]A 丢了跑完只剩[B]因为b的返回值整体覆盖了notes。二、用 Annotated 声明 reducerAnnotated[type, reducer_fn]告诉 LangGraph当多个节点都返回这个字段时用 reducer_fn 把它们「合并」起来而不是覆盖。fromtypingimportTypedDict,Annotateddefadd(a,b):# reducer旧值 a新值 b返回合并结果returnabclassState(TypedDict):notes:Annotated[list,add]现在再跑上面的a和bprint(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、labelreducer 适合「累积型字段」notes、messages、history。把这两者分清楚状态就不会莫名其妙被冲掉。
RELATED

相关推荐

自动化测试入门(一)

自动化测试入门(一)

分享一段文字,避免自己成为高知识低文化的工程师:在这个可以通过AI制作一切的时代,还是坚持手打码字(代码也可以AI)。不知道该说自己是老古董,不会与时俱进?还是说有所坚持是对的。自动化测试&a…

📅 2026/10/23 7:51:55
日志聚合接口已经超时,后台任务为什么还没结束?

日志聚合接口已经超时,后台任务为什么还没结束?

日志聚合接口已经超时,后台任务为什么还没结束? 日志查询接口已经返回超时,为什么后台 goroutine 还留在进程里?代码里有 context,也写了 defer cancel(),看起来请求结束时该做的清理都做了。可沿着任务往…

📅 2026/10/23 7:51:55
js表单重置 和删除确认然后再删除 刷新

js表单重置 和删除确认然后再删除 刷新

document.getElementById(formUser).reset(); //下面的是jquery //$(#formUser)[0].reset(); $(#formUser).find(span).text(); 按删除按钮,需要确认后才能删除const cfwindow.confirm("确认要删除吗?") if (cftrue){//写删除代码}刷新loc…

📅 2026/10/23 7:51:55
MORE NEWS

更多资讯

📰

验证资产沉淀:鲁班教你把一次性脚本变工具、把判断标准立成项目规矩

【免费下载链接】luban-skill 鲁班 | Luban — 把能用的Skill打磨成能被装、能传播、能验证、能进化的公共资产。Agent skill-polishing workshop: 验料访行过尺慢刨回炉 项目地址: https://gitcode.com/gh_mirrors/lu/luban-skill 点击查看 免费下载 鲁班&#xf…

📰

动态规划题型全解析:从背包到树形DP与优化

动态规划(dp)这个内容,我在前面几讲把基础框架搭完之后,很多同学还是会反馈同一个问题:单独看每一道题都能听懂,但自己拿到新题就发蒙,不知道到底该用背包、区间、树形还是别的什么变体。所以这…

📰

破解硬币找零难题:动态规划原理与贪心误区

前几天给一台自助售卖机做找零算法,我发现自己又兜圈子回到了“硬币找零问题”上。给定一批面额固定、数量不限的硬币,比如1元、2元、5元,目标金额是11元,问最少用几枚硬币能凑出来;如果怎么都凑不出来,返回…

📰

HelloAGENTS中standby与global部署模式选型指南

1. 项目概述:从一次真实部署卡点说起“standby 还是 global”——这行字出现在某天凌晨三点的终端日志里,旁边跟着一行红色报错:Agent registration failed: conflict with existing global instance。那一刻我盯着屏幕,手悬在键盘…

📰

C# Winform酒店管理系统源码:从数据库配置到房态与退房结账

简介:面向高校计算机专业课程设计、大作业与毕业设计场景的 C# WinForm 信息管理系统完整工程,采用 C# 与 SQL Server 组合开发,管理员登录后可完成信息录入、修改、查询以及成绩统计等日常管理流程,适合作为桌面应用从入门到进阶…

📰

Windows鼠标指针一键切换方案:原理、工具与自定义实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬