30.LangGraph快速入门与底层原理剖析
最近agent应用开发特别火爆。很多同学出去面试大模型应用开发岗位的时候,经常被问到agent的一些开发是怎么样的。如何快速的去开发一个agent的一些能力。比如说像调用工具执行,然后做一些总结,怎么来实现。今天的话我们就给大家来分享一下,一款非常高效的agent的应用开发框架,叫这个long graph,我们来讲它的一个快速入门,然后它的一个底层原理。
好,首先的话我们来讲一下这个long graph的一个基础概念。就是long graf的话,它是一个面向构建具有大模型的有状态,多角色的应用程序的一个库,它可以去用来去开发一些agent的智能体。并且的话他还支持多agent,也就是这个多代理工作流。相当于他是用这个工作流的这种方式来做一个agent的一个应用开发。然后它对比其他的,像一些大模型的框架相比,它的一个核心优势在于什么呢?就是一个循环,就是它这个里面整个相当于是一个工作流,是一个闭环,它可以不断的去做一个循环,然后的话就是它的一个可控性,比如说他的一个一些协作多个agent之间他是怎么样去控制的,任务之间怎么样去交互的。比如说我有两个agent的任务,一个是去做搜索天气的,第二个是做一些旅行规划的那这两个agent它之间怎么来去做一个协作呢?
好,然后是持久性。持久性的话分两块。第一块的话就是他的一个工作的时候,内部之间的数据传递,怎么样做一些通信,怎么样做一些存储。然后外部的一些数据,比如说我要做一些向量数据库的一些存储,然后还有一些业务数据的一些存储,那这个东西怎么来实现?这个就是它的一个持久性。
Long graf的话其实对于大多数代理架构的话,它是作为一种非常底层的一个框架。它提供了很多应用程序的一些流程,还有状态的一些精细控制,这个对于咱们去创建一个可靠的agent来说非常重要。然后他可以做一些人机交互,比如说我们跟大模型交互,那大模型这时候比如说需要等待用户去返回一个什么样的一个提示,比如说大模型要问你一下,征得用户的一个同意,同意比如说敲个一,不同意敲个2。这个涉及到一些人机交互,说白了就是咱们这个agent执行的时候,他可以打一个断点。这个断点就是要等用户做一个反馈,他拿到这个反馈之后,他的agent任务才会去往下执行。这个是一个比较高级的叫人机交互的一个功能。
然后的话就是内存功能这一块,它是采用了一种设计,叫check point。这个的话叫做检查点,就跟咱们玩游戏一样,存档。那我们玩第一关到第二关的时候,第二关可以继承第一关的它的一个数据,那这个agent a long grave在这一块的实现的话,他就是采参考了这种思想,叫存储点然后我们的这个记录的话就可以一直保存在agent执行的每一个环节上面,那这个long grave的话,它是相对于long chain独立出来的一个高级库,它是什么呢?专门用来做复杂的一些任务的一些场景的。就是我们的agent的需要做一些非常复杂的一些任务的话,agent这个long graph是非常合适的。Long graph,大家看下面这个是long graph的一个工作流程图,也可以是它的一个架构图。它的这个里面的话有几个非常关键的一个概念。
这个首先大家理解一下,首先的话是一个状态,就是咱们这个用户去输入一个提示词的时候,那这个提示词这些数据中间,agent他怎么样做一个数据传递的?那主要就是通过这个状态,这个状态的话,大家可以把这个东西理解为一个上下文,就跟我们做java应用开发,相当于一个three local线程传递。那如果说你是做其他应用开发,相当于咱们参数一个context,这个上下文的一个共享,这个很好理解,这个主要是用来干嘛呢?说白了就是存储业务数据就是咱们这个任务所需要用到的一些数据,或者说一些决策的一些数据。有结果,就是每个节点执行的一个结果的数据都要往下做一个传递的话,你就得用到这个state。
好,然后第二个非常重要的这个概念,就是这个节点,节点的话是用来干嘛的呢?这个大家可以把它理解为一个什么呢?叫计算步骤,说白了其实就是一个函数调用,节点说白了他就是用来干活的,就是我们比如说调用一个工具查询天气,或者说调用本地的一个函数返回一个什么这样的一个结果,这个就叫节点。所以说节点的最直接的一个理解的话,大家就可以把它理解为一个函数或者是一个工具。它目的的话就是用来去完成一个任务,那这个节点的话主要就是用来agent在某个节点去执行一个任务。然后不同节点之间它可以干嘛呢?可以流转。比如说我这个向量数据库做完检索之后,然后我去调用大模型去做一个总结归纳,或者是咱们调用完这个天气的API之后,大模型拿到天气的数据之后,他给你旅行会做一些规划,这个的话就是节点之间的数据传递,那节点之间它的一个数据传递的话,它其实也分不同的情况。
那这时候就要用到另外一个核心概念叫边,边的话大家看啊就是这个用箭头连接的这个地方,箭头连接的地方,这个都可以理解为边。就是咱们从比如说从这个节点到这个节点,这两个节点它之间的一个箭头走向的话,这个东西可以理解为边。那边的话它是用来连接节点之间的一个什么呢?
中间桥梁,就跟我们一个桥一样,桥的话整个用来去连接两段公路。比如说有一段公路是跑什么路线的?另外一个公路是跑另外一个路线的那用荞之间把它连接起来,它就可以什么相互去做一个什么来传递。
所以边的话它是存在一个逻辑,叫什么呢?叫条件,这个就是条件边,比如说我们有两个工具,就两个节点,这两个节点做的事情不一样。如果说我们这个节点出来的结果是一的话,他应该走这个节点二这个逻辑。如果说是节点3,它出来的值是三的话,那执行节点3的这么一个逻辑,这个假设是这么一个情况,就是有两条边,一条边是要走节点2,另外一条边的话是要做节点3。
这个东西就叫条件逻辑,这个一般是用来在复杂的工作流里面去做实现的。比如说我们要做一个管理系统,或者做一个ERP,或者是做一个一些非常复杂的业务系统的话,这个的话就会用的比较多。比如说我当前一个单据是一个什么样的一个状态,比如说是一个待发货的一个状态,他可能就要走物流的那个流程是吧?如果说是已发货的话,那可能又要走其他的一个什么流程。这个是用来我们做一些非常复杂的一个业务场景的时候,可能涉及到多个边多个边。如果说我们工作流可能就是一条直线的话,那就是一条边连接到底就可以了,它就没有那么多复杂的条件。边的一些场景OK。
所以说大家要理解这个long graph它的一个底层原理的话,首先你要搞清楚这几个概念。其实long graph其实就是一个工作流,工作流从这个用户输入这个提示词开始。这个里面它就是通过这个状态state去做一个上下文的传输,然后节点我这个状态把数据传输过来了,你接下来得执行一些任务是吧?执行一些任务,比如说我调用工具,或者调用一个函数,这些参数的话可能就会作为调用这个函数的一些参数。那这个节点最终是要出来一个结果的,就是咱们调用完一个函数之后,他是要拿到一个结果跟反馈的,或者是一个决策数据的。那我通过这个决策数据,通过不同的条件判断,我去走不同的这个边。就比如说结果是一的话就走第一个边,结果是二的话就走第二个边。就是我要通过这个边条件边去做不同的工作流,或者是其他的一个流程。
好,那这个里面我最终有结果之后,他就会相当于做一个循环,那你最终肯定会有一个结束的节点,就是我们肯定有一个入口节点,一个启动的节点,对不对?就用户第一次会路由到一个节点做一个处理,那最终他会走到一个结束的一个节点,就是你所有的A的任务都结束了,你就结束了,那如果没结束怎么办呢?内循环就是我们前面给大家讲到的这个long turn框架的一个核心,就是在于什么呢?它是有循环这么一个机制的,为什么要循环呢?
比如说我agent去执行一个任务,假设我要做有一个那个任务叫什么呢?我未来三天可能要在北京出差,请帮我查询一下未来北京三天的天气,并帮我预定未来三天酒店以及订餐的一些情况,请给我一份详细的计划。我假设问了一个这么复杂的一个问题,他如果说执行的时候。可能不是那么一分是吧?不是很顺利的把一次性把结果全部都拿到了。他要经历不断的调用API,不断的总结归纳。比如说我第一次调API的时候失败了,或者说我调用API的时候,这个结果不是我想要的,这个不理想,中间咱们可能还会经历一些交互流程是吧?
好,那这个agent他就干嘛呢?他就不断的循环不断的反思,就是agent他有一个很关键的一个点,就是在于什么呢?他执行任务之前钱的话他都需要去做一个规划。就是你给他一个任务,就我刚刚问的那么一个复杂的一个任务,他不是拿着这个问任务就直接调用大模型,然后给结果了,不是这样的,他要干嘛呢?他要做一个任务拆分,比如说我叫task 1 task,我要把它拆成多个任务。
每一个任务完成的时候,最后再做一个总结归纳,等所有的任务都完成了,都拿到理想的结果之后,总结归纳也做完了,OK最后才能走到这个最终的一个节点,这个非常关键,就是循环的关键就在于这个agent的有没有完成指定任务。如果没完成的话,他就一不停的要循环。那这里有同学可能会有一个疑问,如果说一直循环,要是一直不出结果怎么办,是不是就死循环了?OK那这个一般怎么办呢?一般这个agent的它有一个参数叫迭代次数,迭代次数也就是最大循环。假设你给他设置的是15次,就不管有没有结果,15次之后一定要出结论了,出不了结论的就回复,不好意思,这个规划做不出来有问题。那你要给一个默认提示,这个东西可以写到那个提示词里面来做一个特殊判断就可以了。这个是我们可以终止这个循环的一个条件。
好,前面的话就给大家把agent,就是long graph它的一个工作原理跟底层的一些机制给大家讲清楚了。下面的话我们就开始来从这个代码的这个维度上,给大家来讲这个long grave在实际开发当中,它是怎么样去做一些实际的一个应用?那我们来看一下。好,首先它的阻碍功能,前面讲到了主要就是循环分支持久性人机交互流,还有包括它的流式传输,这个也是OK的,然后以及他跟lang称的一个应用整合,这个也是可以的。
那我们要去做这个long graph应用开发的话,大家首先得执行一个命令,叫PIP in store杠这个on graph,就是把这个命令,比如说咱们复制一下,咱们到这个拍这个里面建一个这样的一个long graph的一个python测试的一个小程序。然后在这里大家看,在这个timer终端里面,我们把这个命令把这个命令给执行一下就可以了。执行之后,我们就可以引入到什么呢?一些long graph的一些库。然后这个的话是我给他写的一个long graph的一个hello word,就是一个入门的一个小程序。这个程序里面会把这个long grave一些核心组件的一些使用,一些逻辑,就是一个非常简单的一个示例。大家把刚刚提到的节点、边、状态,怎么几个组件给大家一次性讲清楚。
OK,我们就沿着这个思路来说,首先的话就是long graph的一个核心概念,就是一个状态。就是咱们每次这个图执行的时候都会有一个状态。这个状态的话主要就是用于在这个节点之间做一个传递,做一个传递。好,咱们这个示例因为会用到这个OpenAI的这个库,所以大家还需要去install OpenAI的这个库。然后包括我们这个OpenAI的这个key,环境变量都给它设置一下。
然后我们还可以什么呢?用这个long smith的一个监控给大家看。我们就是因为这个long grave是做这个agent应用开发的,所以说什么呢?我们可以用这个long grave来做一个监控,做一个监控,这样的话就能看到什么呢?看到这个long grave的一些什么呢?一些监控的一些情况,就是一些结果。等一下我们来可以看一下这个监控,就是具体的它执行的时候,其实会有一些监控的一个链路信息。
好,然后的话我们就来从零开始讲这个long grave整个一个代码的一个实现,来回到这个拍照,从这个第一行代码我们开始讲起。好,首先我们要做基于long graph去做这个应用开发的话,首先我们得把一些包导入进来,大家去install了这个long的这个库之后,首先我们要需要导入几个东西。第一个的话其实就是一些提示词,还有工具调用。因为我们等一下的话会写一个非常简单的天气的一个检索的这么一个工具,所以说我们需要导入这个long time核心库里面的一个工具的一个包。
好,然后下面的话就是long graft的一个核心库了,这个是什么呢?导入long graph,long graph的这个叫什么呢?叫。检查点其实就是对应什么呢?用于持久化状态,这个东西主要就是用来去持久化状态的,就跟我们玩游戏一样,有个存档,整个我们这个工作流运作过程中,大家看这个state传输的话是通过一个叫memory save,叫这个内存存储是吧?这其实就是这个叫检查点。好,然后的话就是我们干嘛呢?还需要什么这个。