资讯动态

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

发布时间:2026/10/23 7:51:48 来源:尧图企业网站定制
个人主页 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。把这两者分清楚状态就不会莫名其妙被冲掉。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