LangGraph 中级

State 与 Reducer:图的状态机基础

状态如何流动与合并:TypedDict/Pydantic 定义 State,Annotated Reducer 定义"更新而非覆盖"。

State 是图的"血液"

每个节点收到当前 State、返回对 State 的更新。默认语义是按字段覆盖——但你很快会遇到"消息列表要追加而不是替换"的需求,这就需要 Reducer。

Reducer:定义"怎么合并"

from typing import Annotated
from langgraph.graph.message import add_messages

class State(TypedDict):
    messages: Annotated[list, add_messages]   # 追加合并
    query: str                                 # 直接覆盖
    retries: int                               # 直接覆盖

add_messages 是最常用的 Reducer:节点返回的新消息会追加到列表尾部,并自动处理 ID 去重。没有 Reducer 的字段,节点返回即覆盖。

实战要点

  • State 尽量小而准:只放流程需要的信息(消息、当前阶段、中间结果),大块资料外置存储只留引用;
  • Pydantic 也支持:需要字段校验时用 BaseModel 定义 State;
  • 输入/输出分离StateGraph(schema, input=..., output=...) 可以让图对外只暴露必要字段。

调试状态的正确姿势

app.invoke(initial_state)                # 拿最终状态
for ev in app.stream(initial_state):     # 逐节点观察状态演变
    print(ev)
状态设计是 LangGraph 开发的核心功力:State 画对了,节点就是一堆纯函数,好写好测。

📝 课后练习

quiz-1 LangGraph 中 Annotated[list, add_messages] 的作用是?