news 2026/4/18 15:54:33

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/18 5:17:45

LangGraph--CompiledStateGraph

一、类的定位与特点 CompiledStateGraph 是一个 可运行的智能体工作流,支持: 功能描述有状态(State)所有节点共享一个 state schema自动调度框架决定下一个要执行哪个节点工具调用支持自动判断何时调用 ToolNode条件分支根据 state 或 judge 函数决定路…

作者头像 李华
网站建设 2026/4/18 7:19:45

小程序毕设项目:基于springboot的医院门诊智能预约平台小程序设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/18 8:44:55

2026在线考试软件怎么选?避坑指南一看就会

数字化时代,在线考试早就不是新鲜事了——企业培训要考、机构上课要测、个人自测要用到,可面对市面上五花八门的在线考试软件,很多人都犯了难:功能太多看不懂,价格高低没概念,选贵了浪费,选便宜…

作者头像 李华
网站建设 2026/4/18 7:31:15

Java基于Spring Boot+Vue的博物馆管理系统

这里写目录标题 项目介绍系统实现截图技术栈介绍Spring Boot与Vue结合使用的优势Spring Boot的优点Vue的优点 Spring Boot 框架结构解析Vue介绍系统执行流程Java语言介绍系统测试目的可行性分析核心代码详细视频演示源码获取 所需该项目可以在最下面查看联系方式,为…

作者头像 李华
网站建设 2026/4/18 8:54:43

小程序毕设项目推荐-基于SpringBoot智能在线预约挂号系统微信小程序基于springboot的医院门诊智能预约平台小程序设计与实现【附源码+文档,调试定制服务】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/18 8:46:55

FreeSWITCH Media Bug 框架详解

本文系统性整理 FreeSWITCH Media Bug 的设计理念、核心数据结构、API 使用方式以及典型应用场景,适合 FreeSWITCH / VoIP / 媒体处理 方向的开发者作为参考文档或源码导读。 目录 一、概述 二、核心数据结构 三、标志位说明 四、回调类型 五、核心 API 六、工…

作者头像 李华