news 2026/7/2 20:29:19

2-LangGraph-Graph核心API-图和状态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2-LangGraph-Graph核心API-图和状态

文章目录

  • GraphAPI之Graph(图)
    • 定义
    • 核心
    • 构建流程
  • GraphAPI之State(状态)
    • 定义
    • 图的schema
    • 图的Reducer
    • 最佳实践建议

GraphAPI之Graph(图)

定义

  • 图是一种由节点和边组成的用于描述节点之间关系的数据结构,分为无向图和有向图。
  • 有向图是带有方向的图,LangGraph通过有向图定义AI工作流中的执行步骤和执行顺序,从而实现复杂、有状态、可循环的应用程序逻辑。

核心

  • State(状态):图的全局上下文。你可以把它理解为图的“共享内存”。所有的节点都可以读取和修改这个状态。
  • Nodes(节点):代表具体的执行步骤(通常是一个 Python 函数或工具)。每个节点接收当前的State,执行某些逻辑(如调用大模型、查询数据库),然后返回更新后的State
  • Edges(边):定义了节点之间的流转方向和控制流。

构建流程

  1. 定义状态(可选,但推荐)
  2. 定义各节点(节点就是方法)
  3. 初始化一个StateGraph实例
  4. 添加节点
  5. 添加边(将所有的节点连接起来)
  6. 编译图
  7. 执行工作流
from typingimportTypedDictfrom langgraph.constantsimportSTART,ENDfrom langgraph.graphimportStateGraph#1.定义State(可选,但推荐)classGraphState(TypedDict):process_data:dict #2.定义节点Nodedefinput_node(graph_state:GraphState)->GraphState:print(f'input_node:{graph_state["process_data"]}')return{"process_data":{"input":"111"}}defprocess_node(graph_state:GraphState)->GraphState:print(f'process_node:{graph_state["process_data"]}')return{"process_data":{"input":"222"}}defoutput_node(graph_state:GraphState)->GraphState:print(f'output_node:{graph_state["process_data"]}')return{"process_data":{"output":"333"}}#4.构建图Graphgraph=StateGraph(GraphState)#4.1添加节点 graph.add_node("input_node",input_node)graph.add_node("process_node",process_node)graph.add_node("output_node",output_node)graph.add_edge(START,"input_node")graph.add_edge("input_node","process_node")graph.add_edge("process_node","output_node")graph.add_edge("output_node",END)#5.编译 app=graph.compile()#6.运行 result=app.invoke({"process_data":{"input":"xxx"}})print(result)

GraphAPI之State(状态)

定义

State状态是整个图的基石,图的“共享内存”,类似于全局上下文,所有的节点都能读写这个状态。

在 LangGraph 中,通常使用 Python 的 TypedDict 或 Pydantic 的 BaseModel来定义状态。

方式A:使用TypedDict(最常用、最轻量) from typingimportTypedDictclassMyGraphState(TypedDict):input_query:str generation:str steps_count:int方式B:使用Pydantic(适合需要数据校验、类型转换的复杂场景) from pydanticimportBaseModel,FieldclassMyPydanticState(BaseModel):input_query:str generation:str=""# 提供默认值和校验 steps_count:int=Field(default=0,ge=0)

在LangGraph中,State状态是一个贯穿整个工作流执行过程中的共享数据的结构,代表当前快照,它存储了从工作流开始到结束的所有必要的信息(历史对话、检索到的文档、工具执行结果等)。状态在各个节点中共享,且每个节点都可以修改,状态包含两部分:

- 图的模式(schema) - 规约函数(reducer functions):指明如何把更新应用到状态上。

图的schema

包含:

  • state_schema

定义:图的完整内部状态,包含了所有节点可能读写的字段,必须指定,不能为空

特点:

1. 是图的"全局状态空间" 2. 所有节点都可以访问和写入这个schema中的任何字段
  • input_schema

定义:定义图接受什么输入,是state_schema的子集

特点:

1. 可选参数,如果不指定,默认等于state_schema 2. 限制图的输入接口,只能传入这些字段
  • output_schema

定义:定义图返回什么输出,是state_schema的子集

特点:

1. 可选参数,如果不指定,默认等于state_schema 2. 限制图的输出接口,只返回这些字段

学术上指定3种schema,但实践过程中只使用state_schema即可

图的Reducer

  • 定义

**规约函数决定了节点产生的重新如何作用到State,State中的每个字段都拥有自己的独立规约函数。规约函数有多种类型,如果未显式指定,则默认所有对该字段的更新都会直接覆盖**旧值。

