news 2026/4/23 16:11:31

LangGraph--StateGraph

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangGraph--StateGraph

1. StateGraph 是什么?

StateGraph 是一个图构建器,它本身不执行,只负责:

  • 定义状态结构
  • 定义节点逻辑
  • 定义节点之间的顺序 / 条件分支 / 路由
  • 定义上下文 Context
  • 定义输入输出 Schema

⚠️注意:StateGraph 不能直接运行,必须先编译:

compiled=graph.compile()

编译后得到CompiledStateGraph(可执行版本),可使用:

  • .invoke()
  • .ainvoke()
  • .stream()
  • .astream()

2. StateGraph 的核心概念

概念说明
State所有节点共享的可变状态(TypedDict)
Context节点运行时可用的只读上下文,例如 user_id、模型句柄等
Node一个函数,输入 State,返回部分 State
Reducer合并不同节点输出的函数
Edge连接节点执行顺序
Conditional Edge基于某个函数决定下一个节点
Sequence快速链接一串节点

3. 初始化 StateGraph

graph=StateGraph(state_schema=State,context_schema=Context,input_schema=Input,output_schema=Output)

参数说明

参数作用
state_schema(必填)定义 State 的结构与 reducer(TypedDict + Annotated)
context_schema定义 Context 结构(运行时只读)
input_schema定义图的输入结构
output_schema定义最终返回的输出结构

⚠️config_schema 已废弃,改用 context_schema

4. State 的 Reducer

StateGraph 允许多个节点写同一个 key。
写冲突时,使用 Reducer 合并。

例:

defreducer(a:list,b:int):returna+[b]classState(TypedDict):x:Annotated[list,reducer]

节点 A 返回{"x": 1}
节点 B 返回{"x": 2}
→ 自动合并成{"x": [1, 2]}

5. 添加节点 add_node()

节点是图的最小执行单位,接受 State 返回部分 State。

方法签名简化版

add_node(node,# 名称或函数action=None,# 当 node 是字符串时使用defer=False,# 延后执行(收尾逻辑)metadata=None,# 节点元信息input_schema=None,# 节点专用输入schemaretry_policy=None,cache_policy=None,destinations=None)

常用用法

1. 最简单方式

defmy_node(state):return{"x":state["x"]+1}g.add_node(my_node)

2. 自定义节点名称

g.add_node("calc",my_node)

3. 使用 defer(最后执行)

g.add_node("cleanup",cleanup_fn,defer=True)

4. 添加节点后必须连接

g.add_edge(START,"calc")

6. 添加边 add_edge()

add_edge(start_key,end_key)

表示:当 start_key 完成后执行 end_key

单起点

graph.add_edge("A","B")

多起点(等待全部完成)

graph.add_edge(["A","B"],"C")

表示:等 A 和 B 都执行完 → C 才执行。

7. 条件边 add_conditional_edges()

用于“if-else”、“switch-case”。

add_conditional_edges(source="A",path=path_fn,path_map={"yes":"Node1","no":"Node2"})

示例

defrouter(state):return"go"ifstate["x"]>10else"stop"graph.add_conditional_edges("Check",router,path_map={"go":"NextStep","stop":"__end__"})

8. 快速添加序列 add_sequence()

等价于:

A → B → C

graph.add_sequence([nodeA,nodeB,nodeC])

也可命名:

graph.add_sequence([("start",nodeA),("compute",nodeB),("finish",nodeC)])

9. 编译 compile()

编译后才能运行:

compiled=graph.compile()

支持参数

参数作用
checkpointer自动保存中间状态(可暂停/恢复)
cache节点级缓存
interrupt_before某节点前暂停
interrupt_after某节点后暂停
debug打印调试信息
name给编译后的 graph 命名

10. 编译后使用

invoke(同步)

compiled.invoke({"x":1},context={"r":3})

ainvoke(异步)

awaitcompiled.ainvoke(...)

stream(流式执行)

forstepincompiled.stream(...):print(step)

11. 总结

方法用途示例
add_node添加节点g.add_node(“A”, fn)
add_edge添加顺序边g.add_edge(“A”, “B”)
add_conditional_edges条件跳转if A → B 或 C
add_sequence快速构建链式流程g.add_sequence([A, B, C])
compile图编译为可执行图compiled = g.compile()

12. 一个最佳范例

fromtyping_extensionsimportTypedDict,Annotatedfromlanggraph.graphimportStateGraphfromlanggraph.runtimeimportRuntimedefreducer(lst,v):returnlst+[v]classState(TypedDict):x:Annotated[list,reducer]score:intclassContext(TypedDict):r:floatgraph=StateGraph(State,context_schema=Context)defstep1(state,runtime:Runtime[Context]):x_last=state["x"][-1]r=runtime.context["r"]return{"x":x_last*r}defjudge(state):return"OK"ifstate["x"][-1]>5else"FAIL"defok(state):return{"score":100}deffail(state):return{"score":0}graph.add_node("step1",step1)graph.add_node("OK",ok)graph.add_node("FAIL",fail)graph.set_entry_point("step1")graph.add_conditional_edges("step1",judge,{"OK":"OK","FAIL":"FAIL",})compiled=graph.compile()print(compiled.invoke({"x":[2],"score":0},context={"r":3}))
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 18:16:18

基于springboot的救援物资管理系统-计算机毕业设计源码+LW文档

基于SpringBoot的救援物资管理系统 摘要:本文围绕基于SpringBoot的救援物资管理系统展开,阐述了其研究背景意义、需求分析及功能设计。随着灾害事件频发,救援物资管理的重要性日益凸显,传统管理方式存在诸多弊端,该系统…

作者头像 李华
网站建设 2026/4/23 13:16:53

国标GB28181安防监控平台EasyCVR油田油井智能监管体系构建与应用实践

随着油气勘探开发向深层、偏远区域延伸,油田油区呈现出油水井点多面广、管网纵横交错、作业环境复杂等显著特征。传统监控模式已难以适配安全生产、高效运维的核心需求。随着工业物联网与智能视频分析技术的成熟,构建一个统一、智能的远程视频监控平台成…

作者头像 李华
网站建设 2026/4/23 11:45:41

用算数优化算法AOA优化随机森林RF,建立超棒的拟合预测模型

算数优化算法AOA优化随机森林RF的树数和最小叶子数,建立多输入单输出的拟合预测建模。 程序内注释详细,可学习性强,直接替换数据可用。 程序语言为matlab。 直接运行可以出拟合预测图,优化迭代图,特征变量重要性排序图…

作者头像 李华
网站建设 2026/4/23 13:25:46

漏洞挖掘零基础入门:核心概念、分类与学习路径,零基础入门到精通,看这一篇就够了!

一、前言 对于刚接触网络安全的新手而言,漏洞挖掘往往是既神秘又极具吸引力的领域。不少人误以为漏洞挖掘需要极高的编程功底和黑客技术,实则入门阶段更侧重对基础概念的理解和思维模式的建立。本文将从核心定义、漏洞分类、学习路径三个维度&#xff0…

作者头像 李华