Node(节点)在 LangGraph 中的作用
在 LangGraph 中,Node(节点) 是整个图(Graph)工作流中的核心执行单元。如果把 LangGraph 构建的应用比作一条工厂流水线,那么节点就是流水线上的工作站或工人。
以下是 Node 在 LangGraph 中的具体作用和核心机制:
1. 核心作用:执行具体任务(The "Doer")
节点是真正“干活”的地方。图中的每一个节点都代表一个具体的计算步骤。在一个大语言模型(LLM)应用中,节点通常执行以下任务:
- 调用大语言模型(LLM)生成回复。
- 执行外部工具(Tools),例如搜索网页、查询数据库、计算数学题。
- 处理、转换或清洗数据。
- 与用户进行交互(比如暂停等待用户输入)。
2. 与 State(状态)的交互机制
LangGraph 是基于“状态(State)”驱动的。节点的核心工作模式是“读取状态 -> 执行逻辑 -> 更新状态”。
- 输入(Input): 节点(本质上是一个 Python 函数或 LangChain 的 Runnable 对象)接收当前整个图的全局
State作为输入参数。 - 处理(Process): 根据当前的状态数据执行逻辑。
- 输出(Output): 节点不返回完整的状态,而是返回一个包含状态更新(State Update) 的字典。LangGraph 会根据你在定义 State 时指定的 Reducer(聚合函数),将这个更新合并到全局状态中。
3. 特殊的内置节点
在 LangGraph 中,除了开发者自定义的节点外,还有两个极其重要的虚拟/内置节点:
START节点: 图的起点。当你给图输入初始数据并运行图时,数据会首先从START节点流向与其相连的第一个业务节点。END节点: 图的终点。当流程流转到END节点时,整个图的执行结束,并返回最终的 State。
4. 节点与边(Edges)的分工
在 LangGraph 的设计哲学中,节点只负责“做事”,不负责“寻路”。
- Node(节点): 专注于完成当前的任务并更新状态。
- Edge(边/条件边): 负责根据当前的状态,决定接下来把状态传递给哪一个 Node。
这种设计将“业务逻辑”和“流程控制”解耦,使得复杂的循环(Cycles)和多 Agent 协作变得非常清晰。
💡 极简代码示例
为了更好地理解,看看 Node 在代码中长什么样:
python
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
# 1. 定义状态 (流水线上的产品)
class State(TypedDict):
messages: list
count: int
# 2. 定义一个 Node (工作站/工人)
def llm_node(state: State):
# 读取当前状态
current_count = state.get("count", 0)
# 执行业务逻辑(比如调用 LLM)
response = f"这是第 {current_count + 1} 次回复"
# 返回状态的【更新】 (LangGraph 会自动将其追加或合并到全局 State 中)
return {"messages": [response], "count": current_count + 1}
# 3. 构建图
builder = StateGraph(State)
# 将 Node 添加到图中,并给它起个名字叫 "my_llm"
builder.add_node("my_llm", llm_node)
# 定义边(数据流向)
builder.add_edge(START, "my_llm")
builder.add_edge("my_llm", END)
graph = builder.compile()
总结比喻
- Graph(图): 整个餐厅的运作流程。
- State(状态): 顾客的点菜单(随着流程不断添加菜品和备注)。
- Node(节点): 厨师、切菜工、服务员(他们拿到点菜单,做自己该做的菜/事,然后在菜单上打个勾或加上新内容)。
- Edge(边): 传菜员(根据菜单现在的状态,决定接下来把菜单递给哪位员工)。