在构建复杂的 AI Agent 工作流时,如何管理数据流(State 状态)以及如何组织逻辑单元(Node 节点)是核心关键。LangGraph 通过将工作流组织成有向图 的方式,为开发者提供了一个强大且灵活的框架。本文将通过一个基础示例,带你深入理解 LangGraph 的两个核心要素:State(状态) 与 Nodes(节点)。
一、什么是 State 和 Nodes?
在 LangGraph 中,一切皆为图:
-
State(状态): 简单来说就是数据。它是图中所有节点共享的"公共账本"。状态通常是一个 Python 数据结构(如TypeDict或 Pydantic 模型)。它被提供给图,由节点进行更新,并最终返回给用户。
-
Nodes(节点): 节点本质上是 Python 函数。每个节点接收当前的
State作为输入,执行逻辑处理后,输出对State的更新。
关键特性:持久化 LangGraph 的状态可以跨时间持久化。如果某个节点在执行过程中崩溃,系统可以恢复状态并重新运行该节点,这大大增强了应用的弹性。
二、如何构建图?
下面来创建一个简单的图,包含一个节点 node_a,它接收一段文字并返回一条新的消息。
1. 定义状态 (State)
首先,我们需要确定图中传递的数据格式。这里我们使用 TypedDict 定义一个包含字符串列表的字典。
python
from typing import List, TypedDict
class State(TypedDict):
nlist: List[str]
2. 编写节点函数 (Nodes)
节点是一个简单的函数,它接收 State 并返回更新后的 State。
python
def node_a(state: State) -> State:
print(f"节点 A 接收到的数据: {state['nlist']}")
note = "来自节点 A 的问候:Hello World"
# 返回更新后的状态
return {"nlist": [note]}
3. 构建与编译图
使用 StateGraph 将节点和逻辑流程(边)连接起来。
python
from langgraph.graph import END, START, StateGraph
# 1. 初始化图,并指定状态类型
builder = StateGraph(State)
# 2. 添加节点
builder.add_node("a", node_a)
# 3. 设置逻辑流程
builder.add_edge(START, "a") # 从起点开始进入节点 a
builder.add_edge("a", END) # 节点 a 执行完后结束
# 4. 编译成可执行对象
graph = builder.compile()
三、怎么使用图?
当你调用 graph.invoke() 时,LangGraph 的运行时(Runtime)会接管一切:
-
初始化: 根据输入初始化状态。
-
节点调度: 选定节点(如
node_a)执行。 -
状态传递: 将当前状态传递给函数。
-
状态更新: 接收函数返回的结果并合并到全局状态中。
python
initial_state = State(nlist=["你好节点 A,你最近怎么样?"])
result = graph.invoke(initial_state)
# 输出结果:
# 节点 A 接收到的数据: ['你好节点 A,你最近怎么样?']
# {'nlist': ['来自节点 A 的问候:Hello World']}
| 总结 | 说明 |
|---|---|
| 数据共享 | 所有节点共享同一个 State,可以使用 TypedDict、dataclass 或 Pydantic 定义。 |
| 逻辑单元 | 节点是纯 Python 函数,职责明确:接收状态 -> 处理 -> 返回更新。 |
| 执行流 | 调用 invoke 后,图按照预定义的边(Edge)自动流转,直至到达 END。 |
| 灵活性 | 你可以随时向图中添加新节点,或扩展 State 字段以传递更复杂的数据。 |