LangGraph 基础:用 State、Reducer、Node、Edge 与 Command 管理流程
## 问题与目标 标准 Agent 循环适合“模型持续选择工具直到结束”,但真实业务常常需要确定性预处理、条件分支、循环上限和固定审批节点。LangGraph 把流程表示为状态图,使数据和路由从隐式循
Column
Chapter 98 · LangGraph 基础:用 State、Reducer、Node、Edge 与 Command 管理流程
问题与目标
标准 Agent 循环适合“模型持续选择工具直到结束”,但真实业务常常需要确定性预处理、条件分支、循环上限和固定审批节点。LangGraph 把流程表示为状态图,使数据和路由从隐式循环中显式出来。
本篇使用完全确定性的温度复核图,理解 State Schema、Reducer、Node、Edge、Command、START 和 END。模型与工具只是可以放进节点的实现,不是图本身。
核心概念

- State:图在节点间传递的结构化数据契约;
- Reducer:同一个字段收到更新时怎样合并,默认通常是覆盖;
- Node:读取 State,返回部分状态更新,或返回带路由的 Command;
- Edge:规定节点间的执行关系;
- Command:在一次返回中同时更新状态并选择下一节点;
- START/END:图的入口和终点。
节点应返回更新,而不是随意修改传入对象。需要追加列表时显式声明 Reducer,否则新值可能覆盖旧值。
可运行实现
python -m pip install "langgraph>=1,<2"
import operator
from typing import Annotated, Literal
from typing_extensions import TypedDict
from langgraph.graph import END, START, StateGraph
from langgraph.types import Command
class InspectionState(TypedDict):
device_id: str
readings: Annotated[list[float], operator.add]
average: float
action: str
def collect(state: InspectionState) -> dict:
# 返回增量;Reducer 会把新读数追加到原列表。
return {"readings": [68.0, 72.0]}
def analyze(state: InspectionState) -> Command[Literal["review", "__end__"]]:
average = sum(state["readings"]) / len(state["readings"])
if average >= 70:
return Command(update={"average": average, "action": "manual_review"}, goto="review")
return Command(update={"average": average, "action": "none"}, goto=END)
def review(state: InspectionState) -> dict:
return {"action": f"review_{state['device_id']}"}
builder = StateGraph(InspectionState)
builder.add_node("collect", collect)
builder.add_node("analyze", analyze)
builder.add_node("review", review)
builder.add_edge(START, "collect")
builder.add_edge("collect", "analyze")
builder.add_edge("review", END)
graph = builder.compile()
result = graph.invoke({
"device_id": "AX-8",
"readings": [],
"average": 0.0,
"action": "",
})
print(result)
输出中的 readings 包含两次采样,平均值为 70,并进入 review。将采集或分析节点替换成模型、工具或子 Agent 时,State 与 Edge 仍然可以保持稳定。
常见问题与排查
列表更新后旧数据消失
检查字段是否声明了 Reducer。默认覆盖适合标量状态,消息、日志和证据列表通常需要追加或自定义去重。
条件边和 Command 混在一起
简单路由可用条件边;节点既需要更新状态又决定下一步时使用 Command。保持一种路由职责集中,避免同一节点同时存在互相冲突的出边。
State 变成无边界字典
定义 TypedDict、Dataclass 或 Pydantic Schema,区分输入、内部状态和最终输出。不要把数据库连接、密钥和大文件正文写进可持久化状态。
图出现无限循环
在 State 中记录轮数或进度,设置递归上限,并为循环设计明确不变量和出口。图结构可见不等于自动安全。
小结
LangGraph 把状态合并和执行路由变成显式结构。State 说明“流程知道什么”,Node 说明“执行什么”,Edge 与 Command 说明“接下来去哪”;这为后续持久化、中断和多 Agent 编排提供了稳定骨架。
License: CC BY-NC 4.0
Updated 2 hours ago
Was this article helpful? Give it a like.
0 comments


