news 2026/4/18 5:17:45

LangGraph--CompiledStateGraph

作者头像

张小明

前端开发工程师

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

一、类的定位与特点

CompiledStateGraph是一个可运行的智能体工作流,支持:

功能描述
有状态(State)所有节点共享一个 state schema
自动调度框架决定下一个要执行哪个节点
工具调用支持自动判断何时调用 ToolNode
条件分支根据 state 或 judge 函数决定路线
Streaming 输出支持部分生成(如大模型 token 流)
异步执行适合 Web API、服务端执行
Checkpoint错误恢复、回放、持久化
人类参与支持 Human-in-the-loop

二、完整方法(系统结构化总结)

我按照使用频率和逻辑把所有方法分成五类。

方法分类总览

① 执行类(核心运行)

方法说明
invoke同步执行,输入 → 输出
ainvoke异步执行(Web API 场景推荐)
stream同步流式执行
astream异步流式执行(最常用)

② 回放 / 检查点 / 状态类

方法说明
get_state获取执行中的状态(含 memory / checkpoint)
get_subgraphs获取子图(如工具子图)

③ Streaming 事件类

方法说明
astream_events异步事件流(比 astream 更底层)
astream_log记录执行日志(包含 token / 工具调用)
astream_final仅监听最终输出

④ 调度、边控制类

方法说明
_execute_graph内部方法,执行图(你一般不用手动调用)
_get_iterator内部迭代器,为流式输出服务

⑤ 工具相关方法

方法说明
get_tools获取工具节点信息
list_tools返回可调用工具

三、核心方法详解

下面我会依次解释最关键的几个方法,并附带对应 demo。

1. invoke(input) → 同步一次性执行

适用于:

  • 简单流程
  • 不需要流式输出
  • 不需要异步

示例

result=app.invoke({"query":"你好"})print(result)

特点

  • 等所有节点执行完才返回
  • 返回最新的完整 state

2. ainvoke(input) → 异步执行

适合:

  • Web API(Flask / FastAPI)
  • LangServe
  • 高并发场景

示例

result=awaitapp.ainvoke({"query":"你好"})

3. stream(input) → 同步流式执行(逐步输出)

适用于:

  • 终端应用
  • 模型回答长文本时想边生成边显示

示例

forstepinapp.stream({"query":"写一首诗"}):print(step)

4. astream(input) → 异步流式执行

适用于:

  • WebSocket / SSE
  • 前端实时输出
  • 前后端分离部署

示例

asyncforeventinapp.astream({"query":"写一个优美的句子"}):print(event)

输出结构

每个 event 是:

{"node":"某个节点名","state":{...当前 state...},"event":"node_end / tool_start / tool_end / token"等等}

高级方法:astream_events

比 astream 更底层,会输出更详细的事件,包括:

  • token 级别输出
  • 工具调用开始/结束
  • 节点切换
  • 状态更新

示例

asyncforeventinapp.astream_events({"query":"天气如何"}):print(event['event'],event.get('data'))

四、完整 demo

这是一个综合案例,包含:

  • state schema
  • step1 → 条件判断 → OK/FAIL
  • 工具调用节点 ToolNode
  • Streaming 输出

① 构建图结构

fromlanggraph.graphimportStateGraph,MessagesStatefromlanggraph.prebuiltimportToolNode,tools_condition# ======== 定义 State ========classMyState(MessagesState):x:int=0result:str=""# ======== 定义节点逻辑 ========defstep1(state:MyState):new_x=state["x"]+3return{"x":new_x}defok(state:MyState):msg={"role":"assistant","content":"检测通过,执行工具"}return{"result":"通过检查","messages":state["messages"]+[msg]}deffail(state:MyState):msg={"role":"assistant","content":"检测失败,执行工具"}return{"result":"未通过检查","messages":state["messages"]+[msg]}# 工具(模拟)defadd_tool(value:int):""" 加 10 的工具函数。 参数: value (int): 输入数值。 返回: int: 输入值加 10。 """returnvalue+10tools=[add_tool]tool_node=ToolNode(tools)# judge 函数defjudge(state):return"OK"ifstate["x"]>5else"FAIL"

② 构建流图并编译

graph=StateGraph(MyState)graph.add_node("step1",step1)graph.add_node("OK",ok)graph.add_node("FAIL",fail)graph.add_node("tool",tool_node)graph.set_entry_point("step1")# 条件分支graph.add_conditional_edges("step1",judge,{"OK":"OK","FAIL":"FAIL"})# 最后统一走工具节点graph.add_edge("OK","tool")graph.add_edge("FAIL","tool")# 编译图app=graph.compile()

③ astream 流式运行

asyncforchunkinapp.astream({"messages":[],"x":2}):print(chunk)

输出示例(结构化)

{'step1': {'x': 5}} {'FAIL': {'result': '未通过检查', 'messages': [{'role': 'assistant', 'content': '检测失败,执行工具'}]}} {'tool': {'messages': []}}

五、场景级示例

① Web API 示例:Flask + astream

fromflaskimportFlask,request,Responseimportjsonimportasyncio app_server=Flask(__name__)@app_server.route("/run",methods=["POST"])defrun_graph():data=request.jsonasyncdefgenerate():asyncforeventinapp.astream(data):yieldjson.dumps(event,ensure_ascii=False)+"\n"returnResponse(generate(),mimetype='text/event-stream')

② Token 级事件监听(LLM streaming)

asyncforeinapp.astream_events({"query":"给我讲一个故事"}):ife["event"]=="token":print(e["data"],end="")

③ 获取执行状态

state=app.get_state()print(state.values)

六、总结

类别方法用途
执行invoke / ainvoke完整执行一次
流式stream / astream边执行边输出
事件astream_events更细粒度事件
工具list_tools查看工具
状态get_state获取当前状态
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 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 六、工…

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

国标GB28181视频监控平台EasyCVR构建通信基站全场景的智慧安防体系

随着5G网络的规模化部署和万物互联时代的到来,通信基站作为网络传输的核心枢纽,数量不断增长,覆盖范围延伸至城市楼宇、偏远山区、公路沿线等各类复杂场景。然而,传统基站运维管理模式面临着效率低、响应慢、成本高等挑战。 国标…

作者头像 李华