news 2026/9/16 8:27:39

LangGraph--Graph API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangGraph--Graph API

1. 核心概念

LangGraph 的设计理念是 “Nodes 做工作,Edges 决定流程”。

1.1 Graph

  • 图是整个工作流的抽象。执行图意味着节点间消息的传递和状态更新。

  • 图采用 message passing 的方式,每个节点处理完状态后,将更新沿边发送到下一个节点。

  • 图的执行分为 super-step(超步):

    • 同一超步中的节点可并行执行。
    • 不同超步顺序执行。
    • 节点在收到消息前是inactive,收到消息后变为active
    • 图执行结束条件:所有节点inactive且无消息在传输。

1.2 State(状态)

  • 状态是图的共享数据结构,记录当前工作流的快照。

  • 由 schema 和 reducer 组成:

    • schema:定义状态字段,可以使用TypedDictdataclassPydantic BaseModel
    • reducer:定义状态更新逻辑。默认覆盖,可自定义函数(如operator.add叠加列表)。
1.2.1 多 schema 支持
  • 图的内部状态可以有多个 schema:

    • OverallState:完整状态
    • InputState/OutputState:输入输出子集
    • PrivateState:内部节点通信状态
  • 节点可以读写整个OverallState,也可以写入子状态PrivateState

1.2.2 Reducers 示例
fromtypingimportAnnotatedfromtyping_extensionsimportTypedDictfromoperatorimportaddclassState(TypedDict):foo:intbar:Annotated[list[str],add]# 使用 reducer 叠加
  • 默认 reducer 是 覆盖(overwrite)
  • 可用Overwrite强制覆盖,不使用 reducer。
  • add_messages是处理消息列表状态的专用 reducer(处理更新和追加)。

1.3 Nodes(节点)

  • 节点是执行逻辑的函数,接收stateconfigruntime三个参数。

  • 可以是同步或异步函数。

  • 节点内部可调用 LLM 或普通函数逻辑。

  • 节点函数可以返回:

    • 更新状态字典{key: value}
    • Command对象(同时更新状态和控制流)
  • 内置节点:

    • START:图的入口节点
    • END:图的终止节点
节点示例
fromlanggraph.graphimportStateGraph,START,ENDdefnode_a(state):return{"foo":"bar"}graph=StateGraph(dict)graph.add_node("node_a",node_a)graph.add_edge(START,"node_a")graph.add_edge("node_a",END)
节点高级特性
  • 缓存(Caching):基于输入缓存节点结果。
  • runtime context:传递非状态信息(如数据库连接或模型配置)。
  • 递归控制:通过config["metadata"]["langgraph_step"]获取当前超步计数,可主动或被动处理递归限制。

1.4 Edges(边)

  • 边控制图的流向和条件。

  • 边类型:

    • Normal Edge:固定连接节点
    • Conditional Edge:根据routing_function(state)动态选择下一节点
    • Entry Point:用户输入进入的第一个节点
    • Conditional Entry Point:动态选择入口节点
Conditional Edge 示例
defroute(state):return"node_b"ifstate["foo"]=="bar"else"node_c"graph.add_conditional_edges("node_a",route)
Command 对象
  • 将状态更新与控制流合并。
fromlanggraph.typesimportCommanddefmy_node(state):returnCommand(update={"foo":"bar"},goto="node_b")
  • 可用于:

    • 子图跳转
    • 人工干预(Human-in-the-loop)
    • 动态状态更新与路由

1.5 Send

  • 用于动态生成节点和状态,支持 Map-Reduce 模式。
fromlanggraph.typesimportSenddefcontinue_to_jokes(state):return[Send("generate_joke",{"subject":s})forsinstate["subjects"]]

2. 消息(Messages)

  • 常用于聊天应用,将消息列表存入状态。
  • 推荐使用add_messagesreducer 处理消息列表。
  • MessagesState提供了预定义状态结构{"messages": list[AnyMessage]}
消息更新示例
fromlanggraph.graphimportMessagesStatefromlanggraph.graph.messageimportadd_messagesclassState(MessagesState):documents:list[str]

3. 运行时(Runtime)

  • Runtime对象在节点中传递上下文信息。

  • 可传递:

    • 用户信息
    • 模型选择
    • 数据库连接等
示例
@dataclassclassContext:user_id:strdefnode_with_runtime(state,runtime:Runtime[Context]):print(runtime.context.user_id)

4. 图的构建与执行

