LangGraph的运行时(Runtime)功能通过底层类Pregel(借鉴谷歌Pregel图计算模型实现)实现。Pregel负责管理 LangGraph应用程序的执行流程。
编译状态图(StateGraph)或创建 @entrypoint(入口点装饰器)会生成一个Pregel实例,该实例可接收输入并被调用。
本文将从宏观层面讲解运行时系统,并提供直接使用Pregel开发应用程序的操作说明。
注意:Pregel 运行时的命名源自谷歌(Google)的 Pregel 算法 ------ 该算法提出了一种利用图结构进行大规模并行计算的高效方法。
一、概述
在 LangGraph 中,Pregel将 "参与者"(actors)与 "通道"(channels)整合到一个应用程序中。参与者从通道读取数据,并向通道写入数据。Pregel 遵循 Pregel 算法(Pregel Algorithm)/ 批量同步并行模型(Bulk Synchronous Parallel model),将应用程序的执行过程划分为多个步骤。 每个步骤包含三个阶段:
- 规划阶段(Plan):确定本步骤中要执行的参与者。例如,在第一步中,选择订阅特殊输入通道的参与者;在后续步骤中,选择订阅上一步骤中已更新通道的参与者。
- 执行阶段(Execution):并行执行所有选中的参与者,直至所有参与者执行完成、某个参与者执行失败,或达到超时时间。在此阶段,通道的更新对参与者而言是不可见的,直至进入下一步骤。
- 更新阶段(Update):使用本步骤中参与者写入的值更新通道。 重复上述步骤,直至没有选中任何参与者用于执行,或达到最大步骤数。
二、参与者(Actors)
参与者是一个 PregelNode(Pregel 节点)。它会订阅通道(channels),从通道中读取数据,并向通道中写入数据。在 Pregel 算法中,可将其理解为 "参与者" 角色。PregelNode 实现了 LangChain 的 Runnable(可运行)接口。
三、通道(Channels)
通道用于在参与者(PregelNode)之间实现通信。每个通道都包含值类型(value type)、更新类型(update type)和更新函数(update function)------ 更新函数会接收一系列更新内容,并修改已存储的值。通道可用于在不同链条(chain)之间传输数据,也可用于让某个链条在后续步骤中向自身传输数据。LangGraph 提供了多种内置通道,具体如下:
- LastValue(最后值通道):默认通道,存储发送至该通道的最后一个值,适用于处理输入值、输出值,或在步骤间传输数据的场景。
- Topic(主题通道):可配置的发布 - 订阅(PubSub)主题通道,适用于在参与者之间传输多个值,或累积输出结果的场景。可通过配置实现值的去重,或在多个步骤中累积值。
- BinaryOperatorAggregate(二元运算符聚合通道):存储一个持久化的值,更新方式为将二元运算符应用于当前值与发送至通道的每个更新内容,适用于在多个步骤中计算聚合结果的场景;例如:total = BinaryOperatorAggregate(int, operator.add)(定义一个整数类型的聚合通道,通过加法运算符累积值,用于计算总和)。
四、示例
python
from langgraph.channels import LastValue, EphemeralValue
from langgraph.pregel import Pregel, NodeBuilder
node1 = (
NodeBuilder().subscribe_only("a")
.do(lambda x: x + x)
.write_to("b")
)
node2 = (
NodeBuilder().subscribe_only("b")
.do(lambda x: x + x)
.write_to("c")
)
app = Pregel(
nodes={"node1": node1, "node2": node2},
channels={
"a": EphemeralValue(str),
"b": LastValue(str),
"c": EphemeralValue(str),
},
input_channels=["a"],
output_channels=["b", "c"],
)
app.invoke({"a": "foo"})
五、高级API
LangGraph 提供了两种用于创建 Pregel 应用程序的高层级 API,分别是:状态图(StateGraph,即图 API(Graph API))和函数式 API(Functional API)。
状态图(StateGraph,即图 API(Graph API))是一种抽象程度更高的上层抽象,可简化 Pregel 应用程序的创建过程。它支持你定义由节点(nodes)和边(edges)构成的图结构。当你对该图进行编译(compile)时,StateGraph API 会自动为你创建 Pregel 应用程序。
在函数式 API 中,你可以使用 @entrypoint(入口点装饰器)创建 Pregel 应用程序。该入口点装饰器支持你定义一个函数,该函数接收输入(参数)并返回输出(结果)。
详细了解Graph API,请参阅《LangGraph1.0智能体开发:Graph API概念与设计》
详细了解Functional API,请参阅《LangGraph1.0智能体开发:Functional API概念与设计》