LangGraph教程01:“节点” 四大核心原语之一
一、引言:从“节点”理解 LangGraph 的灵魂
如果你第一次接触 LangGraph,可以把它想象成一个“有方向的智能体思维流程图”。在这张图上,每一个节点(Node)代表一次具体的动作或任务,比如让语言模型回答问题、查询数据库、调用工具 API 或者执行一个条件判断。这些节点通过“边(Edge)”连接在一起,形成智能体的完整思考链路。
在 LangGraph 的世界中,“节点”不是一个抽象的概念,而是真正承担执行逻辑的基本单元。也可以这样理解:LangGraph 的节点是智能体的“思维细胞”,它们彼此协作、相互传递信息,共同构成了有逻辑、有记忆的智能体系统。
掌握“节点”,就相当于掌握了 LangGraph 的运行核心。
二、节点的本质:一个函数就是一个节点
在 LangGraph 中,节点本质上就是一个 可调用的 Python 对象。最常见的形式,就是一个以state为输入、返回状态更新字典的函数:
def node(state):
# 从状态中取出输入
input = state.get("a")
# 执行逻辑(可能是LLM调用、工具操作、计算等)
output = process(input)
# 返回要更新的状态部分
return {"a": output}
在这个定义中:
-
输入(state) 是整个图的共享状态,它可能包含多个键值对,例如
user_input、agent_response等。 -
输出(dict) 仅包含需要更新的部分状态,LangGraph 会自动将返回值合并回全局状态中。
这意味着节点不必返回完整状态,而只需更新自己负责的部分,从而保持模块化与简洁性。
这种函数式的设计使节点具备以下特征:
可测试性高:由于节点是纯函数,输入和输出可直接验证。
可复用性强:相同的节点可应用于不同图结构中,无需改动。
定义清晰:通过显式输入输出,使图结构逻辑一目了然。
每个节点都聚焦于单一职责:它不需要关心全局流程,也不需要操作完整状态,只要专注于自己的任务。这种极简设计哲学让 LangGraph 具有极高的表达力:它并非构建“流程图”的工具,而是构建可执行逻辑图(Executable Graph)。
三、节点的灵活性:万物皆可 Node
LangGraph 没有强制限定“节点”必须是什么。只要是能被调用的对象,并且遵循“接收 state → 返回 dict”的接口约定,就能成为节点。
这意味着:
-
一个 普通的 Python 函数 可以是节点;
-
一个 LangChain Chain / Agent / Tool 也可以是节点;
-
甚至一个 条件判断函数 也能充当节点,实现流程分支。
所以,我们可以轻松地封装一个 语言模型节点(LLM Node):
from langgraph.graph import StateGraph, START, END, MessagesState
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv()
class ChatState(MessageState):
user_input: str
llm_output: str
# 定义LLM节点
def llm_node(state):
prompt = ChatPromptTemplate.from_messages([
("human", "{question}")
])
model = ChatOpenAI(model="Qwen/Qwen2.5-7B-Instruct")
chain = prompt | model
response = chain.invoke({"question": state["user_input"]}).content
return {"llm_output": response}
# 构建图
builder = StateGraph(ChatState)
builder.add_node("llm_node", llm_node)
builder.add_edge(START, "llm_node")
builder.add_edge("llm_node", END)
graph = builder.compile()
# 调用图
result = graph.invoke({"user_input": "hello~LangGraph!"})
print(result)
当然我们这里用到了load_dotenv()去调用模型配置,这里需要在项目目录下建一个.env文件里面设置你的api_key和base_url:
OPENAI_API_KEY=sk-dxxxxxxxxxxxxxxxxxxxt
OPENAI_API_BASE=https://api.xxxxxxxxxxxxxxxxx
或者,你也可以直接在以上代码中的model = ChatOpenAI(model="Qwen/Qwen2.5-7B-Instruct"),这里补充好缺失参数。
这样一个简单的例子就完成了,回看流程无非就是:定义一个状态—>定义一个节点—>把它加到图里—>执行。这就是 LangGraph 的魔力:你可以像搭积木一样,用节点组合出任何规模的智能体系统。无论是简单的对话机器人,还是多工具协作的智能工作流,都可以由节点构成。
四、高质量节点的设计原则
在复杂的智能体系统中,一个好的节点不仅要能正常工作,还要易于测试、组合与维护。
以下是实践中常用的高质量节点设计原则:
-
保持函数纯净:节点应避免副作用,尽量不依赖全局变量。
-
输出最小化:仅返回需要更新的状态键,减少状态污染。
-
明确错误边界:为易失败逻辑配置合理的 RetryPolicy。
-
逻辑拆分:避免一个节点承担多个复杂任务,使用多个节点组合。
-
类型安全:使用
TypedDict或pydantic模型定义状态结构,提升可读性与安全性。
简言之,一个高质量的节点就像一个标准化的组件:职责单一、接口清晰、容易替换。在 LangGraph 的世界中,节点是起点,但绝非终点。
更多推荐

所有评论(0)