如何使用LangGraph(1)

从 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 ==================================

你好,我是一个节点

这个输出可以分成两部分理解:

  1. 第一行是整个图执行后的最终 state
  2. 后面的内容是 pretty_print() 打印出的消息明细

从结果里可以清楚看到:

  • 用户先输入了"你好?"
  • 节点返回了一条 AI 消息"你好,我是一个节点"
  • extra_field 也被更新成了 1

总结

这个最小示例已经把 LangGraph 的核心流程跑通了:

  • 定义状态
  • 传入初始消息
  • 创建节点
  • 组装图
  • 执行图
  • 打印消息结果
  • 导出流程图

如果你刚开始学 LangGraph,建议先把这个最小闭环跑通,再继续扩展到这些方向:

  • 多节点串联
  • 条件分支
  • 循环执行
  • 更复杂的消息状态管理

先把一个节点、一个 state、一次执行理解透,后面再看复杂图结构会轻松很多。

相关推荐
JaydenAI1 小时前
[基于OpenEvals的自动化评估-11]针对Agent对话的评估[下篇]
ai·langchain·agent·evaluation·openevals
Livia要学习2 小时前
Python装饰器
开发语言·python
circuitsosk3 小时前
向量数据库选型与性能压测:Milvus、Pinecone、Chroma在真实业务下的对比
数据库·python·pinecone·milvus·向量数据库·chroma
雾时之林3 小时前
python--字符串
开发语言·python
战略性的菠萝4 小时前
研究生基本功-Python快速入门(一)
python
月光船幽幽4 小时前
门控函数SHS阈值与调制机制解析
人工智能·python·算法
测试19984 小时前
2026全新软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·测试工具·面试·职场和发展·测试用例
Zane19944 小时前
map 比推导式快"是真的吗?一文讲透 map、filter、reduce 与 lambda 的真实性能与设计取舍
后端·python
小白的后端世界4 小时前
LangChain 模型初始化参数详解:从基础配置到企业级实践
java·人工智能·langchain