一个 LangGraph StateGraph 从多个节点接收到对其状态中某个状态属性的并发更新,该属性不支持 此操作。
一种可能发生这种情况的场景是,如果您正在使用 扇出 或图中的其他并行执行,并且您定义了如下所示的图:
class State(TypedDict):
some_key: str # [!code highlight]
def node(state: State):
return {"some_key": "some_string_value"}
def other_node(state: State):
return {"some_key": "some_string_value"}
builder = StateGraph(State)
builder.add_node(node)
builder.add_node(other_node)
builder.add_edge(START, "node")
builder.add_edge(START, "other_node")
graph = builder.compile()
如果上述图中的某个节点返回 { "some_key": "some_string_value" },这将覆盖 "some_key" 的值,替换为 "some_string_value". 但是,如果单个步骤中(例如扇出)的多个节点返回 "some_key"的值,图将抛出此错误,因为 存在关于如何更新内部状态的不确定性。
要解决这个问题,您可以定义一个合并多个值的 reducer:
from typing import Annotated
class State(TypedDict):
# The operator.add reducer fn makes this append-only # [!code highlight]
some_key: Annotated[list, operator.add] # [!code highlight]
这允许您定义逻辑来处理并行执行的多个节点返回的相同键。
故障排除
以下内容可能有助于解决此错误:
- * 如果您的图并行执行节点,请确保已使用 reducer 定义了相关的状态键。