上一篇给了 StateGraph 五要素全景。这一篇深入第一个——State

State 是图的血液。一个 Agent 跑起来,它的对话历史、当前任务、中间结果,全装在 state 里。节点们通过读写同一个 state 来协作。理解 state 怎么定义、怎么流转,是理解一切 LangGraph 应用的前提。

State 是什么:一个跨节点的共享数据结构

最直白的理解:State 是一张图里所有节点共享的数据结构。每个节点能读它、能改它,改完传给下一个节点。

State 是跨节点共享的数据结构

你可以把 state 想象成一次「对话的上下文对象」——它记录着这次交互从头到现在的所有信息。节点不需要互相传参,都从 state 取数据、往 state 存结果。

State 的典型字段

一个 Agent 的 state 通常包含两类字段:

第一类:消息列表(messages)——这是 state 的核心。对话历史就装在这里,每个节点(调模型、执行工具)都会往里加消息。模型每次被调用,看到的就是这个列表。

第二类:业务字段——和具体任务相关。比如:

字段 装什么 谁来读写
messages 对话历史 几乎所有节点
task 当前任务描述 入口设置,各节点读
docs 已检索到的资料 检索节点写,模型节点读
tool_results 工具执行结果 工具节点写,模型节点读
iteration 当前循环次数 用于控制最大轮次

State 的两类字段

消息列表是通用的(任何对话型 Agent 都有),业务字段是因任务而异的。设计 state 时,先想清这次任务有哪些信息要在节点间传递,就是 state 该有的字段。

为什么消息列表是核心

为什么 messages 这么重要,几乎是每个 state 的标配?

因为模型是无状态的。模型本身不记得上一轮说了什么——它每次被调用,只看你这次传给它的消息列表。所以「Agent 的记忆」,本质上就是维护并不断追加这个 messages 列表,每次调模型时把它整个传过去。

模型无状态,记忆靠维护消息列表

这就是为什么 state 把 messages 放在最中心:它是模型「看到世界」的唯一窗口。第 35-37 篇讲记忆时会展开——所谓记忆,归根到底就是对 messages 这个字段的增删改。

State 怎么流转

一个节点执行时,state 的流转是这样的:

  1. 节点当前 state(拿到 messages、task 等)
  2. 节点做事(调模型、检索、执行工具)
  3. 节点返回更新(比如往 messages 加一条新消息)
  4. 框架按 reducer 规则,把更新合并进 state
  5. 下一个节点拿到更新后的 state

State 的读写流转

注意第 4 步——节点返回的不是「新 state」,而是「更新」。合并成什么样由 reducer 决定(下一篇 Node 会细讲,第 13 篇专讲 reducer)。这种「返回更新而非全量」的设计,让节点只关心自己改了什么,不用管整个 state。

State 设计的一个原则:少即是多

设计 state 时容易犯的错是「什么都往里塞」。但 state 字段越多,节点间的耦合越紧——每个字段都可能被多个节点读写,字段一多,谁改了什么、影响哪里,就难追踪。

一个原则:state 只放「确实需要在节点间传递」的信息。一个信息如果只在一个节点内部用,做成节点内的局部变量,不要进 state。state 是「公共黑板」,不是「垃圾桶」。

收束:State 是协作的媒介

这一篇讲了 State:

  • 它是所有节点共享的数据结构,是图的血液
  • 核心字段是消息列表(messages),业务字段因任务而异
  • 模型无状态,记忆本质是维护 messages
  • 节点返回更新,框架按 reducer 合并
  • 设计原则:只放真正需要跨节点传递的信息

下一篇讲 Node 和 Edge——state 的「读写者」和它们之间的「路」。


关于十三Tech

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

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

十三Tech公众号二维码