什么是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] |
专为处理消息列表设计,能智能处理追加和替换。 适用场景:所有需要管理对话历史或消息流的场景。 |

浙公网安备 33010602011771号