上一篇讲了 state——共享的数据。这一篇讲它的两个搭档:Node(步骤)Edge(连线)。state 是数据,node 是处理数据的动作,edge 是动作之间的路。三者合起来,图就能跑了。

Node:一个处理步骤

上一篇已经提过,node 本质是一个函数:读 state、做事、返回更新。这里补充几个工程上的要点。

每个 node 职责单一。一个 node 只干一件事:调一次模型、做一次检索、执行一个工具、做一个判断。不要在一个 node 里塞太多——和写函数一个道理,职责单一才好维护、好测试。

node 的输入输出是约定好的。输入是当前 state(或它的部分),输出是要更新的字段。你不用自己手动合并 state,框架按 reducer 帮你做。

Node 的职责与输入输出约定

常见的 node 类型:

类型 干什么 返回什么
模型节点 调 LLM 生成 新的 ai 消息
检索节点 查知识库 docs 字段更新
工具节点 执行工具 tool 消息
判断节点 决定走哪条路 通常不直接改 state,配合条件 edge

Edge:节点间的路

Edge 决定「这一步跑完,下一步去哪」。LangGraph 里 edge 有几种连法:

普通 edge:固定下一步。A 跑完必定去 B。用在「确定的顺序」上。

条件 edge:根据当前 state 动态决定下一步。A 跑完,可能去 B,也可能去 C,取决于 state 里的某个值。这是做分支的关键,下一篇(12)专门讲。

入口和出口:图有一个 START(入口)和一个 END(出口)。START 连第一个 node,某个 node 连到 END 就表示「到这里结束」。

Edge 的三种连法

一个最小图的完整定义

把 node 和 edge 组合起来,定义一个最小图大概是这样(伪代码示意,重在结构):

1. 定义 state(有哪些字段)
2. 定义几个 node 函数
3. 创建 graph,把 node 加进去
4. 连 edge:
   - START → 第一个 node
   - node 之间用普通或条件 edge 连
   - 最后一个 node → END
5. 编译 graph,得到可运行的对象

定义一个最小图的步骤

注意最后一步「编译」——图定义好后要编译成可运行对象,编译时可以挂上 checkpointer(持久化,第 14 篇讲)。编译后得到的对象,调用方式就和 Runnable 一样:graph.invoke(输入)

跑起来的样子

图跑起来时,是这样一个循环:

  1. 从 START 出发,进第一个 node
  2. node 执行,读 state、返回更新,合并进 state
  3. 看 edge,决定下一个 node
  4. 到了下一个 node,重复 2-3
  5. 直到某条 edge 指向 END,结束

图跑起来的循环

这个循环和第 9 篇讲的五要素协作是一致的——node 是动作,edge 是路由,state 在其间流转,super-step 是每一轮。

Node 与 Edge 的分工

一个容易混淆的点:判断逻辑放 node 里还是 edge 里?

简单原则:「做什么」放 node,「去哪」放 edge

  • 「调用模型」「执行工具」——这是做什么,是 node 的职责
  • 「根据结果决定下一步去检索还是直接回答」——这是去哪,是条件 edge 的职责

把判断逻辑放对地方,图的意图才清晰。如果发现一个 node 里写了一堆「如果...就跳到某节点」的逻辑,多半是把 edge 的活塞进 node 了,应该拆成条件 edge。

收束:node 是动作,edge 是路

这一篇讲了 Node 和 Edge:

  • Node 是处理步骤,职责单一,输入 state 输出更新
  • Edge 有普通(固定)、条件(动态)、入口出口三种
  • 定义图:定 state → 写 node → 连 edge → 编译
  • 分工原则:做什么放 node,去哪放 edge

下一篇讲条件 edge 的核心用法——动态路由,这是图能做「根据情况走不同路」的关键。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。我相信 AI 是程序员的最佳搭档。

如果你想跟完这套「图解 LangChain」,欢迎关注公众号 「十三Tech」。全系列 42 篇,会按认识基础、LangGraph 状态机、Agent 与 middleware、RAG 检索、Tools/MCP/记忆、生产化收束这条线更新。

十三Tech公众号二维码