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] 的作用是?