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

发布时间:2026/10/23 7:51:52
状态更新与 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。把这两者分清楚状态就不会莫名其妙被冲掉。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询