记一次在langgraph中处理多工具调用结果合并的思路
“ Langgraph多工具调用是一个复杂的运行流程,因此我们需要状态图来进行处理。”【AI大模型教程】
在前面的文章中有讲过Langgraph中有一个很重要的概念就是——State状态,其本质是一个数据结构,并活跃在Langgraph的整个生命周期。
在Langgraph的节点中有三个重要参数,state-状态,config-配置和runtime运行时状态;state中用来保存智能体执行过程中的参数,而config用来传递一些外部参数,如用户id等。
但在官方案例中,state中只用一个MessageState状态对象来保存运行过程中的参数;但在一些特殊的业务场景中,仅仅一个参数是远远不够的;因此,langgraph官方提供了自定义状态参数,方便用户扩展。
Langgraph自定义状态
作者目前的业务场景是使用智能体来优化RAG系统,因此需要使用工具从多个不同的维度对数据进行召回;但召回的数据可能存在一些重复,或需要进行数据清洗。
因此,就需要在工具节点之后增加一个数据合并的节点;但这里有个问题就是,怎么获取到工具调用的结果?
因为智能体中提供了多个工具,并且使用哪些工具完全是由模型自身决定的,不存在人为干涉,因此每次调用的工具数量都是动态的;而且调用工具的结果会被按顺序保存在messages中。
所以,这里就有一个问题,怎么获取到最近一次多个工具的调用结果?
因为这里有两个问题,一是调用工具的数量不固定,因此我们不知道结果列表中有几个工具调用;其次,在多轮对话中,结果列表中会存在很多工具执行的结果;而我们只需要最后一次的工具执行结果。
说起来可能有点绕,但事实就是如此。
所以,首先我们要解决我们这轮对话调用了哪些工具?
第一中方法是在状态中加入一个工具调用数量的参数,然后在调用工具时,记录工具调用的数量;然后每次从结果列表中获取最后几个工具的调用结果。
而另一种方式是,获取工具调用结果的ID,然后通过遍历结果列表的工具项,从中获取执行结果;但不论怎么样,我们都需要记录每次对话执行了哪些工具。
而这只能通过状态来实现,在状态中加入一些自定义参数来保存执行工具的信息;然后再从这些工具执行结果中获取数据,并进行处理,如合并,去重等。