
关于langgraph中的数据传递——使用State和config传递数据 原创
“ 数据通讯是系统开发中的重要环节,而Langgraph有其特有的设计哲学。”
在项目开发中,数据传递一直是一个很重要的环节,毕竟任何系统的开发逻辑最终的目的都是实现数据的有效操作,包括查询,修改,新增等。
而在大模型应用场景中,数据的传递又是什么样的呢?怎么解决?
langgraph中的数据传递
在Langgraph中State是贯穿整个生命周期的数据结构,其作用就是用来保存智能体执行过程中的数据;因此,在Langgraph中的几个重要组件中都会使用到State中的数据,除了边之外。
在Langgraph的节点中,可以接收一个State参数,其中保存有用户的输入,模型执行的结果,工具调用的结构等等多种数据。然后在节点中就可以通过state获取执行过程中的数据进行下一步处理。
然后节点执行完成之后,把执行结果再次保存到State中,之后传递到下一个节点。
当然,在节点中操作State是一个很正常的操作,那怎么在工具中获取到这些参数呢?
这里的工具指的不是工具节点,因为工具节点的本质还是节点,因此可以正常对State进行操作;但在@tool注解实现的具体工具方法里,能获取到Sta te中的参数吗?
举例来说,你的业务场景中需要在上一个节点先对请求参数进行处理,然后再工具节点中使用这个参数;那么怎么把上一个节点中的数据传入到具体的工具中?
这个就要用到Langgraph提供的,InjectedState参数,可以在具体的工具中通过InjectedState获取参数。
params: Annotated[list, InjectedState("params")
解决了节点和工具中的通讯问题,那么再把我们指定的值传入到智能体中呢?毕竟类似于user_id等参数我们希望的是能够根据不同的用户进行区分,而不是由模型来生成用户参数;所以,面对这种参数,怎么进行通讯?
在Langgraph中也提供了固定参数的传参,使用的是RunnableConfig,在调用智能体时,只需要传入config参数,即可在智能体中的任何地方获取此参数。
如下所示:
如下,在节点中通过config: RunnableConfig即可获取到用户传入的数据。
有了这些数据通讯之后,就可以根据不同的执行结果进行相应的处理。
但在Langgraph中使用State进行数据通讯还一个需要注意的点是,State有多种处理方式,比如说追加,覆盖等;这些不同的处理方式会获得不一样的结果。
如在messages中一般情况下会使用追加的方式,也就是把每个节点的执行结果追加到messages列表中,这样就可以保存整个智能体的整个生命周期的执行过程。
当然,可能存在一些公共参数,不同的节点执行过后需要覆盖掉之前的值,而这个就可以使用覆盖的方式进行处理;而在Langgraph中负责处理这部分功能的是Reducers函数。
Reducers 是理解节点更新如何应用于 State
的关键。State
中的每个键都有其自己的独立 reducer 函数。如果未明确指定 reducer 函数,则假定对该键的所有更新都应覆盖它。
本文转载自AI探索时代 作者:DFires
