从 0 跑通 LangGraph:用一个最小示例理解 State、消息流转和流程图
LangGraph 适合把 LLM 应用拆成多个步骤,每个步骤负责一件事,状态在图里流转。
这篇文章不讲复杂业务,只用一个最小示例,把 StateGraph、节点执行、消息流转、结果输出和流程图导出一次跑通。
先看效果
运行后,终端输出如下:
text
{'messages': [HumanMessage(content='你好?', additional_kwargs={}, response_metadata={}), AIMessage(content='你好,我是一个节点', additional_kwargs={}, response_metadata={}, tool_calls=[], invalid_tool_calls=[])], 'extra_field': 1}
================================ Human Message =================================
你好?
================================== Ai Message ==================================
你好,我是一个节点
流程图如下:

从图里可以看到,流程非常简单:start -> node -> end。
这个例子虽然简单,但已经把 LangGraph 里最核心的几件事串起来了:
- 定义状态
- 传入初始消息
- 在节点里处理状态
- 返回新的状态
- 输出图结构
完整代码
python
from langchain_core.messages import AnyMessage, AIMessage, HumanMessage
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
# 图里传递的数据
class State(TypedDict):
# 消息列表
messages: list[AnyMessage]
# 示例字段
extra_field: int
# 节点函数
def node(state: State):
# 取出消息列表
messages = state["messages"]
# 新消息
new_message = AIMessage("你好,我是一个节点")
# 返回更新后的 state
return {
"messages": messages + [new_message],
"extra_field": 1,
}
# 创建图
graph = StateGraph(State)
# 加节点
graph.add_node(node)
# 入口节点
graph.set_entry_point("node")
# 编译图
graph_builder = graph.compile()
# 执行图
result = graph_builder.invoke({
"messages": [HumanMessage("你好?")],
"extra_field": 0,
})
print(result)
# 逐条打印消息
for message in result["messages"]:
message.pretty_print()
# 生成 PNG
png_bytes = graph_builder.get_graph().draw_mermaid_png()
# 保存图片
with open("graph.png", "wb") as f:
f.write(png_bytes)
代码拆解
1. State 是状态定义
TypedDict 用来定义字典结构。这里的 State 表示图在节点之间传递的数据:
messages:消息列表extra_field:示例字段
2. node 是一个节点
节点就是图里的一个处理步骤。
这个节点做了两件事:
- 取出原来的消息列表
- 追加一条新的
AIMessage
最后返回新的 state 片段。
这里可以把 node 理解成一个最小的处理单元。输入是当前状态,输出是更新后的状态。
3. StateGraph(State) 创建图
这一步是在告诉 LangGraph:这张图的状态结构就是上面的 State。
4. set_entry_point("node") 指定入口
图运行时会先从 node 开始执行。
5. invoke() 执行图
这里传入初始 state:
python
{
"messages": [HumanMessage("你好?")],
"extra_field": 0,
}
这里和最基础的空输入不同,我们先放了一条 HumanMessage("你好?")。
这样图执行完之后,messages 里会有两条消息:
- 一条是初始输入的用户消息
- 一条是节点新追加的 AI 消息
这也更容易看出 LangGraph 里的消息是怎么在状态里流转的。
6. pretty_print() 打印消息
除了直接 print(result),代码里还加了这段:
python
for message in result["messages"]:
message.pretty_print()
它的作用很简单:把消息一条条打印出来,终端里更容易看清是谁说的话。
7. draw_mermaid_png() 导出结构图
这一步会把图结构渲染成 PNG,并保存为当前目录下的 graph.png 。

最终输出
程序执行后,结果如下:
text
{'messages': [HumanMessage(content='你好?', additional_kwargs={}, response_metadata={}), AIMessage(content='你好,我是一个节点', additional_kwargs={}, response_metadata={}, tool_calls=[], invalid_tool_calls=[])], 'extra_field': 1}
================================ Human Message =================================
你好?
================================== Ai Message ==================================
你好,我是一个节点
这个输出可以分成两部分理解:
- 第一行是整个图执行后的最终 state
- 后面的内容是
pretty_print()打印出的消息明细
从结果里可以清楚看到:
- 用户先输入了"你好?"
- 节点返回了一条 AI 消息"你好,我是一个节点"
extra_field也被更新成了1
总结
这个最小示例已经把 LangGraph 的核心流程跑通了:
- 定义状态
- 传入初始消息
- 创建节点
- 组装图
- 执行图
- 打印消息结果
- 导出流程图
如果你刚开始学 LangGraph,建议先把这个最小闭环跑通,再继续扩展到这些方向:
- 多节点串联
- 条件分支
- 循环执行
- 更复杂的消息状态管理
先把一个节点、一个 state、一次执行理解透,后面再看复杂图结构会轻松很多。