news 2026/7/22 3:13:52

langgraph的四种state解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
langgraph的四种state解析

下面我们来深入拆解这段 LangGraph 代码中出现的 四种 State(状态)形式,并结合执行流程说明它们各自的作用、约束与数据流转方式。

1. 四种 State 的定义与角色

① InputState(输入状态)

pythonclassInputState(TypedDict):user_input:str
  • 角色:定义外部调用者向图(Graph)发起请求时必须传入的数据结构。
  • 使用位置:在创建 StateGraph时通过 input_schema=InputState指定。
  • 特点:
    仅描述“入口数据”,不包含图内部产生的中间或最终结果。
    调用 graph.invoke({“user_input”: “My”})时,参数必须兼容 InputState。
  • 与本例关系:初始全局状态中只有 user_input: “My”。

② OutputState(输出状态)

pythonclassOutputState(TypedDict):graph_output:str
  • 角色:定义图执行完毕后返回给外部的结果结构。
  • 使用位置:在创建 StateGraph时通过 output_schema=OutputState指定。
  • 特点:
    对全局状态进行“裁剪”,最终只保留此处声明的字段。
    示例中返回 {‘graph_output’: ‘My name is Lance’}。
  • 与本例关系:即使全局状态还包含 foo、bar、user_input,输出时也被过滤得只剩 graph_output。

③ OverallState(总体状态)

pythonclassOverallState(TypedDict):foo:struser_input:strgraph_output:str
  • 角色:定义整个图内部维护的完整全局状态(即“总状态”)。
  • 使用位置:作为 StateGraph的第一个类型参数:StateGraph(OverallState, …)。
  • 特点:
    理论上应囊括所有节点需要读写的状态字段(本例为了演示故意没放 bar)。
    各节点函数的输入/输出可以只是它的子集,LangGraph 负责合并。
    初始时由 InputState注入(user_input),随后被各个节点逐步填充。
  • 与本例关系:
    初始:{“user_input”: “My”}(foo、graph_output暂缺)
    node_1 写入 foo→ {“user_input”: “My”, “foo”: “My name”}
    node_3 写入 graph_output→ 最终全局状态含三个键(外加临时的 bar)

④ PrivateState(私有/局部状态)

pythonclassPrivateState(TypedDict):bar:str
  • 角色:定义某两个(或多个)相邻节点之间传递的临时数据结构,不属于全局状态的正式 schema。
  • 使用位置:仅作为某些节点的输入输出类型标注(非图级配置)。
    特点:
    用于封装中间计算结果,避免污染 OverallState。
    LangGraph 允许节点返回未在 OverallState中声明的字段,并传递给下一节点(只要下一节点标注接收该结构)。
    最终不会被 OutputState输出。
  • 与本例关系:
    node_2返回 {“bar”: “My name is”}(写入私有状态)
    node_3接收 PrivateState,读取 bar并生成最终输出。

2. 数据流转全过程(结合代码)

python graph.invoke({"user_input":"My"})
步骤节点接收的状态(类型标注)实际可访问的字段返回的状态全局状态变化
START→node_1node_1InputStateuser_input=“My”{“foo”: “My name”}+ foo
node_1→node_2node_2OverallStateuser_input, foo{“bar”: “My name is”}+ bar(私有)
node_2→node_3node_3PrivateStatebar{“graph_output”: “My name is Lance”}+ graph_output
node_3→END输出OutputState仅保留 graph_output

最终输出:

python{'graph_output':'My name is Lance'}

