什么是Annotated?什么是 Reducer?听不懂啊?看这篇文章就好

一.什么是Annotated? 什么是Reducer?

1.1如果不用Annotated和Reducer

如果我现在有一个鞋盒(字典),正常时候来一双nike新鞋子(数据),那么我这个鞋盒就会装新的nike鞋子(字典存新数据),旧的安踏鞋子就不装了(旧数据就不要了)。

shoe_box = {"left": "安踏(左鞋)", "right": "安踏(右鞋)"}
new_shoe = {"left": "nike(左鞋)", "right": "nike(右鞋)"}
shoe_box.update(new_shoe)   # 安踏旧鞋子全丢了,换上新鞋
print(shoe_box)  # {'left': 'nike(左鞋)"', 'right': 'nike(右鞋)'}

1.2如果想要实现:新鞋子进来想要保留左鞋子,把右鞋子换掉,如何处理?

from typing import Annotated, TypedDict

# 自定义 Reducer
def merge_shoes(old: dict, new: dict) -> dict:
    return {"left": old.get("left", new["left"]),   # 保留安踏(旧左鞋),如果没有就用新的
            "right": new["right"]}                  # 右鞋强制用新的

class State(TypedDict):
    shoes: Annotated[dict, merge_shoes]   # 用 Annotated 绑定 Reducer

# 模拟框架状态更新
state = {"shoes": {"left": "安踏(旧左鞋)", "right": "安踏(旧右鞋)"}}
update = {"shoes": {"left": "nike(新左鞋)", "right": "nike(新右鞋)"}}

# 框架内部自动调用 Reducer
state["shoes"] = merge_shoes(state["shoes"], update["shoes"])
print(state["shoes"])  # {'left': '安踏(旧左鞋)', 'right': 'nike(新右鞋)'}

所以,Annotated 是给鞋盒贴标签“请按这个规矩办”,而 Reducer 就是那个规矩(比如保留左鞋、换右鞋,或者鞋子数量相加)

二.Annotated 不用每一次都自定义,这边提供了一些常用的方法

内置 Reducer:常用策略一览

LangGraph 提供了一些内置 reducer 来处理常见的更新模式,你可以根据需求选择使用。

更新策略 使用方式 代码示例 核心行为 & 适用场景
数值累加 Annotated[int, add] total: Annotated[int, add] 将新值累加到旧值上。
适用场景:计数器、积分累计、资源用量统计等。
列表扩展 Annotated[list, extend] items: Annotated[list, extend] 将新列表中的元素追加到原列表中(类似 list.extend())。
适用场景:批量结果收集、动态路径记录等。
集合合并 Annotated[set, or_] unique_ids: Annotated[set, or_] 对两个集合执行并集操作,实现自动去重。
适用场景:维护去重的ID集合、标签集合等。
字典合并 Annotated[dict, update_dict] metadata: Annotated[dict, update_dict] 将新字典的键值对更新到旧字典中,键冲突时新值覆盖旧值(类似 dict.update())。
适用场景:配置增量更新、合并元数据等。
高级消息合并 Annotated[list, add_messages] messages: Annotated[list, add_messages] 专为处理消息列表设计,能智能处理追加和替换。
适用场景:所有需要管理对话历史或消息流的场景。
posted @ 2026-05-21 10:37  Alfred404  阅读(34)  评论(0)    收藏  举报