一句话:规约函数就是字段级合并策略,它让节点只需吐出增量,框架负责按规则把增量写入全局状态State

常见合并策略:

  • default:默认,覆盖更新

  • add_messages:消息列表追加

  • operator.add:将元素追加到现有元素中,支持列表、字符串、数值类型的追

  • operator.mul:用于数值相乘

  • 自定义Reducer: 支持用户自定义合并逻辑

  • 案例

from typingimportTypedDict,Listfrom langgraph.constantsimportSTART,ENDfrom langgraph.graphimportStateGraph# 需求:如果未指定reducer函数,默认对该字段进行覆盖行为 #1.定义State# 未指定合并策略reducer,默认覆盖classDefaultReducerState(TypedDict):name:str hobby:List[str]#2.定义节点Nodedefnode_1(state:DefaultReducerState)->dict:print(f'node_1:{state["name"]}')print(f'node_1:{state["hobby"]}')return{"name":"Alice","hobby":["篮球"]}defnode_2(state:DefaultReducerState)->dict:print(f'node_2:{state["name"]}')print(f'node_2:{state["hobby"]}')return{"name":"Bob","hobby":["足球","乒乓球"]}#4.构建图Graphgraph=StateGraph(DefaultReducerState)#4.1添加节点 graph.add_node("node_1",node_1)graph.add_node("node_2",node_2)graph.add_edge(START,"node_1")graph.add_edge("node_1","node_2")graph.add_edge("node_2",END)#5.编译 app=graph.compile()#6.运行 result=app.invoke({"name":"Alice","hobby":["nothing"]})print(result)BN

最佳实践建议

  1. 按需使用 Annotated:只有需要历史留痕(如 messages、logs)或需要累加的字段才加 Reducer,其余字段(如状态开关、临时变量)保持默认的覆盖模式。
  2. 结构清晰:即使使用TypedDict,也尽量为字段写好类型注解,配合 IDE(如 VSCode/PyCharm)的类型推导,编写节点时能极大减少因拼错 key 导致的 Bug。
  3. 不要在节点内直接修改输入:始终通过return {“key”: “value” 的方式让 LangGraph 去更新状态,不要在节点内部做类似state[“list”].append(x) 的原位修改(In-place mutation),这会导致时间旅行(Time Travel)和调试功能失效。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 20:27:39

微信数据解放:三步掌握你的聊天记录解密技巧

微信数据解放:三步掌握你的聊天记录解密技巧 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因为手机更换而丢失珍贵的聊天记录?或是需要查看重要的微信对话却无法访问加密…

作者头像 李华
网站建设 2026/6/27 18:01:23

计算机毕业设计之jsp基于Web的有机蔬菜销售网站的设计与实现

近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,有机蔬菜销售网站利用计算机网络实现信息化管理,使整个有机蔬菜销售网站的发展和服务水平有显著提升。本文拟采用Eclipse开…

作者头像 李华
网站建设 2026/6/27 17:58:39

067、自定义插件开发:API 接口设计、权限声明与发布流程

067、自定义插件开发:API 接口设计、权限声明与发布流程 上周五凌晨两点,我盯着CodeX的插件日志里一行“Permission denied: access to workspace.files”报错,差点把咖啡泼到键盘上。这个自定义插件折腾了三天,明明API文档翻烂了,权限声明也写了,怎么就死活读不到工作区…

作者头像 李华
网站建设 2026/6/27 17:58:18

终极指南:微信聊天记录解密与数据恢复的专业方案

终极指南:微信聊天记录解密与数据恢复的专业方案 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 在数字化沟通时代,微信聊天记录已成为个人数据资产的重要组成部分。当面临设备更换…

作者头像 李华
网站建设 2026/6/27 17:54:50

Joy-Con Toolkit终极指南:如何解锁任天堂手柄的隐藏潜能

Joy-Con Toolkit终极指南:如何解锁任天堂手柄的隐藏潜能 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit 你是否曾经想过让手中的Joy-Con手柄变得更加个性化?或者想要调整手柄的性能以获得…

作者头像 李华
网站建设 2026/6/27 17:54:41

【TEE从入门到精通及实战】61 梯度中毒防御:在SGX enclave中实现鲁棒聚合

开篇,我先讲个真实的故事。去年我帮一家金融科技公司做联邦学习系统,六家银行联合训练风控模型。 系统上线第三天,聚合结果突然异常——模型准确率从87%暴跌到23%。排查发现,其中一家银行的节点提交的梯度全是随机噪声。 更棘手的是,由于我们用了安全聚合(上篇讲的可验…

作者头像 李华