news 2026/7/3 23:51:36

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/6/28 18:47:39

小程序计算机毕设之基于springboot+微信小程序的学生定位考勤系统基于微信小程序的学生定位考勤系统(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/6/26 10:15:22

【课程设计/毕业设计】基于微信小程序的学生定位考勤系统基于springboot+微信小程序的学生定位考勤系统【附源码、数据库、万字文档】

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

作者头像 李华
网站建设 2026/7/3 21:45:48

为什么要学习大模型?小白+程序员必看,建议收藏深耕

在科技迭代日新月异的今天,大模型早已不是遥不可及的“黑科技”,而是成为驱动人工智能产业变革的核心引擎,更是程序员突破职业瓶颈、小白抢占时代风口的关键抓手。2025年,大模型的应用已经渗透到各行各业的核心场景,从…

作者头像 李华
网站建设 2026/6/28 23:24:33

基于springboot + vue蘑菇百科系统

蘑菇百科 目录 基于springboot vue蘑菇百科系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue蘑菇百科系统 一、前言 博主介绍:✌️大…

作者头像 李华
网站建设 2026/6/26 10:15:20

国自然基金申请书撰写新思路:如何合理利用AI提高本子竞争力?

最近许多学术同仁询问我:如何合理利用AI辅助撰写国家自然科学基金(NSFC)申请书? 其实,用好AI的前提是严守红线:基金委明令禁止使用生成式人工智能直接生成申报材料。核心原则就一条:AI只能是辅助工具,而不是代写者。 界限在哪?请看这张“红绿灯”清单: 🟢 绿灯区…

作者头像 李华
网站建设 2026/6/26 12:13:08

【计算机毕业设计案例】基于SpringBoot的4S店试驾平台系统微信小程序基于springboot的4S店试驾平台小程序(程序+文档+讲解+定制)

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

作者头像 李华