3. 核心设计思想总结

  • 关注点分离

      InputState:对外契约(调用方知道传什么)

        OutputState:对外契约(调用方知道收什么)

          OverallState:对内全景(图作者管理全量状态)

            PrivateState:节点间临时契约(解耦中间逻辑)

          类型驱动:LangGraph 利用 Python 类型标注(TypedDict)在编译期/运行期做状态校验与自动补全提示。

            渐进式状态构建:全局状态从输入开始,经各节点返回的部分状态不断合并,最后按输出 schema 剪裁。

            代码

            此代码取自官方给的demo

            fromtypingimportTypedDictfromlanggraph.graphimportEND,START,StateGraphclassInputState(TypedDict):user_input:strclassOutputState(TypedDict):graph_output:strclassOverallState(TypedDict):foo:struser_input:strgraph_output:strclassPrivateState(TypedDict):bar:strdefnode_1(state:InputState)->OverallState:# Write to OverallStatereturn{"foo":state["user_input"]+" name"}defnode_2(state:OverallState)->PrivateState:# Read from OverallState, write to PrivateStatereturn{"bar":state["foo"]+" is"}defnode_3(state:PrivateState)->OutputState:# Read from PrivateState, write to OutputStatereturn{"graph_output":state["bar"]+" Lance"}builder=StateGraph(OverallState,input_schema=InputState,output_schema=OutputState)builder.add_node("node_1",node_1)builder.add_node("node_2",node_2)builder.add_node("node_3",node_3)builder.add_edge(START,"node_1")builder.add_edge("node_1","node_2")builder.add_edge("node_2","node_3")builder.add_edge("node_3",END)graph=builder.compile()graph.invoke({"user_input":"My"})# {'graph_output': 'My name is Lance'}

            💡 实践中,为了避免混淆,通常建议把所有会被多个节点使用的字段都放进OverallState,而将PrivateState视为可选的精细化工具。本例特意将bar放在PrivateState是为了演示四种形态的共存与区别。

            版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
            网站建设 2026/7/22 3:13:08

            生产级Agent系统的可靠性、安全性与恢复能力实践

            1. Agent系统从实验走向生产的核心挑战三年前我第一次部署Agent系统到生产环境时,遭遇了职业生涯最漫长的72小时——系统在演示环节运行完美,却在真实业务流量下频繁崩溃,错误日志里满是"Session initialization conflicted"和&quo…

            作者头像 李华
            网站建设 2026/7/22 3:12:40

            TI VPFE图像缩放器RZA/RZB寄存器配置实战与避坑指南

            1. 项目概述与核心价值在嵌入式视频处理系统的开发中,图像缩放功能几乎是绕不开的一环。无论是将高分辨率摄像头采集的画面适配到小尺寸的显示屏上,还是为了节省存储空间和传输带宽对视频流进行下采样,亦或是为了满足特定算法对输入尺寸的要求…

            作者头像 李华
            网站建设 2026/7/22 3:11:33

            NGINX ACME模块实现HTTPS证书自动化管理

            1. NGINX ACME模块核心价值解析在HTTPS已成为标配的今天,证书管理却始终是运维人员的痛点。传统方案如Certbot需要额外守护进程和定时任务,而NGINX官方ACME模块的出现彻底改变了游戏规则。这个原生支持的模块允许NGINX直接与Lets Encrypt等CA机构交互&am…

            作者头像 李华
            网站建设 2026/7/22 3:10:51

            电源国产化优选 EG27322 单通道大功率驱动芯片,降本增效 告别缺货溢价 助力新能源设备国产化

            一、芯片概述 高频开关电源、光伏逆变、电机驱动、GaN 快充赛道高速迭代,工程师长期面临三大痛点:控制器 3.3V PWM 无法直驱功率管、小电流驱动开关损耗高、进口驱动芯片交期长溢价严重。屹晶微电子推出EG27322 单通道 8A 高速低侧驱动芯片,宽…

            作者头像 李华
            网站建设 2026/7/22 3:07:57

            RocketMQ分布式消息中间件实战与性能优化

            1. RocketMQ核心定位与场景价值RocketMQ作为阿里巴巴开源后捐赠给Apache的分布式消息中间件,已经成为金融级可靠性要求的首选方案。我在实际生产环境中观察到,其核心优势在于同时满足高吞吐量与低延迟这两个看似矛盾的需求——单机可支持10万级TPS的同时…

            作者头像 李华
            网站建设 2026/7/22 3:05:08

            Emby高级功能深度解锁:打造全功能个人媒体中心的实战指南

            Emby高级功能深度解锁:打造全功能个人媒体中心的实战指南 【免费下载链接】emby-unlocked Emby with the premium Emby Premiere features unlocked. 项目地址: https://gitcode.com/gh_mirrors/em/emby-unlocked 在个人媒体中心构建领域,Emby高级…

            作者头像 李华