4.1 StateGraph

  • 核心类,负责图的管理。

  • 支持:

    • 添加节点add_node
    • 添加边add_edge,add_conditional_edges
    • 设置入口set_entry_point
    • 设置终止节点set_finish_point
    • 编译.compile()
    • 执行.invoke(inputs)

4.2 Graph Compilation

  • 必须在执行前调用.compile()

  • 编译会:

    • 检查节点完整性(无孤立节点)
    • 设置缓存、断点
    • 准备状态通道和 reducer

4.3 Recursion / 超步限制

  • 默认递归限制为 25 步
  • 可通过invoke(config={"recursion_limit": N})修改
  • 可以通过config["metadata"]["langgraph_step"]访问当前步数,支持 主动处理 递归限制。

5. 图迁移(Graph Migrations)

  • 支持修改节点、边和状态字段

  • 对于中断的线程:

    • 允许添加新节点和边
    • 不允许删除或重命名节点(可能引发错误)
  • 状态兼容:

    • 新增或删除键向前向后兼容
    • 修改类型不兼容可能导致旧线程出错

6. 可视化(Visualization)

  • 支持图可视化,便于理解复杂工作流
  • 官方文档提供内置方法和指南

7. 总结

LangGraph Graph API 提供了:

模块功能
State管理图的共享数据,支持多 schema 和 reducer
Node执行逻辑,支持状态更新、Command、缓存、runtime context
Edge控制流,可固定、条件、动态或入口
Messages用于存储聊天记录和其他序列化消息
Send / Command支持 Map-Reduce 或动态控制流
Runtime提供节点执行上下文,不属于状态
Recursion / Metadata超步控制与调试信息
Graph Compilation检查图结构,准备执行,支持缓存
Migration / Visualization动态修改图结构与状态,图形化展示
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 3:18:44

免疫检查点抗体如何成为肿瘤免疫治疗的基石原料?

一、免疫检查点如何调控T细胞免疫应答的双向平衡?T细胞的有效激活和功能执行是适应性免疫应答清除病原体和异常细胞(如肿瘤细胞)的核心。然而,这一过程并非毫无约束,它受到一系列精密调控分子的严格把控,这…

作者头像 李华
网站建设 2026/9/16 2:44:27

BSHM镜像实测:人像抠图效果超出预期

BSHM镜像实测:人像抠图效果超出预期 你有没有遇到过这样的情况:想给一张人像照片换背景,却发现普通抠图工具总在头发丝、透明纱裙、飘动发丝这些细节上“翻车”?边缘毛躁、颜色溢出、半透明区域丢失……这些问题让很多设计师和内…

作者头像 李华
网站建设 2026/9/12 11:37:48

2025年Vue3开源后台管理系统全面复盘:十大顶级项目分析与选型指南

助力开发者快速选型,打造企业级中后台前端架构随着前端技术的飞速发展,Vue3 作为当前最主流的现代化前端框架之一,凭借其组合式 API、高性能渲染、优秀的 TypeScript 支持等特性,已成为中后台管理系统开发的首选技术栈。本文将全面…

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

为什么你的“炒股经验”正在让你亏钱?一个残酷的真相

如果你还想像过去那样,靠着所谓的“经验”和感觉去做短线交易,那么用今天市场的话来说,无异于“找死”。 你是否也常常感到困惑:为什么现在炒股赚钱,似乎比以前难多了?明明还是那些熟悉的K线图&#xff0c…

作者头像 李华
网站建设 2026/9/14 8:36:03

MyEMS:开源赋能,构筑智慧能源管理新生态

在“双碳”目标引领与数字化转型浪潮的双重驱动下,能源管理的精细化、智能化已成为企业降本增效、实现可持续发展的核心诉求。传统能源管理模式因数据割裂、分析滞后、运维复杂等问题,难以适配新时代的能源管理需求。而MyEMS作为一款成熟的开源能源管理系…

作者头像 李华
网站建设 2026/9/14 8:36:04

探索Flow3d 11.2技术:激光送粉在增材制造FDM与激光熔覆中的应用

Flow3d11.2 激光送粉 增材制造FDM 激光熔覆 。激光熔覆的兄弟们注意了!Flow3d11.2这次更新直接把金属增材的模拟buff叠满了。今天咱们不整虚的,直接手撕几个关键参数配置。就拿激光送粉来说,这个粉末轨迹模拟能把人逼疯——我上周刚用Python…

作者头像 李华