AI创想

标题: LangGraph——reducer [打印本页]

作者: 创想小编    时间: 5 小时前
标题: LangGraph——reducer
作者:CSDN博客
在 LangGraph 中,reducer 是一个核心概念,它定义了当图(graph)中的某个节点(或检查点 checkpoint)接收到多个值时,如何将这些值合并成一个单一的值。这在处理并行分支、循环或消息传递等场景中至关重要,因为它决定了状态如何被更新和累积。
简单来说,reducer 就是一个合并函数:reducer(old_value, new_value) -> combined_value。
一、Reducer 的作用

在 LangGraph 的 StateGraph 中,状态(state)通常是一个字典。每个键(key)可以关联一个 reducer,用于定义该键的值在多次更新时如何合并。
例如:

二、常见的 Reducer 类型和使用方法

LangGraph 提供了多种内置 reducer,也支持自定义。以下是主要的几种:
1. add / operator.add

3. set / 直接赋值(无 reducer)

4. 自定义 Reducer 函数

你可以定义任意逻辑的 reducer。
示例:只保留最长的字符串
  1. def keep_longest_str(old: str, new: str) -> str:
  2.     return old if len(old) >= len(new) else new
  3. class State(TypedDict):
  4.     summary: Annotated[str, keep_longest_str]
复制代码
示例:累加字典中的数值
  1. def merge_dicts(old: dict, new: dict) -> dict:
  2.     result = old.copy()
  3.     for k, v in new.items():
  4.         result[k] = result.get(k, 0) + v
  5.     return result
  6. class State(TypedDict):
  7.     stats: Annotated[dict, merge_dicts]
复制代码
三、Reducer 的使用方法

方法 1:使用 Annotated 在 State 定义中声明(推荐)

这是最清晰、最常用的方式。
  1. from typing import TypedDict, Annotated, List
  2. from langgraph.types import add_messages
  3. from typing_extensions import TypedDict
  4. class State(TypedDict):
  5.     messages: Annotated[List[dict], add_messages]
  6.     count: Annotated[int, sum]
  7.     notes: Annotated[List[str], list.extend]  # 注意:需包装成函数
复制代码
注意:像 list.extend 这种方法不能直接用,需包装:
  1. def extend_list(old: list, new: list) -> list:
  2.     return old + new  # 更安全的不可变方式
复制代码
方法 3:使用 LangGraph 内置常量(如 ADD)
  1. from langgraph.graph import ADD
  2. class State(TypedDict):
  3.     score: Annotated[int, ADD]  # 等价于 operator.add
复制代码
四、Reducer 的执行时机

Reducer 类型用途示例
add_messages合并聊天消息列表聊天机器人
ADD / add数值、字符串、列表相加累加计数、拼接字符串
set (默认)覆盖旧值更新当前状态、主题
自定义函数特殊合并逻辑合并统计、去重、筛选等

原文地址:https://blog.csdn.net/qq_50863584/article/details/151157914




欢迎光临 AI创想 (https://www.llms-ai.com/) Powered by Discuz! X3.4