粉丝8.2万获赞11.7万

郑重警告,本系列视频耗时三个月制作,共计一百六十八集,一口气带你学会大模型应用开发,这次我们要学习的是生产级 ai 整实战, lan graph 加 fast api 从零搭建,可部署 pi 服务,含前后端 demo。 本期视频主要分享的内容使用 fast api 框架实现,对外提供 agent 智能体 api 后端接口服务,使用 lan graph 总预制的 react 架构的 agent, 支持短期记忆,并使用 posger circle 进行词句化存储。支持三克星 callin, 包含自定义工具和 mcp server 提供的工具。 支持黑幽门一则 look 对 工具调用,提供人工审查功能,支持四种审查类型,支持多厂家大模型接口调用 oppo 呀、阿里、通用、千问等。 支持 release 存储用户绘画状态。支持客户端的故障恢复和服务端的故障恢复。 使用功能强大的瑞奇酷,实现前端待末应用与后端 api 接口服务连调。本期视频是在 react agents test 的 项目基础进行更新,所使用的代码文件夹为零。四、这个文件夹 源码及相关资料均免费开源共享给大家,大家可以进入到下面给出的项目,那在项目中下载对应的文件夹即可。 关于如何构建 react agents test 的 项目,大家参考本期系列视频的第一期视频,有详细的实操演示,链接地址我放到这个地方,大家可以详细去看一下。关于代码中涉及到的前后端业务核心流程,大家在我提供的文件夹里面,在 dock 这个文件夹下面有三个文件,那三个文件对应的就是 后端业务核心流程以及 api 接口和数据模型的描述,前端业务核心流程,那里面把代码相关的业务逻辑都给大家使用示意图或流程图的方式给大家画出来了, 那我们在后面给大家实操演示完整之后,再回过头给大家读一下这三个文件,也就是给大家梳理一下前后端代码的逻辑。 那关于本期视频所涉及到的技术框架,这边列列出了两个比较核心的技术框架,一个是 long graph, 一个是 mcp。 那 关于这两个框架我都有很多期视频去分享, 那大家可以去参考我这边所列出出的相关的项目和视频,大家可以做详细的了解,这边就不给大家详细去赘述了, 那下面我们来看一下前期准备工作。前期准备工作呢,主要涉及到两块,一个是开发环境的搭建,一个是大模型服务接口的调用,那这一块呢,大家可以去参考刚刚在上边给大家所列出的在构建这个项目的那期视频里面有关于他们的详细的介绍。 接下来是项目的初步化啊,本期视频呢,我们是在这个项目的基础上进行的,所以只需要将 这个文件夹原码下载下来,放到他项目的根目录下面就可以了。那最后就是安装项目的依赖,那本期视频会多几个项目的依赖包,大家按照我这个顺序去安装就可以了。 那这边的话就不给大家具体去安装了,大家只要把这个几个给跑一下就可以了。好,下面最后我们来看一下功能测试,还是一样先给大家演示整个的案例的,整个的一个全流程的演示,看一下现象之后再去分析一下前后端代码的逻辑。 那关于功能测试,首先第一块是使用 dac 数据库和数据库, 那大家关于 dunk 的 安装可以进入到官网去下载对应的软件,安装完成之后,打开软件进入到我这边提供给大家的一个文件夹里面,把两个相关的 dunk compost 的 文件已经给到大家了,那大家只要去执行这个指令去安装就可以了, 那下面的话我们就来为大家实操演示一下。运行 dok 软件之后,大家可以看到这样的一个页面,那目前的话里面的容器和镜像都是空的。接下来我们打开一个命令行终端,进入到 dok 文件所在的文件夹,也就是这个地方 我们进入到当前的文件夹,那进入到之后呢,我们首先来启动一下 post sql 的 服务,那我们只要去复制这条指令,并且我们进入到当前的这个文件夹去执行, 那这边的话大家可以看到它首先会检查你本地的仓库里面有没有 postgress 折扣的镜像文件,如果说没用的话,它会去 到相应的网址进行拉取,拉取之后再进行后台的启动,那这边的话我们就等待它完成之后再继续。那完成之后同样的步骤再来启动一下 res 服务, 那到这里呢, postgrid 数据库和 reddis 数据库的服务就已经启动完成,完成之后可以再回到 这个软件里面来,大家看一下,那大家在这边的容器里面就可以看到当前两个服务已经在正常的运行中,那对应的本地仓库的镜像也有两,有了这两个服务的镜像文件, 那接下来我们可以通过远程客户端的方式,那对于 posgrid circle, 大家可以使用这个客户端,那对于 radis, 嗯,客户端呢?大家可以使用这个客户端软件,下面的话给大家看一下。 大打开客户端软件之后,大家只要去进行相关的连接,大连接的话,大家只要根据你所开启的 postcro 的 服务,那大家如果说是根据我的操作来的,大家只要按照这样的去配置就可以了。大配置完成之后,大家可以去测试,测试完成之后 们双击打开,打开之后大家可以看到这边的话会多了一个数据库,我们可以刷新一下,那目前的话这个数据库里面的表是空的。 好,那这个是 post 截图的,通过客户端软件远程连接到当前的数据库服务,可以很方便的去查看和管理。 那对于 radis 呢,大家可以使用这个软件,那也是一样的,大家只要去在你的本地进行一个连接,那连接之后大家可以进入到这样一个页面,那当前也是一个空的,没有内容。 那接下来我们再回到我们的操作手册里面来,把所需的两个服务启动完成之后,下面就进行功能测试,功能测试主要涉及到两份代码,第一份是后端的服务,那对应的代码在这个地方 对应的是他,那关于前端的服务对应的是他,那如何去测试呢?大家只要去运行两个服务就可以了,那在运行之前,大家要首先去 设置一下你的大模型的参数,那大模型的参数大家可以在运行之前,首先大家要进入到当前的这个文件夹,那这个文件夹下面的话提供了三个脚本,第一个脚本是全区的一个配置的脚本,那在这个脚本里面呢,主要是涉及到对于 log 日制的参数的配置,以及 posgrid 数据库配置的一个参数,那这边你要根据你自己的一个实际的需求进行相关的调整。再一个是 radis 数据库的配置参数的调整,以及使用哪一个大模型厂商的大模型, 那这边的话我先使用代理的方式使用 o p r 模型,那紧接着是一个我们的后端服务 api 服务地址和端口, 那如果说你是跟着我的步骤来的,那这边的话基本上你不用去做任何的调整。那第二个脚本呢,是关于大模型的配置,那这边提供了一个统一的大模型 配置的脚本,在这个脚本里面大家只要在这一块去做相应的配置即可。那这边主要是提供 oppo r, 也就是我们使用代理的方式,那通过代理的方式的话,大家可以去代在这个代理平台申请 apk 以及你所使用的哪一个模型。 这边给大家测试使用的是 g b t 搜迷你模型,或者你也可以使用 deepsea 这个模型,那紧接着搜完 a p r, 那 这个就不给大家啰嗦了。再一个就是千问,那千问的话主要是有使用阿里的白链平台上面的模型, 这边的话使用的是千问 top 拉蒂斯的又是千问三对应的模型,所以本期视频的话也会为大家去测试 一个 oppo 压的模型,一个千问的模型,那对于欧拉玛的模型大家也可以去尝试使用,那在模型的选择上面来说的话,大家一定要注意你的模型一定要能够支持方形 collie, 那 对于欧拉玛本地开元大模型的话,大家可以使用拉玛三点一八 b 这个模型进行测试。 好,这是大模型的测试,那这边的话要根据你自己的大模型配置参数进行调整。 那最后一个呢是提供的是对于工具,那这边的话我们是自己实现了两个自定义工具,以及 使用 mcp solo 的 工具,也就是使用的是高德地图的 mcp solo, 那 这个我们在后续的实操演示环节再给大家详细去讲解。那这个是三个脚本,那对于我们的主脚本来说的话,大家在运行这个脚本之前一定要去做相应的配置, 配置完成之后呢我们就来运行这个两个脚本,那这边的话大家一定要进入到当前脚本所在的文件夹。 首先我们来运行第一个脚本,也就是我们启动我们的后端服务, 那后端服务运行成功之后,大家可以先去数据库里面去刷新一下这个数据库, 那这个时候大家可以看到它的已经创建了四个表,那这个四个表呢,其实是针对于 long graph 中关于短期记忆, 也就是基于现层级的记忆,它所给大家实地画出来的四个关于 point 存储的表,那这个呢在我之前分享的视频里也给大家介绍过。 好,那接下来再来去打开一个命令行终端来运行一下前端的服务,那也是一样,进入到当前文件脚本所在的文件夹, 预警成功之后,先不着急去进行测试,先来看一下代码结构,那在代码结构的话,大家可以看到多了一个文件夹,关于日制的存储的文件夹,那打开之后大家可以看到关于后端服务所有的日制的记录都在这个文件夹里面。 那再一个呢就是关于我们后端服务的一个启动的日期,那我们当前跑在的端口是这个端口,所以在我们启动 前端服务的时候,大家一定要在你的前端配置后端服务 api 的 url 地址的时候,一定要记得跟你这边的 ip 和端口进行匹配。 接下来就给大家去做测试,那做测试的话,首先我们先来去测关于对工具请求进行人类反馈的四种反馈类型, 那这边的话在代码中是使用的拍摄实现了两个工具,但这两个工具都是模拟的工具,比较简单,第一个是模拟了酒店预定的工具,那在我本期系列的视频前几期也都为大家举了这样的一个工具的例子, 那大家也如果说看过我前几期视频呢,应该不会陌生,还有也就是实现了一个计算两个数存级的工具,所以这两个工具比较简单,那我们通过这两个简单的工具,我们来给大家测试一下人类反馈那具体的一个测试流程。首先我们来 给大家去测试一下输入 yes, 也就是接受工具的调用,我们来执行一下,那这边的话,大家可以去 直接点击 enter 键直接进入,那这边的话整个的一个一个交互的逻辑,就是这边需要输入用户的 id, 那 这边的话你自己可以去定义你的用户 id, 你 也可以不填写,那不填写的话就是默认使用的是这个, 所以这边的话我把它用户 id 设置为 text 零 e, 那 这个时候我点击回车,好,这个时候它在我的服务端没有找到我当前用户所对应的绘画,因为我是一个新的用户, 所以他在我的服务端会创建一个新的规划,那这个时候他就会让我输入我的问题,那这边有几个特殊的指令,我们在后面再给大家去测。那下面的话我们就先来去问一个问题,就是调用工具预定酒店,我们点击回车, 那这个时候我们可以等待一下他大模型的一个回复,那这个时候大家可以看到大模型所给我的回复是这个时候产生了一个工具的中断,那中断的话就是需要准备去调用这个工具,也就是我 这边实现了这个工具,并且当前的参数是如家酒店。因为在我的问题里面,我是要他预定如家酒店,所以他这边把我的参数匹配上,那匹配上之后他首先他要去调用这个工具。之前因为我们对这个工具进行了人类反馈的 一个设置,所以他需要我前端去进行相关的反馈,那这个时候有几种选择,那四种, 呃,这个反馈的类型,第一个是接受工具的调用,第二个是拒绝工具的调用,第三个是修改工具参数后调用工具,第四个是不调用工具直接反馈信息,我们就来一一测试一下。那首先这边我们先用同意工具调用来试一下。 好,那这边的话我们就可以看一下,那这个时候他已经成功预定了在如家酒店的住宿,那这个是智能体的最终的一个回复。那为了方便大家去理解,我在我的服务端把相关的 上下文内容里面可以打印了出来,大家可以去看一下他的这个过程,那我们这边的话可以这个是最终大模型的黄回复了一个内容, 那我们再往前看一条,那这边呢展示的是工具的回复的内容,那工具的回复内容就是成功预定了在如家酒店的住宿。所以这个时候大家可以看到他其实大模型最终给我回复的时候,他是参考了工具的调用,那再往前找一个,就是他在工具调用的时候所匹配的参数。 好,那这个是测试的,是我们同意,然后执行这一次的工具的调用,那我们再来去测试一下,我们来拒绝工具的调用,试一下, 我们还是一样我们点击发送,那发送之后呢,它还会去触发一个工具的中断,而要求我人类进行相关的反馈,那这个时候我不去调用工具, 那这个时候最终大模型给到了回复,是没办法去调用工具去预定相关的酒店。那这个时候我们再来看一下服务端的一个日制,那服务端打印出来的就是我们可以再去看一下这个工具的最终的输出,它输出的是工具被拒绝使用了,那这个呢都是我们在代码里面去约束的。 好,那紧接着我们再来去测试一下,第三个就是我们去修改相关的参数,试一下还是一样,我们直接复制这个问题回车 好,又触发了一个中断,那这个时候我们选择编辑参数,这个时候会要求用户将调整新的参数的内容贴在这个地方,那这边的话我们就把它给复制一下, 那这边的话我是在后面加了一个具体的一个地点,好,我们再去发送,那发送之后我们来看一下这用大模型的返回,他是成功预定了在这个地方的这个酒店,那这个时候我们再来看一下,那这边的话我们可以看一下工具最终匹配的 就是成功预定的这样的一个住处,所以这个时候我们可以看到对于我们去修改这个参数,它是起了效果的。那最后呢我们再来测试一下,我们直接不改参数,我们直接人类直接去提供反馈信息,那也是一样,我们来问一下这个问题, 那这个时候我选择最后一个, 好,这个时候他需要我去提供直接的反馈信息,那我把下面这一句给他复制 好,这个时候我们来看一下现象,那这个时候他又触发了一个中断,那中断是因为什么呢?是因为我的提供的信息是把酒店的名称换为汉庭酒店软件园店, 再去调用工具预定,所以他又去出发了工具,并且这个时候他把当前工具的参数匹配到了我最新提供给他他的信息里面所提供的这样一个酒店,那这个时候我们直接允许, 那允许之后呢我们可以看到他最终得到了一个结果也是正确的。那我们在上面给大家测试了这种四个 反馈类型之后,我们可以去对应的看一下我们的日记里面的信息,那日记里面的信息的话,就会把每一次我们的调用的每一个步骤,总监涉及到的工具的调用,或者我们主流层里的调用的信息都会记录在这个地方。那再一个呢就是我们的服务端会把相应的 上下我们内容里面的消息进行相关的打印,那这个是为了帮助大家,辅助大家更好的去理解,那这块的代码在你实际的应用过程中,你可以把它给隐藏掉,就是不需要输出这些东西。 好,那再一个呢就是在你的这个我们的 checkpoint 这个表里面,我们双击,那这个时候大家可以看一下,看一下它会存储很多的 checkpoint, 那 这个呢就是 long graph 关于短期记忆里面,它会把每一个 每一个就是你的问题或者大模型给出的一个回复,所有的一个步骤的这个状态全部都会给把它存储下来,作为一个 kick point, 那 你在下一次可以竭机与 kick point 去进行相关的现场的恢复, 那这个我们在后面会给大家去演示好。再一个呢就是我们的 reddis 里面,我们可以去刷新,那我们这边的话就是点击 我们刷新看一下,那这个时候大家可以看到他当前会有一个一个筛选叫 test 的 零一,那于是刚刚我们创建的这个用户,他有筛选 id, 包括他的一些绘画状态的信息都在里面,那关于这里面具体的详细的内容,我们待会在后面给大家去介绍。 好,那接下来再给大家演示一个功能,就是我们去测试一下这个两个就是特殊的指令,那特殊的指令的话,我们只要在这边直接去输入一个 这个,那这个之后呢我们其实是去查当前这个用户绘画的一个状态,那这个状态大家可以看到他当前的一个振动器的一个回回答,我们可以看一下,那我们是在这边提供了一个 啊,这个状态就是当前绘画的一个状态,那里面有用户的 id, 绘画 id 以及他当前的绘画状态是已经完成的状态,并且保存了上次查询的 问题以及上次更新的时间。那这个呢主要是用来去做客户端一个故障的恢复,那如何去恢复?我们在接下来会给大家去演示,那这边的话再给去大家测试一个特殊的指令,我们去新建一个规划。 那新建绘画了,大家可以去看一下现象,比如说我们这边的绘画 id, 它的它的结尾是这样的一个结尾,那我们这个时候我们点击新建一个绘画,那新建绘画之后它会把以前旧的绘画给删除掉,那删除之后我们再点击 回车的时候,那我们点击回车的时候,其实我们问了一个问题,是一个默认的问题,叫你好,那这时候结束之后,我们可以看一下他的绘画 id, 那 这个时候这个绘画 id 和他就是不一样的,所以这个绘画 id 就 会被删掉,然后重新会启动一个绘画 id, 当然我们也可以直接去退出,那退出的话就直接把服务关掉,接下来我们可以切回到这个服务端,我把服务给关掉,那关掉之后呢,我们来改一下这个 大模型的。呃,这个配置里面关于大模型的类型,那刚开始为大家测试使用的 open 压的模型,那现在我们使用千万的模型来试一下,那这边直接保存,保存之后我们重启一下服务, 那服务启动成功之后也是一样,那这边的话我们新开一个终端,新开一个终端之后,我们再来运行一下这个前端的脚板, 那运行成功之后,大家可以看到我们这边返回了一些系统的状态,那当前的系统活跃的绘画,有一个活跃的用户是 test 的 灵异,也就是我们在这边去创建的。 那这个时候呢,我们可以去给大家来测试一下,就是客户端的一个故障的一个恢复。那比如说我在这边我再去启动一个客户端,那这个时候呢我来启动,启动之后呢,这边需要我去输入一个用户 id, 我 就把刚刚我们创建的这个用户给输入进来, 那这个时候大家可以看到他会把我当前这个用户相关的状态信息给展示出来,主要是展示了一个发现性的绘画,完成的绘画以及上次智能体的回答以及相关的一个状态信息。那这个时候呢,我会可以接着这个绘画去继续去提问啊。 好,那我们这个用户已经开着了,那这边的话我们再切回了这个地方,那这个边的话我们再去创建一个用户,比如说我们叫零。啊,好,那这个时候呢,我们可以先来去问一下你。好, 那这个时候我们可以看到他当前也已经正常了一个回复了。好,下面的话我们可以来测试一下这个客户端的一个故障的一个回复。比如说我们来测试一下利用另外一个工具,也就是 m c p 搜,我搜索极光的工具,也就是高德地图搜索极光的工具,那关于高德地图的相极光的相关工具。那这边给大家每个接口做了详细的一个介绍,并且大家可以看我以前的这本期系列的相关视频,里面有对这个 mcp 搜,我非常详细的一个讲解。好,那我们这边就话随便的取一个问题, 我们来查一下这个 ip 啊,这个经纬度所对应的地方是哪里?好,我们还是来运行一下。但运行之后我们这个时候我们可以看一下我们的服务端它所调用的这个模型,它是一个千万的模型, 那在上一个好被我清掉了,那在呃刚刚开始为大家测试的时候,我们使用的 阿里的不那 open a r 的 模型。好,那这边的话我们就来继续。那这个时候触发了一个中断,需要我局用户去输入,那这个时候如果说你的客户端突然终止了,比如说我把它给强制关掉了,那关掉之后呢?我再来运行,那我把这边清一下吧, 我再来运行一下这个脚本,那这个时候我把这个 test 的 零二,我还是 去使用 test 零二这个用户,我这个时候点击确定,那这个时候大家可以看到它会把当前你所终止的那个之前的那个状态,它会把这个状态再继续提交给你。那在上一次我们 中断的时候,就是我们意外退出的时候,我们就是在这个地方需要我人为去反馈的时候,那这个时候我意外退出了,那紧接着我在比如说我的客户端刷新了之后,我重新登录了这个用户,那这个时候你所看到的还是当前的这个状态,所以这个就是做了一个客户端的一个故障回复, 他所使用的方式就是使用绘画的状态管理,就是把你当前的每一步的一个绘画状态全部都存储在你的后端服务,那这样的话你的客户端再去发生意外之后,去重建现场的时候,他就能够根据你的绘画状态来去进行相关的恢复。 好这个时候我们可以继续往下,比如说我们就同意这个工具的调用,那这个时候大家可以看到,那这边呦 会得到高德地图它的接口所返回的一个内容。前面刚刚说到的是客户端的故障恢复,是使用绘画管理的这种方式,那对于服务端的故障恢复呢?其实服务端的故障恢复,它主要是存在一个 long graph 节点的一个状态的恢复, 那对于这个节点的状态要恢复,因为我们使用了短期记忆,也就是使用了 checkpoints, 所以 在你的每一个 long graph 中,也就是你的工作流运行的每一步,他都会做相关的记录。所以在你进行相关的一个恢复的时候,他其实可以通过你的所有 id, 这个 id 对 应的就是你的 c 型 id, 通过这种方式他就能把你最近的一次的 checkpoint 给恢复出来,所以这就是服务端的一个后端的一个故障的一个回复 啊。以上呢就是本期视频为大家分享的这个案例所给大家演示的内容,那接下来我们就寄予我们现在看到的这些现象,来分析一下后端服务和前端服务的核心的流程。 那流程的话主要是涉及到两份代码,那第一份代码是我们的后端的服务的代码,那第二份代码是前端服务的代码, 那关于这两个服务的代码呢?我们先这样给大家介绍,就是先给大家看一下后端的服务这个脚本里面的代码的一个结构, 那不去详细去读每一行代码,关于前端服务的脚本也是一样,给大家看一下整个的一个一个结构,那关于这两个的具体的核心的逻辑,我们通过提供给大家的三个文件为大家去介绍,那大家 通过这个三个文件的内容的介绍,大家再反过来自去读相关的代码,那大家就很容易去理解。 首先关于后端这个脚本,那前面这一块的话,我们是使用了一个一个第三方的一个库,我们使用它去做相关日记的记录,那这边也没有什么,主要去设置一些你的日记文件最大允许的一个一个大小,以及 达到上线之后的一个触发的一个轮转,那这一块的话大家可以详细去了解一下。那紧接着我们整个的一个后端服务主要是来通过 fast api 框架去实现接口,那这边主要实现了五个接口, 那五个接口的话,我们这个代码应该如何去看呢?首先我们会使用 fast api 去实力化的一个 app, 那 通过这个 app 我 们去 设置了一个生米周期函数,那在你的服务一启动的时候,会立马去出土化这个生米周期函数,那在这个生米周期函数里面去做相应的一个出此话,那最终我们通过通过去编辑 pos 的 接口和 get 接口去实现相关的一个功能。 那对于前面这几个呢,主要都是为了去实现这个接口所提供的一些额外的一个方法,那主要是涉及到一个 一个 radis 的 一个存储,那 radis 呢?主要是用来对整个的一个绘画状态进行管理。 那再一个就是解析一个 stat 消息列表进行格式化展示的,也就是大家在这个服务端所看到的这样的一个一个比较友好的一个格式化的一个展示。那这块的话在你代码实际运行过程中,你可以把它做死掉的。 那前面的话就是定义了一些数据模型来约束你的你的你的数据,那这个就是整个的一个代码逻辑,所以这个呃结构就是这样的一个结构。 那关于前端的这个代码的这个结构呢?我们也可以来看一下,那大家对前端那个代码结构,大家只要去通过一步一步的去追就可以了,比如说他的一个慢脚本,从这里开始,那大家就要从这个函数开始看,拿每一行去 去分析里面具体的一个逻辑。那其他的都是基于你整个的一个业务流程所衍生出来的一些方法封装的单独封装的一些方法,那这个我会列了一个流程图,会给大家详细去介绍,所以这里面的代码结构就是这样这样的一个代码结构。 好,那接下来话首先来给大家介绍一下这个后端业务核心流程,我们先把它打开。 关于后端服务被大家提供了两个文件,一个是核心的流程,再一个就是 api 接口和数据模型的描述。那首先我们来看一下这第一个文件,那第一个文件呢,主要想给大家介绍的是 关于这个 long graph 中的一个 hil, 也就是人工审查这样的一个功能。那要想去实现带有 hil 的 a 镜的系统, 其关键在于流程的中断和恢复,以及为了支持他所需要的状态四句话机制。简单来说就是需要一种机制,将流程挂起,在特定节点等待人类参与和反馈,然后能从中断点恢复运行。 那 long graph 中提供的解决方案是中断加上命令恢复加上检查点三大极致。 那关于中断就是暂停 long graph 工作流的执行的同时返回一个中断数据对象,其中包含给人类的信息,比如需要审核的内容。 那第二个是命令的恢复,要恢复工作流,要获得人类反馈信息,并注入工作流状态,也就是上上下文,然后发出继续执行的命令。 那执行运命令的话,在 long graph 中它是使用这个 command 加上一个语句这样的一个参数来反馈并且恢复。那 kick point 的 话,就是为了实现断点续跑,必须要实现 agent 的 状态词句化存储,用来在做恢复时重建现场。那整个的一个流程,其实就是大概这样的一个流程, 在节点运行到一个人工审查的这样一个节点的时候,他先去挂起,挂起之后等待用户的反馈,最后我去恢复,那最终紧接着再去执行下一个节点的一个执行。 那我们有了这样的一个概念之后,我们其实再来看一下我们的一个这个代码里面的一个逻辑,那这个逻辑呢?就是为大家裁剪了一次中断处理过程的一个流程的一个描述。 那首先我们可以看一下,那这个是我们的用户,那用户使用的是一个用户的客户端软件,对吧?我们的客户端,那关于这个客户端呢?他会去调用一个 inwalk 方法,那这个 inwalk 就是 on graph 中他所提供的关于图运行的一个方法,那使用这个方法我们把相关的输入和 script, 那 这个 script 就是 来区分你的每一次切克泡映册的一个唯一的 id, 那 关于这个 方法运行之后,它就会工作流就会去运行,也就是在这个 graph 这个工作流里面就会去运行。那在节点的运行的过程中,比如说到了这个地方有个人工审查的站点,节点触发了中断,那触发了中断之后,它会把中断 数据携带着给到这个客户端软件,那这个时候客户端软件可能会提示用户,在这个客户端软件的页面上告诉用户你需要去进行相关的一个反馈,那反馈 那个就是这边第三个,也就是这个中断发生之后,客户端收到 aint 的 反馈状态,重复发现有中断,则提示用户进行反馈,大用户把反馈信息再给到 输入到你的客户端,那客户端调用 inwalk 恢复工作流,那指定对应的现场 id 和你的 resume 相关的一个信息去恢复现场, 那最后呢?也就在这个地方,那恢复完整之后呢?那第五个就是再次进入人工节点,此时由于有 resume 信信息,那中断函数不会触发中断,直接返回相关的信息,那流程得以继续运行,那这个呢就是一次中断处理过程的一个描述。 那有了这个概念之后呢,我们再来看一下我们本期视频给大家所写的这个代码的一个逻辑,那这个代码逻辑大概是这样的一个逻辑,首先这一块是我们的客户端 app, 也就是你的客户端软件,那这一块的话就是你的一个后端服务,那这边的话是用户, 那我们如何去看这个流程呢?也是一样的,首先我们从这边开始,那在你的客户端前端应用里面,你去触发了一个 inwalk 的 一个方法,也就是你去运行的这样的一个智能体,那这个时候筛选开始, 当 c 信开始之后呢,客户端去调用 inwalk aint 的 接口,那这个接口呢?就是我们后端服务所提供的两个接口,那用户去发送了一个问题,要去请求智能体的一个运行,那这个时候会触发这个接口,那这个接口呢?根据你的用户所反馈回来的这个 c 型 id, 也就是你的用户的 id, 那 看你这个用户 id 在 我的这个数据库里面,这个绘画状态, 这个库里面有没有这个用户的 id, 或者这个用户有没有对应的 c 型 id, 也就是这个用户有没有绘画,如果说有绘画,那就拿到这个用户 id 的 一个绘画,然后继续往下 第三步,如果说没有,那这个时候他会先去把这个用户 id 创建一个塞信 id, 并且呢把它存储到这个表里面,所以这个就是我们存储在 readis 这个表里面了,并且你可以设置当前的这个用户,他的会花的一个一个失效的时间,比如说一小时, 那一一小时之后他会自动去清理这个用户所对应的这个绘画,那有了这个绘画之后,那紧接着往下去跑,也就去运行这个 workflow, 那 运行这个 workflow 也就是回到了这个依次中断了。给在上面给大家介绍的这个流程里面了,也是一样, 那首先他你跑到整个这个节点发生了一个人类的一个中断之后,中断函数之后会触发一个中断,带着中断的数据还是给这个接口,那这个接口会处理,处理完了之后他觉得需要去把中断的数据包装一下,返回给 客户端,那这个手到第五步的时候,那中断发生了之后,他会把相关的一个接口返回,那这个接口所返回的这个 response, 它里面就是一个中断的内容,那中断的内容用户端 客户端接收到之后会对终端进行处理,那处理的话就是分析这个终端的返回的数据,然后返回给前端给返回,返回到展示在那个你的客户端上面,用户看到了之后进行相关的一个信息的反馈,那反馈之后,然后再去 发送一个第七步,也就是用户输入反馈之后去调用另外一个接口,那这个接口呢就是来恢复你的, 呃,恢复你的这个工作流,那这里面就包含用户反馈的信息,那这个接口触发之后呢,他会去调用,继续去调用这个工作流, 那这个时候对于这个中断函数,因为你里面已经有了用户的反馈的信息了,所以他这边的话就不会再去中断了,那就是到第九继续往下去走,那走完之后呢?走完之后,然后最后一步就是 第十步,就是这边的话会给一个最终的一个结果,那结果的话就会返回,那他当前对应的状态就是你的第一次的调用已经结束了,并且会有正常的一个大模型的智能体的内容的反馈, 那最终会给到客户端,所以到了第十步的话,就是一次中断过程处理结束,绘画结束,所以整个的一个业务端,后端的一个业务端的整体的一个核心的流程框架就是这样子的, 那其实就是来写相关的一个接口,并且按照这样的一个核心的流程来去进行相关的一个处理和状态和这个绘画状态的记录。 那了解了这些核心的流程之后呢,我们就来看一下后端到底做了什么,那后端的话我们可以把它放大来看一下。 首先关于 api 接口的描述,这边一共提供了五个 api 接口,那每个 api 接口他对应的请求的类型以及相关的描述到这边也都给大家列出来了,大家也可以先继续看一下,那关于他的请求参数以及响应的内容,那这边也有相关的介绍, 那这里面会涉及到什么呢?会涉及到一些数据对象,那这个数据对象呢?也就是我们会去提前去 定义这个数据模型,所以这些数据模型的话,大家可以去看一下。那关于第一个数据模型,就是客户端发起的阵地地请求,那这个数据模型主要是来约束你的前后端,大家如何去使用相关的字段, 要提前做好约定,那这样的话你的前后端应该怎么去做连条,这样的话就是比较,嗯, 比就是比较规范,那这样做的好处是什么呢?好处是你前后端其实是可以同时开发的,因为你的数据格式已经定了,你的接口已经定了,那其实对于你的前后端其实就是格力的,就是分开的。 好,那这边的话就不给大家详细去介绍了,那里面主要就是针对于我们当前后端服务里面所涉及到的一些数据模型,那数据模型的话最终是体现在我们每个接口里面所接收到的一个数据,并且我们最终接口调完之后所返回的数据, 那这个大家详细去看,对着相关的源码去看。所以关于对于后端服务的话,其实它的目的就是提供五个接口, 第一个接口是创建智能体便调用直接返回结果或中断数据。那第二个接口是恢复被中断的智能体执行,等待执行完成或再次中断。第三个就是获取当前用户的状态。第四个获取系统状态信息。第五个删除用户规划, 提供了五个接口,那关于前端业务呢?就是根据你所要去实现的一个前端页面的逻辑来去调用这些接口。那我这边画了一个 前端的业务流程图,也非常的详细,大家可以根据这个流程图,然后对应的去看相关的源码,那这边话就给大家稍微去看一下,读一下。 首先用户开始之后,也开始,也就是你的程序的开始,其实对应的就是你的一个慢脚本的开始,也就在这个地方进去之后,那进去之后呢首先 会调用服务端 api 接口来获取系统信息,那这个系统信息呢?其实对应的获取的对应的接口就是 这个接口,那它所返回的内容,返回的内容就是当前系统活跃绘画总数和活跃的用户,所以这个大家可以看一下。在我们的这个运行的这个过程中, 我们可以去看一下会有系统绘画,这边是零,我们看一个有的比如说这边系统绘画是两个活跃用户,那我们是零二和零一,所以这边的话就首先会打印出来这些信息,那紧接着就是等待用户的一个输入 id, 那 获取到这个用户的输入 id 之后,首先他会去教你一个方法,那这个方法呢主要是用来检查,并且去尝试自动恢复现有的绘画, 那他会返回值会有两个,第一个就是有没有活跃绘画,所以他是这个是一个布尔值。再一个就是如果有他的绘画当前的一个状态数据是什么,那他返回这两个之后,那下面会进入到一个循环,那在这个循环里面主要就根据这两个状态来做相应的一个逻辑的判断, 那关于这个里面是什么呢?这个里面大家可以去看一下这个我给大家画的这个流程图,那这个流程图里面就是这边拿到了用户的输入之后,会获取到当前用户的绘画状态,也就是会调用这个接口,那这个接口所对应的就是 就是这边的一个获取当前用户的一个状态这样的一个接口,那这个接口返回的数据就是一个绘画状态的一个数据对象,那拿到这个数据对象之后,会解析里面的状态这个字段,也就是对应的数据对象。我们可以看一下这个数据对象, 也就是在这个地方那里面会有一个一个绘画的一个状态,拿到这个状态的字段里面去解析当前这个状态是什么,那下面有几种情况,那第一种情况就是没有发现这个绘画, 那这个时候呢他会给这两个参数去复制,那有就是没有激活的这个 c 型 去做相应的一个赋值。那还有一种状态呢,是已经绘画已经完成的状态,那去做相应的赋值,那中断的状态去做赋值,然后错未知绘画错误的状态,获取 绘画运行中的一个状态,绘画空闲以及未知状态这样的一个返回值,那这个返回值呢?大家可以去看一下,只有在中断和 和这个绘画空前的时候,返回的是一个处,也就是有激活的就正在使用的绘画, 那这个时候并且它返回的对象,大家可以看一下,是你的这个当前所获取到了这个绘画状态,就通过这个接口所返回的当前最新的一个绘画状态的一个数据, 那紧接着的话就会把这两个参数给返回,那返回之后就到这里面,那这个时候呢,那下面的逻辑就是会进入到一个循环里面,那在这个循环里面主要是做什么样的一个逻辑处理呢?首先他会判断你当前的有没有活跃的绘画, 如果说没有,那这个时候他会往下,如果说有的话他会走这条之路,那下面我们先来看一下没有,也就是当前这个用户他没有活跃的绘画 id, 也就是也就是在你的这个 radius 这个绘画状态的这个这个表里面没有相关的数据,那这个时候就会到下面到到这里, 那到这一次之后他做什么样的一个处理呢?获取用户输入,那输入的话有特殊的指令,也有你可以直接去输入一段文本,那直接去做 quarry, 那你输入到相关的这个内容之后呢?首先他根据你输入的内容内容去做相应的一个处理,那主要是分为两种,第一个就是关于这个特殊指令的处理,那关于特殊指令,第一个就是退出,那退出的话其实在他的程序里面就直接 break 跳出循环,然后整个程序结束。 那第二个就是会调用接口查询当前绘画的状态,那调用接口就是这样的一个接口, 并且会去展示状态类详情,那通过这个 continue 去跳出本次的循环,那再去接着下一次循环,那关于这个 new 呢,就是去创建先去调用接口,去删除服务端的一个旧绘画, 并且重置相关的一个状态,跳出本次的循环,那重置状态之后,它会通过这个又会去到这里面去判断当前这个底的状态,然后继续往下。 那如果说它是直接输入了一个内容,那就会去直接去调用接口去请求运行智能体, 那就去会去开启一个运行这个工作流,那工作流会得到一个 response, 那 并且通过这个方法去统一对智能体的回复内容进行处理。 最后呢去调用接口查询当前最新的一个绘画状态,也就是在这个函数里面处理完之后,在处理的过程中,他会去更新当前绘画的前锋状态,那紧接着等他处理完之后呢,他会去获取一次最新的一个状态,那这个对于这个状态所返回的这个状态 值,然后再去做一呃相关的一个判断,那判断的话主要还是去给这两个值去重置状态。 那比如说如果说他当前最新的绘画状态是已经完成了,那就去给这两个去做相应的一个重置,那如果说是错误也去做重置。如果说是一个中断或者其他的一个空闲的一个 状态的话,或者运行空前的状态的话,那这边的话也会去重置状态,那重置状态的话就是当前这个绘画还在保持着运行,也就是你还没有结束,所以这个时候当他是处的时候,我们可以看一下,当他是处的时候,他会去走这条路,是吧? 所以这个就是在这条直线上的一个流程,那比如说我们在当前的这种情况,那第一种情况呢,就是我们去新建了一个,呃,在这边我们去, 我们去就是发生了一个中断,就当前的一个中状态会滑状态是一个中断的一个状态,那这个时候我们的一个状态是它, 那这个时候呢?我们再往下走的时候,如果说他是一个处,那就是触发了他,那这个里面是什么呢?就是首先他会拿到当前的这个状态是不是一个中断, 如果说是一个中断,那就是往这边去走,如果说不是中断,那就继续往下,那如果是一个中断的话,就是会去 给予这个中断的一个状态去处理之前的一个状态,那主要是通过调用这个方法,那这个方法呢?主要就是把当前中断获取到这个中断数据和用户 id 传入到这个方法里面,那这个方法会去做相应的处理, 那处理完成之后呢,会去重新获取最新的一个绘画状态的一个数据,因为他在这个处理的过程中呢,他会去更改整个绘画的一个状态,那拿到最新的一个状态,再去判断当前这完成的一个状态的一个值,是已完成,还是说 没有鱼不适宜完成,还是在在中断状态。所以我们再给大家去演示。呃,客户段在演示的第一个给大,呃,不在第一次给大家去演示这个 response, 也就是给大家看一下啊,也就在给大家去测试这个的时候, 测试这个时候大家还记得吧?就是我们在第一次产生那个中断,并且我选择 response, 然后把这个问题,呃这个反馈信息加上去之后,它又触发了一个中断,那这个时候我再去选择 yes, 然后完成了这次的一个绘画,所以这个起色的一个过程对应的就是这样的一个过程。 好,那这个从字完成之后呢,紧接着还会沿着这条路再去往下,然后流程都是相同的一个流程,那这个里面的话又设计了两个方法,那这个方法呢,就是对中断的一个处理,那这边的话还有个方法呢,是对于大 呃智能体回复的统一的处理,我们可以先看一下这个,那这个的话对应的是在这边啊, 那关于统一处理智能体响应级变化获取到 agent 返回 respond 失踪的一个 c 项 id 和状态,那这个里面的对象里面的字段是什么呢?大家可以去看一下它,也就是在这个 agent response 里面会有一些规划 id, 包括当前的状态是中断还是已完成还是错误,包括的这个完成时的一个结果的信息,或者中断时的一个中断的一个数据都在这个地方,包括你错误时所产生的一个数据, 那拿到这个数据之后,你就可以去做相应的判断,比如说你还是去判断他的这个状态,那也有这几种状态,那每一种状态,然后他的返回值是不一样的,比如说已完成状态,那他就把这个数据对象里面的直接的结果的字段直接返回就可以了。 那如果是一个中断的状态,他就获取 response 中的中断数据,进入中断处理函数,也就又进入到这个中断的这个函数, 然后返回一个 non 回去。那关于一个错误啊,正在运营中啊,或者你的空闲状态,一个位置状态也会去做相应的一个返回, 那紧接着这个中断处理函数的一个逻辑是什么呢?也在这个地方一个对应,他在这边有一个中断处理逻辑,那主要的一个逻辑就是哈会获取到 a 帧返回 response 中的一个 c 项 id 和当前的一个 不对,在这边就是他会获取到这个用户的一个输入,也就是你产生的一个中断,中断进入进入之后,首先他会要求用户输入,也就是要用户反馈嘛,那反馈之后会根据用户输入的内容去做相应的一个 逻辑的处理,比如说你是 yes, 那 就是调用接口恢复会话,表示你同意了这个接口,哎,同意了这这次的工具调用。那这个时候大家可以看一下,里面有一个很关键的一个 一个中断类型叫 accept 的 这个类型,那如果是其他几个就是它的对应的类型是不一样的, 大家可以看一下他这个对应的类型是不一样的。那这个类型主要是用在哪里呢?也就是在用户输入完了之后呢?他会把这一块的内容返回给你的服务端,那服务端拿到之后 就是服务端拿到之后他会去做什么处理呢?他会去根据你的返回的这个中断的类型去做不同的处理。那这块的逻辑在哪里呢?逻辑是在大家可以去看一下,在我们的这个源码里面有一个,我把它封装到了一个兔子, 那兔子里面呢?主要就是把所有的工具全部封装到了这一个脚本里面,那这样的话我们就可以在我们的这个后端服务里面直接去使用,去调用,所以在这个里面大家可以看一下,看一下我们使用了一个为工具添加人工审查的这样的一个功能,在这个功能里面我们会根据它所反馈的终端数据的类型, 四种类型就四种类型的不同会去做相应的不同的处理, 那这个处理呢?比如说举个例子,比如说这个编辑,那这个编辑的话,我们一旦中断返回的数据,也就是刚刚前端它所封装的这个数据是这样的一个数据,那这个时候我们会拿到新的工具的输入,并且通过 去调用工具的这个 evoc 这个方法来去重新执行工具,并且把工具的最终返回的内容作为一个结果返回给导默写, 所以对应了四种类型,所以这块的逻辑是跟你前端的这个逻辑是要对起来的。那当然你也可以在这个 tos 这个角落里面去添加你自己的工具,或者第三方的 mcb store 的 工具,所以方便你去做呃管理 好,那这个呢就是以上呢就是关于有前后端整个的一个业务核心流程的一个一个梳理,都给大家梳理了,那大家对应着源码,也对应着这个流程图去读源码,会非常能够很很帮助你更好的理解。 那接下来呢还有一个就是在整个的一个前后端的这个脚本里面呢,里面也有一些很细节的一个处理,包括对于数据库的一个信程词的维护,嗯,包括一些方法都是使用的易步的调用的方法, 这个呢就不给大家详细去介绍了,那里面大家可以详细去读一下源码,自己去感受一下啊。 好,那最以上的就是关于整个的实操的演示和所有的前后端源码的一个分析啊。以上的内容呢,就是本期视频想给大家去分享的,也希望本期视频的分享对你有所帮助。

浪差一点零的正式发布,标志着我们大模型应用正式迈入企业级的工程化时代。今天我将用二十分钟时间带你快速完成你的 企业大模型应用接口标准化组建模块化与全链路工程化调用不同的一个大模型,如 g p e 通讯千万那么快速处理我们工具的调用计管理以及错误重试,通过可附用的 a 帧和中间件机制,快速搭建客服或者说知识库, 数据分析等等场景,无需重复造轮子,开发效率直接提升百分之五十以上,显著的降低我们集成与维护成本。看完这期视频,即使你是零基础,也能动手搭建一个你自己的企业级 ai 应用,那么下面我们就一起来看一下。我们今天主要分为两大部分, 首先呢啊,我们第一部分就是我们系统的认识量尺,无论你是为了面试,还是说我们构建对技术的整体认知,那么这部分都尤为重要,我们将为你梳理核心的概念、设计思路以及应用场景,帮你打下扎实的基础。那么第二部分呢,我们将通过哈三个循序渐进的代码, 那么带你亲手体验浪秤是否好用如好用,那么程序员的直觉啊,终究来源于什么呀?手动实践,光讲理论肯定是不够的。那么我们先来看第一部分我们系统的先认识一下浪秤, 一句话来总结浪秤一点零,它是一个干嘛呢?它是专门用于我们企业啊,建立生产级的 ai 智能体 而设计的轻量,重点是看我们他的一个重呃特点哈轻量稳定,模块化轻量,意思就是我们这个哈架构不需要占大量的一个内存和显存稳定,现在的一点零版本是一个稳定更新的版本, 你如果使用浪尺,之前零点三他已经被淘汰了,他不再更新了,可以理解吗?那么模块化呢,就是什么意思?他把各个功能都组成了一个一个的模块,那么我们只需要调用,不需要想哎,他到底是如何实现的呢?就是这么简单。 那么什么是 longchain 呢?它是哈,其实也很简单,它是我们大模型以外部工具和数据的桥梁,因为啊,我们是不是要有 a chain, 大家都知道 a chain 吧,我们可以哎,让大模型能够长出手脚,对吧? 那么如何让大模型变成 a chain 呢?我们就可以通过 longchain 来实现,那么,哎,原来是只有大圆模型对不对?它不能够干嘛呀?调用工具是不是?但是我们有了 a chain, 是 不是可以调用工具? 那么如何,哎,让大圆模型变成 a a 镜头呢?就是通过浪铲来实现,不知道大家现在懂了没有呀?应该懂了吧,那么我们一点零版本呢,就是在二零二五年十月份正式发布,他完成了,之前哈之前浪铲 其实就是做着玩的啊,其实真的刚开始他没想到能够这么火,但是随着啊用的人越来越多,之前的浪铲就是一直在打补丁,打补丁,打补丁,但是发现好像补丁已经打不了了,那么他就只能干嘛呀,推倒重来,于是原来是零点三,现在 一下子跳到一点零,很多人说那零点四,零点五呢,是没有的,因为他觉得零点三已经补不下去了,我们直接推出了一个新的版本,把这件全部推导出来, 所以说你现在谁在教你啊?让车零点三,那他是害你的啊,浪费你的时间,可以理解吧?那他核心定位其实我前面已经说过了哈,就是快速构建我们智能体,开箱即用,因为我们都是干嘛呀?都已经模块化封装好了啊。 然后的话,我们接下来来看一下 launch 一 点零的三大核心升级。其实这三大核心升级,其实我们呃归为一点就可以了,其实非常简单,就是简单了,以前很复杂东西,但是现在几行代码就可以操作了,非常非常简单化啊,原来复杂的这两个功能,现在只需要我们这个 grade agent 就 可以了, 非常非常省事啊,人模型了,工具了,还有提示词等等的一些东西啊,非常非常省事。好,那么的话它比原来的 long chain 有 了哪些?呃,进化呢?就是多了两个哈,首先第一个就是我们中间线系统,为什么会有中间线系统呢?大家想一想哈, 首先第一个啊,这个叫压缩长对话,就是我们在跟 a g 的 进行对话的时候,发现随着我的轮次增加,我的上下文溢出了,那么但是现在我们有了自动压缩长对话, 然后啊,托米,就是这个托米什么意思?你想想,我们企业内部是有有一些数据是敏感的,不能被外界知道的,那么他可以实现托米,那么人在回归审批就是人机结合,大家想一想哈,有些东西我们人类,我们人类是必须要参与审核的,就比如说我们想在医疗模型哈,大家想想医疗模型, 那我让他帮我回答的时候,我们需不需要人类啊?这回答给用户是不是?那么中间我们直接回答给用户吗?不,绝对不是的,我们中间必须加到人为人工审核, 因为我们医疗像,像什么金融这些高啊,准确率要求的一定要加人工审核,那么我们就可以在 launch 中直接加啊,就不需要写很多很多代码,那么还可以动态的切换模型,那有些问题比较啊,比较简单,我们就使用低成本的模型,如果有些问题非常复杂,我们就切换为高性能的一个模型,在 launch 中也可以实现。 那么下面的话就是我们啊浪叉的几个包,大家自己来看一下哈,我们等一下会用到其中的哪个呢?浪叉啊啊浪叉、 go 杠、 o p a, r 这些会用到,其他的话,我们后续如果哈后续还会给大家讲到的话,会后续陆续的一个一个使用好吗? 那我其实到现在哈整个浪铲我就已经啊简单的概括完了哈,并不能说真的讲完了,因为它内容非常非常之多。如果你想进一步的了解浪铲的话啊,大家建议大家来到浪铲的官网,但是啊浪铲的官网它是干嘛需要连接外网?那么我这里的话给大家一个小建议, 这个建议是什么呢?你可以来到 luncheon 中文教程,这个他不是官方的哈,他只是把这些东西的啊文档给翻译了一下子,然后拉到了我们中文啊中国,我们中国就直接可以看他,然后你可以在这里直接点击他的一些教程,你要怎么学,怎么学,怎么学啊,学习这些东西啊, 怎么在这做都可以在这里进行来学习,可以看到吗?啊,如何按快速使用安装快速入门理念,那么你想深度学习的话,一定要啊,充分利用我们理念,那么你想深入学习的话,一定要慢一些些, 他需要一定的翻译时间,那么建议大家有条件的话,你可以访问浪铲的官网,在这里的话我们就可以来访问啊浪铲的一些各种各种的一些东西好吗?那么好,这句话我就不再多讲了,因为理论终究是理论,我们程序员始终是要实操的,那么接下来我们进入到浪铲一点零的实操部分, 我们来看一下我们的第一个代码,那么这个代码是干嘛呢?就是我们使用浪铲第一次和我们的大模型进行对话,哎, 那么有人就问,阿水,你这代码怎么来的呀?其实我也是从官网上考来的哈,我们在这里哈,我先翻译一下子,那么啊,我打开的是官方的网站哈,这里有个快速入门哈,那么在这里往下,其实有一个官方的例子,但是这里是使用的 cloud 的 一个 api, 但是我想,哎呀,咱们国内的好多用户好像用不了 cloud, 那 么不知道怎么改,那么我这里哈就给大家改了一下,我们使用了一个硅基流动的一个 api, 那 么这 api 怎么申请?其实非常简单啊,你只需要在我们的浏览器中搜索硅基流动, 然后啊登录注册,然后这里的话它就会免费哈,免费的给你十二块钱。好快,还是十四块钱,我给忘了哈,那么有这个额度,你直接在这里哈,你新建一个 a p m 幺就行了 啊,当然你不要使用我的 a p m 幺,因为我等会讲完课之后我就会删除,好吧,那么 a p m 幺我们知道了,那么大家代码只需要按照我的来就可以了,那么如果说你想说,那么我能不能换成 facebook 的 呀?可以,你也可以把这个 api 和这个哈网关换成 type c 的, 或者说同意的都可以,你自己随便换就可以了好吗?那么这个代码我们来简单讲解一下,这里的话,我们使用 luncheon 的 open ai 接口,那么这个的话,其实我们在前面是讲过的, 它是干嘛的呢?啊?在这里哈,它是我们一个厂商的集成,那么使用我们这个接口的话,你就只要我们这个模型支持这个,呃, oppo air 的 接口我们都可以使用,所以说我们建议大家使用 longchain 哈这个 oppo air, 所以 说国内的一些东西都是可以使用的哈,大家不用担心我使用不了,国外的怎么办,也是可以使用的。 那么好,然后这里的话啊, chat open a i, 这个就是和 open a i 对 话,这个大家一定要记住,这是不能错的,前面是我们的变量还是没问题的,然后下边的内容就模型名字,然后 api 和网关,那么啊, 你你,你肯定跟我不一样哈,那下面的话就是我们跟大模型进行对话,那么这里的话,我问大模型,请告诉我美国有几个周,我直接来运行一下,那么运行的话是需要一定时间的,因为它需要调用我们的 api 接口,然后呢啊,还要大模型进行思考,是不是啊?那啊,这里的话已经思考好了,我们来看一下, 因为我的问题比较简单,他可能哎,回答就比较快,大家可以看到有五十个周,是不是呀,那么这是我们第一次跟大模型对话,发现好简单呀,但是我们这节课 好像不是这么简单吧,我们是要做的 agent 啊,对的,但是你要是连跟大模型对话都不会,那么肯定是不行的,现在你已经会跟大模型对话了,那么你只需要在里面加上工具就可以变成 agent。 那 么我们来看一下我们的第一个 agent, 这个 agent 的 话也是我们官方的一个代码,然后我进行相应的修改,大家如果感兴趣自己去官网查看就好了,我就不给大家再演示了, 那么我们来简单解读一下这个代码,那么上面这一行就不说了哈,因为我们调用的是 open 的 库,那下面的话,我们使用 long chain agent 和 tos 这个 agent, agents 就是 我们要创建什么智能体了,那 tos 就是 我们要创建工具给到我们这个智能体,对不对? 好吧,这两行我就不再多多解释,这个的话是不是跟刚刚一样呀,我只是变量名改了一下子,原来是 l l m, 现在是 model, 那 么啊,这是都是一样的,那么下面的话,这里有两个工具,一个是啊,一个搜索工具模拟的哈,这里并不是真实的搜索工具模拟的,那么下面的话是或许 当前位置的天气,那么也是模拟的,好吧,这是官方给的示意,那么他就会说我输入一个位置啊,他就会告诉我啊,某某的天,某某的天气是晴朗七十二华氏度。好吧,那么下面的话,大家发现没有,其实对话都是一样的, 是不是 interact, 对 吧?那么所以说不管是 a 帧的 interact, 还是说呃 l i m interact 都是一样的,可以理解吧。那么 a 帧的话,我们使用创建每一个 a 帧,里面填上 model, 然后还有什么工具,后面还可以加什么记忆,还可以加一些别的组建,具体可以怎么加,大家参考官网 这句话我就不再过度讲解。好吧,现在不知道大家对这个代码有没有懂了呢?啊?应该是可以的好吧,因为它比较简单,非常简单,是不是啊?我们这里只是设置一个模型,设置了工具,然后把我们的工具和模型都给到了我们的 a 帧, 是不是啊?然后我们就跟 a 帧进行对话,问他旧金山的天气如何,然后返回我们的结果,我们来执行一下这里,执行的过程中我们先给大家暂停,等执行好了我们继续来讲, 我们来看一下。哎,这里的话好像是没问题,对不对?我们来看一下设置答案,我问他旧金山的天气如何,然后他给我回复的什么啊?我来帮你查询旧金山的天气情况,然后他调用了这个什么呀?调用我们这个工具可以发现吗?啊?调用我们这个工具, 那么后面的话,我们来主要来看他的回复哈,那符合我们需求,再比较往后哈,因为他中间很多调用工具的,可以看到调用我们这个工具了,是不是?然后,哎,我们给他地址是旧金山,然后看他如何返回的,返回在这里,旧金山的天气晴朗,完全符合我们的格式对不对?所以说效果还是非常不错的。 但是这里又有同学要说了,阿水你这个代码也太呆萌了吧,对我来说一点作用都没有。当然不是,我们要想让我们的 a g 的 发挥作用,我们只需要非常简单的一个动作就可以了,我们改变我们的工具,我们只需要把我们的工具改成有限制记忆就可以了。那么比如我们看来第三个代码, 那么这个代码我们就改动了一个工具,大家看一下哈,这个工具是干嘛的呢?就是可以把我们的结构化数据变成 s c, s v, 然后并保存到指定路径,非常非常简单啊。那具体的我们这工具是如何定义的,我就不再多说了。然后其他的东西都是跟刚刚一样,我们这里只是加了一个系统的提示词, 好吧,然后可以看到吗? a 镜头里面我们只是给他加了一个系统提示词,告诉他系统提示词是这些,其他的没有任何改动,那这里的话我们就把我的数据告诉他,然后,哎,大家可以看到, 然后哈其他的没有任何改动,能够看能够看到吗?只有工具不一样,加了个系统提示词,前面的这些模型的东西都是没有任何改动的,所以说我就不再多讲了, 具体的一些代码啊,我都已经给大家准备好了,大家只需要私聊找我领取即可。那么我们来执行一下,看他最后结果,他能不能把我们的这个数据保存到我的本地呢啊,在这里我先暂停,等他执行好之后我们继续来讲。好了,我们现在来看一下哈, 中间这警告我们先忽略不计,不用管,那么中间我把这个数据,然后下面有很多很多数据,对不对?然后啊,他中间开始调用,是不是告诉我一些路径了,还有一些数据了,他把我这些数据给格式化了, 因为我要干嘛?我要一个字典形式进行填入,对不对?他会把我格式化,然后呢?哎,开始调用我们的工具了,然后会把我这东西给它变成一个字典的形式,然后进行进行输入, 虽然说我输的形式不是字典,他会帮我转成字典的形式,然后一步一步的就写成,我也给他录镜了,是不是他也会帮我保保存一共四套数据,我们来打开一下 啊,是完全没有问题,是不是我们来给它转换成表格来看来看完全没有任何问题。那么现在你还说我们用狼站写的 a g 的 没有显示意义吗?应该不是,我这里只写了一个简单的工具,因为我时间花费比较短, 如果大家啊想把你的业务通过 luncheon 转化到啊大模型去做也是非常容易的,我们只需要注意你要选用合适的大模型,而还有一个花费的问题可以理解吧,那么 到这里的话,我们今天的二十分钟带你搞懂 luncheon 点零怎么学。已经讲完了,那么我们今天主要讲了两部分,首先我们先系统层面的 概括了一下浪叉一点零的一个设计理念,它是一个大儿拳的一个工具箱对不对?它可以一些可组合,可附用,轻量结构原则围绕着我们大模型工具还有什么呀?还有 agent, 呃,这些构成,呃,一些清晰的一些应用吧,我们可以这样理解,我们把这些抽象东西组成一个清晰的一个应用,那么我们可以直接上手来使用。那么接着呢,我们又通过三层的实战代码, 从最简单的大家可以看到最简单的我们与大模型进行对话,然后再到带工具的 a 帧的视力,再到我们真正具有现实意义的 a 帧啊,我们一共走了三步,是不是一步步的验证了浪叉一点零,不仅上手难度低,而且拓展性极强,结构还清晰。 那么这里的话我们还可以进行简单的扩展,比如说我们可以加入记忆功能,是不是非常非常多,大家一定要自己进行扩展啊。我这里的话因为时间关系,我就不再多说了,无论你是准备面试,还是说做技术选型, 想搭建自己的一个 ai 应用,选择 longchain 就 对了啊,能让你事半功倍。那如果你觉得这期视频对你有用,别忘了点赞、收藏、转发,我是阿水,我们下期视频再见!


郑重警告,本系列视频耗时三个月制作,共计一百六十八集,一口气带你学会大模型应用开发,这次我们要学习的是 lan graph 加 react agent 实战 高德地图 mcp server 全流程拆解,从零到一,搭建 pi 对 接智能体。本期视频为大家分享使用 long graph 框架中预制的 react 架构的 a 进程去集成 mcp server, 本次选择使用高德地图的 mcp server 进行测试。那本期视频中所涉及的所有源码和资料均免费开源共享给大家,大家可以在我的视频解析中获取到项目地址, 大家进入到项目之后,把本期视频所使用的原码进行下载即可,那本期视频所针对里面原码是零一这个文件夹,那大家只要把这个工程给下载下来就可以了,待会我们会教大家如何去使用。 那在给大家实操演示之前,还是先给大家介绍一下本期视频所涉及到的一些概念,那第一个就是关于 long graph, long graph 框架是由浪线团队开发的一个开源框架,目的是在帮助开发者构建基于大源模型的复杂、有状态、多主体的应用。 他对应的官方文档在这个地方大家可以详细去看一下,那在后面再给大家介绍的时候,也会基于他的官方文档给大家介绍一些概念。那关于 non graph, 大家可以去参考无下这个项目,那这个项目的话,我是我之前分享的一个项目,在这个项目里面有详细的源码资料和视频分享。那大家进入到这个项目可以去看一下 一共有四期的项目,那最后一期的项目呢,是给大家实现了一个意图识别和分诊的 a 进程,那这里面也是给大家实现了一个呃工作流,那大家可以详细去看一下。那如果你对 long graph 不是 特别了解的话,建议大家先去看一下我这期项目的分享的内容 啊。第二个呢是关于 mcp, mcp 的 话,它相关的官方的链接我都放到这个地方,大家也可以详细去看一下。 那关于 m c p, 大家可以参考下面这个项目,那这个项目的话,里面也是有非常详细的源码资料和视频分享,而且都是开源免费的,那本期视频我们会使用它的 s s e 自动模式。 那接下来就是一个高德地图 m c p 所有的介绍,那这个所有的介绍大家可以到它的这个官方的文档里面去看, 介绍的非常详细。那这边的话,关于高德地图 m c p server 中所对外提供的能力,这边具体提供的接口详情给大家列出来了,那主要涉及到十二个接口,那在这十二个接口中呢,我们也会在下面接下来的演示环节使用 long graph 来一一给大家去进行测试。 那关于高德地图 mcp 搜我如何去使用,这边就不给大家详细去讲解了,大家去看我这两期视频,里面有非常详细的讲解。好,那接下来的话,我们就来看一下 在实操之前的前期准备工作。那在我们去操作前期准备工作之前,还是给大家介绍一下, 因为在一开始给大家去介绍本机项目的时候,我们会去使用 long graph 中预制的 react 架构的 ajax, 那 这个 ajax 呢?是 long graph 框架中预制的一个 ajax。 那 对于这个 ajax 的 介绍,我在这边我没有列出来,没有列列出来是因为我们可以去它的官方网站上去了解一下。 那对于我们可以进入到 long graph 的 官方网站,我们来看一下。刚刚页面被哦不小心回退了,我再来切回来,那切回来之后,大家在 long graph 的 官网中也就是对应的, 嗯,在这一块大家可以去看一下。那我这边是因为窗口变小了,所以它的菜单被隐藏了。到这边我们首先来看一下 long graph 中它对于 aint 的 相关的介绍,那这边介绍了一个是一个 aint, 它是什么?大家主要看一下这张图,那这张图它其实设计了一个, 呃,工作流,那这个工作流呢?从用户的一开始通过问题的输入到给大模型,那大模型通过对用户问题意图的识别,他觉得可以直接回答用户,那可能就直接结束。 那结束之后呢,他就会把大模型所生成的内容给到用户,返回给用户。那还有一种可能呢,就是他对于用户的问题可能需要去调用工具,所以他需要去 请求工具的调用。那工具调用之后呢,他会去生成一些工具的最终的结果,也就会返回最终的结果。那对于这个结果,大模型拿到之后会对这个结果进行观察,他主要观察是 当前工具所返回的内容足不足够来回答用户的问题。如果是足够回答用户的问题,那他就把问题直接生成给到用户,直接结束,那如果说他觉得不够回答,可能还需要调用其他的工具,那这个时候他继续走这个循环,所以整个的 agent 他 所 画出来的这样的一个循环的一个示意图,其实就是一个工作流,那这个工作流呢?工作流对于 long graph agent 来说的话,它就是一个预制,官方预资的一个工作流。那我们在我其他的项目里面给大家介绍这个 long graph 中的应用,尤其是我们最后一个 案例,给大家介绍这个意图识别的这个 a 帧的实现,他其实我们也是做了一个工作流,那对于映色过来的话,对于他这边预制的 a 帧的他其实背后也是一个工作流,也头也是使用的 graph。 好, 那我们了解了这个之后,那我们再来深入了去看一下,那深入看一下这,呃这块呢也是在他的官方网站上,在他这一块的介绍里面,那这个大家可以去看一下这个地址啊,他是在这个,嗯, 那这边的话大家好像看不到,看不到的话我把这个给放大一下给大家看一下吧。好,这边来稍微调一下。 那这边大家可以看到,就是在它当前的这个栏目里面有一个关于这个 a 帧 a 帧子的一个介绍,我们其实可以看一下这张图,那这张图呢?它其实是对我们刚刚看到的这张图的一个内部的一个放大,那我们这个可以来看一下。 那这个里面的话,一个是用户端大模型以及工具,首先用户发布了一个问题,那大模型拿到这个问题之后,他会给予这个用户问题,也就是 prompts, 通过这个 prompts 来判断当前能不能回答用户,如果可以就直接返回剧中的答案给用户,那如果说需要调用工具,他会进入到一个循环,那在这个循环里面就是会去不断的去调用工具,然后工具返回相关的 内容,那这个内容会封装成一个托马斯姐这样一个对象,然后返回那大莫西拿到,拿到这个返回的内容,再去判断 足不足够回答用户问题,如果说觉得足够回答用户问题,那就返回,如果说不行,那再去继续调用工具,所以它这个是一个循环,那这个还有一个我们刚给大家介绍了这个锐 x 这种架构,那这个架构呢?在这一块又是呃在这个地方 给大家看一下,在这个地方,在这个 long graph 这个框架的这个介绍里面的话,大家可以去看一下这个东西。那这个 react 呢?它是一个通用流行的一种 aint 的 架构, 它主要包含三种能力,那这个三种能力呢?也是它的一个核心,那第一个就是调用工具的能力,第二个就是它要有记忆,也就是它要有足够的上下文,它要有足够的一个大的环境在。 那第三个就是它有自动规划的能力,就是基于用户的一个问题,它能够自己去规划,应该如何去处理,应该第一步先调用什么工具,接下来再调用什么工具,所以它要有包含这三种能力。那关于 long graph 总它所定预定义的这个 agent, 也就是符合 react 这种架构的 agent, 它也是 结合的这三种能力来去实现的,所以这边的话就简单给大家介绍一下,大家可以详细看一下官方文档。那关于这个工具的调用,那对于工具的调用他这边有个示意图。那对于大模型来说,首先你的工具会 作为一个结构化的一个内容的存在,放在这个地方,那大模型是知道你这个工具的存在的。首先这是第一个,紧接着用户问了一个问题,比如说这个二乘以三等于几,那对于大模型来说的话,他拿到这个问题,他首先能够去知道我需要去调用一个工具,那这个就是他的意图识别也是他的, 嗯,其实是他的这个 planning 的 一个功能,他要去规划,他需要去调用工具,所以这个时候他就会去知道有这个工具的存在,所以他会去执行,那执行的话,他首先要把这个工具所需要的参数给拼接好,所以他最终拼接的是这样的一个 内容,最后去调用。那么型,呃,调用工具,那工具呢?它其实也是个节点,在 long graph 中所预定义的这个 agent, 它背后的这个工具它其实就是一个节点。那大家如果说不知道 graph 中的节点和边以及条件边是什么样的一个概念,那我建议大家先去看一下我这个期视频里面的相关的内容, 那太基础的、太细节的东西就不给大家去介绍了,那这就是整个一个工具调用的这样的一个过程。那紧接的就是 memory, 那 memory 的 话,它其实在 long graph 中它主要涉及了两块,第一块是它的 短期记忆,加快是它的长期记忆,那短期记忆它其实更偏重的是在县城内的,也就是在绘画内的就一个绘画, 一个绘画它叫短期记忆。那对于长期记忆来说的话,对于 long graph 中所定义的,它其实是一个跨县城的,也就是跨绘画的永久保存在那个地方了。就比如说举个例子, 呃,比如说一些藏场景需要实时拿到用户的偏好设置,就是不管不管你开了多少好多少个绘画,那对于你的偏好设置,在每一个绘画里面可能都是要用到的,所以这个就可以把它保存到长期记忆里面来。那关于这两款呢? 下面有三种实现方式。第一种是叫 stat, 也就是它的一个状态,其实就是它的整个的一个环境,上下文环境,那这个 stat 里面的话,就是用户可以去自己定义, 那在整个的一个图运行的过程中,是可以去实时获取到这个状态的,并且每一个步骤执行之后,都会把相关的内容存到这个状态里,所以它是一个大的环境。那第二个呢?就是 checkpoint, 那 checkpoint 呢?主要针对于 呃,就是短期记忆的,那短期记忆的就是你可以把当前的这个绘画通过一个 呃现整 id 的 方式来去指定。比如说大家现在看到了很多的大冒险的应用,你去创建一个绘画,其实背后是创建了一个 c 型 id, 那 这个 c 型 id 所对应的其实就是呃在 long graph 中,它就是定义了一个 tick points, 那这个 checkpoint 呢?它可以是基于内存存储的,也可以其基于数据库持久化存储的。那拿到了这个 checkpoint 之后,你只要通过一个 c 型 id, 它就可以通过 c 型 id 来区别于你所存进来的 你的内容是跟 c 型 id 绑定的,那这样的话就很就能够做到你每个绘画内容是独立的,互不影响的,所以是它是就是通过这个 checkpoint 的 方式来实现的。那还有一种呢,就是刚刚说的长期记忆,那对于在哈这个长期记忆,它是通过一个 store, 那这个呢,就是一个持久化的一个存储,就永远存在那个地方呢?每一个绘画,每一个 c 线 id, 或者叫每一个呃现场 id, 它都是可以去使用的,所以这是三种方式,它对应的是分别去为了实现这两个能力, 在 lan graph, lan graph 中它所提供的一个呃三种可以实现的这种方式。那这一块呢,在我的这个项目里面也有非常详细的介绍,而且我是分呢分别给大家去介绍了,那这边大家可以再详细去看一下, 那这个就是刚刚所说的这个记忆的这个功能,那还有一个呢,最后一个就是它的规划量能力,那对于这个规划来说的话,在一个工具调用的 aint 当中,大模型是在一个循环中会被反复调用的, 就在每一步当中, agent 都会决定去调用哪些工具,以及这些工具的输入应该是什么,然后去执行这些工具,并将输出作为观察结果反馈给大模型。当 agent 认为他已经掌握了足够的信息来解决用户的这个请求, 就不需要再去调用,调用任何工具的时候,那整个的一个循环才会结束,所以他这个规划的能力就他自己先会去规划整个的一个关于用户所问的这个问题,如何去一步一步的把 这个问题给解决,他有这样的一个能力的存在,那具体的一些东西大家可以详细看一下,他的官方文档里面也写的非常的详细。那本期视频的这个应用案例呢?我们也是使用 a 政策, 也就是 x 架构的 a 进程来去跟 m c p server 进行交互,我们也会在代码的过程中给大家去拆解它输出的内容,它是怎么在内部去进行规划的。 但接下来还是回到操作文档里面来,那前期准备工作的话,第一个大家要去搭建集成开发环境,那开发环境的搭建我们是使用的 and call 打和 pq, 大家可以参考这一期视频里面有非常详细的操作演示。那第二个呢就是大模型 接口调用的方案,那这边提供了三种方案给大家,这边推荐大家使用第一种方案也就使用代理的方式,那代理的方式大家可以去使用这个代理,那我所有的视频也都基于这个代理去给大家演示的。当然逆一如果有自己的代理平台,你也可以去使用你自己的代理平台, 或者你使用国产的一些模型也可以,都是可以的。那关于这个的项目中所涉及到的原码,我都是基于这个代理平台来去给大家演示的,如果说你换成你自己的,那你就要去做相应的调整, 嗯,还是建议大家可以去使用这个代理平台去做相关代码的测试,嗯,比较方便,那我们在后面的演示过程中也会给大家具体去讲解。 好,那下面的话就是项目的初步化,那在项目初步化之前,这两步也是一定要完成的,因为我们在后面会用的。好,下面的话我们看一下项目初步化,打开编辑器,那打开编辑器之后,大家直接新建项目,那项目名称的话直接粘贴过来 虚拟环境的拍摄版本选择三点幺幺这个版本,那接下来我们就点击创建,那这个时候呢就等待他整个项目构建完成之后,把刚刚下载的源码拷贝到这个项目的根目录就可以了。好,这边他已经创建完成了,完成之后呢我们就来拷贝一下代码, 只要直接粘贴就可以。那粘贴完成之后,大家看一下这个目录结构里面有一个文件夹和一个文件, 那我们本期视频所对应的原码是在这个文件夹里面,我们可以打开他的操作手册,那这个操作手册刚刚在 github 上大家看到的是一样的。那紧接着我们再往下,那这个项目,我们把代码拷贝到我们的工程里面来之后去安装项目依赖,那这个依赖呢?大家只要打开一个命令行终端, 打开命令行终端之后,大家确定一下你的当前所选择的虚拟环境对不对啊?刚刚我们在构建项目的时候,虚拟环境的名称是跟项目的名称保持一致的,所以我这边是正确的,那保证进去之后就可以去依次安装下面的这些包,那这边的话我就依次给大家去安一下, 那安装的话大家直接复制粘贴到这个地方,直接去运行就可以了,那这边的话我就先把它所有的都安装完成之后再继续, 那我全部已经安装完成了,安装完了之后,大家可以通过这个命令来检查一下你当前所安装的版本对不对?那这边是建议大家使用我这边列出的版本,那截止到我录这期视频,这个版本都是最新的, 那建议大家先使用我的指定的这个版本,大家先对项目进行测试,那测试没有任何问题之后,跑通之后大家再去做相应的升级。 那接下来就是功能的测试,测试的话只要运行这个脚本就可以了,我们打开这个脚本,那打开这个脚本之后,在运行这个脚本之前,我们还是一样先来给大家看一下现象,嗯,然后再来去给大家读一下这个代码。 那在运营这个脚本之前,首先第一步你要去做大模型相关参数的配置,对于大模型参数的配置,这边我使用的是代理的平台,那这个代理平台在这个地方 大家也可以详细去看一下,里面有关于这个代理平台如何去使用,非常详细的讲解。把这个是代理的一个平台,那大家点击这个链接之后,会进入到一个这样的一个代理平台呢,大家只要去注册,那注册完成之后, 大家去申请一个 aprk, 那 aprk 申请完成之后,大家只要去做我现在代码里面的配置,第一个是你的 url 地址,那大家只要去 写这个 url 地址就可以了, aprk 就是 你刚刚申请到了 aprk。 那 再一个呢就是你的模型,那模型本期视频我使用的是 deepstack 这个模型,那这个模型你如何去选择呢?就在这个平台里面有个模型价格,在这个模型价格里面列出了当前可以去使用的模型,那这边的话大家可以切到这个。呃 deepsea, 那 这个 deepsea 呢?下面有它的相关的模型的说明,并且有它对应的它在哪一个渠道 可以去使用,那这个渠道对应的就是你需要在这个地方,在你刚刚这个 a p r k 的 过呃创建的过程中,你要去选择这个分组, 那这个分组的话对应的就是你大家刚刚看到的这个,那这里面模型的话也有很多大家可以选择性的去使用及相关测试,所以这个平台非常的方便,很适合去你进行学习。那这个是呃这一块的说明, 那如果说你是用自己的大模型,你只要把相关的参数进一替换就可以的,只要是它是符合 open e 压的接口风格的都是可以的。好,那紧接着的话,我们就来先使用非流式输出给大家去测一下,那我就先把这一块给注掉, 那我们先用非流式输出,我们把这一块可以打开,那我们是使用的高德地图的 mcb 的 搜我,所以我先来给大家测试一下,那我测就测这个这个经纬度所对应的位置是哪里。 那这边的话大家在运行这个脚本,首先你要进入到脚本所在的文件夹,那文件也就是这个脚本所在的文件路径,那这边的话我已经进入到这个路径里面了,所以我直接去运行就可以了。 那我们先来看一下现象,那我们看一下它整个的一个输出已经完成了,完成之后我们先来去看一下它的一个过程, 那这边的日制结果大家可以去看一下,我是对它最终输出的结果进行了几何化的一个展示,那方便大家去理解。首先我们可以看一下它整个的一个过程,我们先不去看代码,我们先来读一下它的一个现象。现象的话,首先它第一个是叫 黑油门 message, 那 黑油门 message 呢?它其实对应的就是用户消息,也就是你的用户问了一个问题,那这个问题对应的是它, 那用户这个问题传入到你的这个工作流里面之后呢?那紧接着大模型拿到这个问题之后,它会进行相关的处理,所以第二个消息是 amessage, 那 amessage 的 话它会去判断用户这个问题它能不能够直接回答, 如果说不能直接回答,他在考虑关羽用户的这个问题需要去调用哪一个工具,所以他这边最终选择要去调用这个工具,那这个工具是什么呢?那这个工具的话,大家可以看一下这个里面关羽高德地图 m c p server 他 所对外提供的能力, 那这边他对应的工具就是第一个工具地理编码这个工具,那他的一个描述就是将一个高德经纬度坐标转化为行政区划地址信息,他所需要传入的参数需要一个经纬度信息,所以这边他 所匹配的参数就是把经纬度的这个参数给匹配上了,那这个经纬度从哪里来的?就是通过用户的问题拿到了这个用户的问题,把这个经纬度匹配到了这个工具所需要 构造了这样一个参数,那拼接好之后,他的下一步就是要去把这个工具去调用工具节点,那工具节点也就是他的下一步,那下一步的话就是消息三,那这个时候工具节点接收到大模型所给的这个 参数之后,他会去调用工具,那这个调用工具的过程最终会返回一个结果,那这边的话就是一个结果,那这个结果的话对应的就是高德地图 m c p 搜我对应的这个工具,他所返回的最终的一个结构化的一个数据, 那他连门两个之间是如何通信的呢?就是因为我们现在运行的这个脚本,它其实类似于 m c p 中的一个 client, 那 也就是一个客户端,那跟你的高德地图 m c p server 是 如何通信呢?我们使用的是 s s e 的 模式, 那关于 s s e 的 模式,大家如果不是特别清楚,大家可以去看我关于 m c p 协议相关的内容,那简单来说就是大模型把相关的接口 以及以或者说是 m c p clients, 把相关需要调用的工具的这个接口信息,会通过 pos 的 请求的方式把它发送给 m c p server。 m c p server 接收到之后, 请求它背后封装的这个工具拿到最终的结果,把这个结果通过 s s e。 长连接的方式推流,直接推到客户端,也是推到这边来。那大模型也就是我们对应的这个工具节点, 也就是这个工具节点,他就会接受到最终的一个返回的结果,流程就是这样一个流程,那工具拿到这个结果之后,他会把这个结果最终给到大模型, 也就给到 a 进他这个节点,我们可以看一下,那现在就是 a m a c 接吗?那给到这个 a 进他这个节点之后,那这个节点他就会拿到,因为他已经知道最终的答案了,那他就会通过自然语言的方式重新生成一个人类更好更友好的方式。 呃,更友好的这种表达的这个内容,那就是经纬度,他所对应的地方是这个地方,那最终的话一个结果就会输出给用户,那最终用户达到了 生存的内容,就是这个内容,所以大家可以看一下它整个的一个内部的一个过程。那我们有了这个画面之后,我们再来看一下,因为在我们运行这个脚板之后呢会生成一个图, 那这个图呢就是当前它整个工作留了一个图,那关于这个图我们可以简单来理解一下。首先大家如果看过我之前关于 long graph 的 介绍的话,大家应该清楚在这个图里面它每一个部分代表的是什么。首先这个部分它代表的是节点, 所以它这个面有两个节点,第一个是 a 进特节点,第二个是兔子节点,它有两个节点,那对应的这个有一个实线的箭头和一个虚线的箭头,那实线的箭头代表的它是一个无需要条件的一个。 呃,一个边,也就是这个兔子节点它所返回的内容可以直接给到 aint 这个节点它是不需要条件的,就是它是接收到之后它就会直接给,所以它是一个直连的这样的一个边,那对于这个虚线的这个边呢?它是带条件的, 就是对于这个 a 进的这个节点,他接触到用户的问题之后,他需不需要去调用工具是有选择的,如果需要调用工具他就会走这条线,如果不需要调用工具,他会去直接结束掉,直接把生存的内容给到用户。所以这个虚线的边他是一个条件边, 所以大家看到在这个边,这边所表述的他其实就是一个循环, 就是一个循环。那我们再看结合刚刚所看到的这个现象,是不是就是对应的是这样的一个流程, 那这个大家可以结合这张图,然后结合刚刚我们所给大家表述的这个现象,可以带大家去看一下。那关于这个循环,我们再给大家测试一个案例,大家就能够直观的感受到它是如何在这里面进行循环的。 接下来再给大家测试一个复杂的,我们来看一下它内部的一个循环。嗯,那这边的话,欧巴把这个语句给注视掉,选择一个稍微复杂一点的, 我们就选择这个路径规划,骑行的路径规划,我们先来运行一下,看一下它的现象,那这边的话我们先把这里面东西给清楚一下,那清楚之后呢,我们来运行一下这个脚本 已经运行结束了,大家可以看一下这个现象,那我们还是一样,我们从头来看一下这个过程。首先第一个用户等问题打对应的第一个消息, 那是要从上海芋圆骑行到上海人民广场,帮我规划下路径,那这里面是骑行,对吧?对应的是骑行。那紧接着大魔琴收到这个消息之后,他要去调用工具,因为他自己搞不定。调用工具之后,他匹配到了工具,他觉得他需要先, 因为他要去从上海域园骑行到上海人民广场,所以他先要去知道这两个地方所对应的经纬度是什么,因为你导航嘛,他喜,他要给予经纬度去做匹配,因为在他的这个工具里面,我们可以看一下 在这个工具里面的骑行的路径规划里面呢,所对应的这个接口,在这个接口里面他是要通过经纬度来去做定位的,所以你首先基于一个地方,你要先把地方转成经纬度,然后再去规划,所以他知道 他那一步进行规划的,他规划完之后,他觉得第一步我要先拿到这两个地方所对应的经纬度,拿到这个经纬度,然后再去掉骑行的工具,有路径规划的工具去做路径规划,那首先他拿到了这个 相关的参数,他也知道调到哪个工具了,那最终会给到工具,把工具接触到之后,他会把 对应的经纬度信息返回去,所以他有两个工具的返回的结果。第一个是,呃,这个, 第一个是哪里啊?第一个是那个上海芋圆,第二个是人民广场,那对于人民广场他这边能够识别住,他是一个路啊,一条路,所以这边好,他反正他都会给两个经纬度,拿到这个经纬度之后,大模型知道了有这两个经纬度了,那之后他要去掉第三个第二个工具,那第二个工具的话就是对应的骑行的路径规划,他要把 开始的地方的经纬度和目标地方的经纬度给到这个参数,最终再去掉工具,那工具最终会返回他整个的一个路径规划。那最后大模型基于这个路径规划呢?工具所拿到的这个信息通过自然语言再重进行重新的生成, 那最终得到的结果就是这样的一个结果,那大家可以用你熟悉的这个地方去做测试啊,那这边的话,反正我是跟高德地图的导航 app 上面我对比过,反正大差不差,差不多,因为本身他也是掉了高德地图的接口, 那最终大模型最终给到用户了一个信息,我们可以看一下就是这个信息,并且他给了一个链接,那这个链接的话,你点击之后他是可以跳到高德地图的一个外部端, 然后你并且他会把这个芋圆和相关的人民广场的一个路径一个地方给带进去,所以还是这是他最终返回的一个结果,那在这个结果里面大家可以看到他其实是里面有思考在的,也就是他首先进行了规划,第一步要干嘛,第二步要干嘛?最终要干嘛, 那对于其他的其他的问题就不给大家去问了。那这个关于这个每一个问题,我在 mcp 这个项目里面有一期是给大家, 应该是对应的这个第一期给大家每一个问题都给大家演示过,那大家可以去参考这一期视频,那当然大家也可以自己自己在测试这个脚本的时候,把每个问题都跑一遍, 是没有问题的。那紧接着再给大家测试一个,因为刚刚测试的是一个非流逝的输出,使用的调用的工具是这个方法,但还有一个总方式呢,也是呢 graph 中他所提供的就是一个流逝输出, 我们先给大家再演示一下流逝输出,最后我们再来读一下这个代码吧。那流逝输出的话,我们可以先把这个给开一下 啊,开完之后呢,我们先给大家打印一下最终那个结果给大家看一下。那我们问的问题是上海的天气如何,那也是这里面的其中一个问题。好,我们直接来运行一下这个脚本 不一样。 好,这边大家可以看到他打印的一个过程,刚刚是一个流逝的一个输出, 那这边的话是想给大家讲什么呢?就大家看一下这个现象,在这个自然语言表述的这个上面,他把工具的信息也打印出来了,就是这一块结构化的一个数据。那这一块呢?是 呃,高德地图他对应的天气的这个工具所返回了一个结构化的结果,但是我们也把它打印出来了,这个就要去想给大家去讲一下了。就是这个问题,那比如说我们把这个给打开,我们再去跑一下, 那这边大家看到的就是一个 最终深层的一个自然语言的表述,那前面呢?刚刚给大家看到的那个工具所返回的内容就没有了,那这块我们是做了什么处理呢?比如说我们再来把上面这个打开,更直观的给大家去看一下他的问题在哪里, 我们再来跑一下,那这边的话我就等待它完成之后我们再继续吧。那这边的结果已经输出完成了,它也是一个流逝的输出,我们可以翻到最上边,我们可以去看一下,那在这个地方呢,我们去, 嗯,我们把这个给标注一下, 我们来找一下它最终的一个结果, 我们来找这个,啊,刚刚标错了,又会,我重新来找一下。 好,这个时候我们重头来找一下,我们来找这个 long graph。 这个 node 有 一个对应的节点嘛?这个节点的话我们从上往下读,那上面这个呢是它对应的一个 token 的 输出, 这个我们待会在讲代码的时候会给大家去讲一下,它是返回了 token 和原数据。那关于这个原数据里面,我们可以看一下它对应的这一条数据的输出,它的来源的节点是 a 进的这个节点,也是对应这个图里面的这个 a 进的这个节点,所以我们可以一直往下找。 那最终的话我们可以看到在这个地方,在这个地方它的输出是一个结构化的数据。有时候我们第一次给大家演示的时候,带了一个结构化的一个工具返回的数据,那就是这一块的内容,那这个内容它所对应的原数据,我们可以看一下它对应的节点是 tos 这个节点,也就是这个是这个工具节点所返回的内容。 那我们在打印的时候,其实我们是没有去分到底是哪一个工具的打印,反正他是一个基于时间的一个流,我们只要这个流里面所产生的所有数据,我们都可以把它输出。那我们在这个代码里面做了什么样的一个逻辑的处理呢?就是 把工具返回的内容直接把它过滤掉,我们只展示最终大模型返回的内容,所以大家看到的就是一个正常的一个最终的一个结果,所以这个也是想给大家去用讲的这样的一个点,那你在测试的过程中 可能也会碰到这个问题,那大家可以去针对于不同的节点,在流逝输出的过程中可以针对于不同的节点,你可以去做相应的控制的。 那给大家演示完了之后,大家也看到了现象,接下来再来读一下这个源码,那这个源码呢?还是一样,我们从入口开始,首先我们进入到的是这个函数,我们点进去,那这个函数所定义的是 会定义并且运行 a 进程。那首先我们一一往下读,首先这一块的话,我们定义了一个实力化 m c p 所有的客户端, 那这个通过的方法就是我们在 long graph 中如何去使用 mc mcb server, 那 它提供了一个工具,那这个工具呢?所对应的就是 就是在这个库里面它所提供的这样一个方法,那这个方法非常的简单,只要把 mcb server 的 配置信息配置到这个地方就可以了。大会实力化得到一个 clients, 也就是在这个函数方法里面,它进行的封装,最终会得到一个 client, 并且提供了几个工具,那第一个工具就是会可以通过这个方法直接获取到当前这个 mcb, 搜索它所提供的工具有哪些,那这边的话大家也可以把它打印出来看一下。 好,那紧接着的话,我们得到了这个工具之后,下面的话这边呢我们在一开始也说了这个 aint 呢,它其实对应的就是一个 graph, 所以它通过这个函数,那这个方法呢,它是 long graph 官方它所预制的一个 react 架构的一个一个预设的 graph, 所以 大家只要去使用它就可以了。那关于它里面的一个参数,大家可以参考它的官方上面的介绍,也可以通过进去看一下它里面的相关的一个逻辑的实现需要传哪些参数。那这边的话第一个就是大模型,那大模型的话就是它 所使用了大模型的配置参数啊,这边的话在这一块你只要按照这种方式去配置就可以了。那紧接的第二个参数就是他可以去使用哪些工具,那这个工具的话就可以通过 使用这个方法所得到的一个工具列表,那大家只要把这个工具列表匹配给他,那这个 a 进特他就可以使用这些工具,那这个工具背后所对应的就是高德地图 m c p 搜索所提供的工具。那紧接的第二个就是你可以给这个 a 进特提供一个 prompt, 那 这个 prompt 就是 一个 system prompt, 那 这个 prompt 有 两种写法,第一种写法你可以直接去通过字幕串的形式进行表述,那它这个如果说你设置的是它, 那它的背后的逻辑,它会把这个字幕串也把它封装成 system message 的 方式,它会自动帮你去处理。那还一种方式呢,就是你可以提供一个 system message 的 方式直接给他,是有两种方式都可以,那这边的话就是有一个 system, 那 system prompts 呢?就是你每一次在运行 aint 的 时候, 他都会去,就是相当于这个 prompt 一 直在。那紧接着的话第二个就是 checkpoint, 那 checkpoint 主要是用来进行一个绘画 id, 也就是短期记忆, 所以这个 checkpoint 的 话,我们是定义了一个 checkpoint, 那 这边的话是一个简单的就是基于内内内存存储的一个 checkpoint。 好, 那这个时候我们 aint 就 已经定义完了,那定义完了之后直接通过这个 aint 就 可以去运行,但运行的话我们可以找一个看一下。 那运行的话我们可以先看一下这个非流式的一个运行,是通过这个 invoke 这个方法,那通过这个方法里面呢,我们只要去构造一个 一个一个消息就可以了。那这个 config 大家可以看一下,这个 config 的 话就是你需要传入一个 现场 id, 这个现场 id 就是 来表述你当前的这个县城是唯一的,也就是你当前你是用这个县城一跑的,那这个在这个跑的过程中所产生的所有的数据都是跟这个县城进行绑定的,那如果说你下一次跑你去,嗯,换成了二,那这个时候你的二里面的数据, 也就是短期记忆里面所存储的数据是不会有一,所以大家能够明白这个逻辑关系,所以它这个短期记忆如果你不是特别的理解,你可以去看官方文档,或者你可以去看我关于 long graph 的 一个 前面几期的讲解,那这个都是一些基础的一个讲解,所以都会有特别的特殊的一个英文案例给大家专门去讲解这个问题,这样的话你会更直观的理解好,那这个就是通过非流水的输出,那最终会得到一个结果,那我们把这个结果做了一个格式化的处理, 通过这个方法进行了一个格式化的处理,那这个方法的话大家可以去看一下啊,就去做了一个解析。 那紧接着呢,我们再来看一下非流式,呃,流式输出,那流式输出其实唯一的区别就是我们使用了这个它提供的 stream 这样的一个方法,那在流式输出的话,它会返回两个参数,两个内容,这两个内容是取决于你当前的这个流式输出的模式的配置, 如果说你配置的模式是 messages 这个模式,它会返回两个,那两个分别代表什么意思呢?首先第一个参数,第一个参数代表的是它会按照大模型的 token 进行输出,也就是它大,你在大模型,因为你背后的的 你背后所配置的这个大模型,它最终会以按照 token token 的 方式流逝输出一个 token 接一个 token 的 方式输出。所以对于你使用这种模式的话,你反馈给你的前端,也就是你的用户端也会以 token token 的 方式,所以你会接受到这样的一个 按 token 的 这样的一个内容,那紧接的就是每个 token 它返回对应的原数据。那刚刚大家看信上的时候也给大家解释过了, 就是你原数据可能会呃里面会包括你当前的这个所返回的这个内容是哪一个节点返回的,或者是还有一些更其他的一些详细的一些原数据信息,那那这些信息呢?是能够让你在接下来的处理中去进行相关的进行逻辑分析的, 那这个呢就是你需要一个输入,那输入的话就是你要去拼接一个会为 message 这样的一个消息体,那这个消息体就是用户的问题吗?紧接着就是你的 config, 就是 你当前去运行这个 ajax, 它对应的现成是哪一个? 那最终我们会得到这两个参数,那通过这两个参数的话,我们就可以把它打印出来,你可以去看一下记,然后接下来我们就做了一个处理,就是对于工具返回的内容,直接把它过滤掉, 然后我们只输出最终大模型给它返回,并且我们以这种流逝输出把每一个 token 之间加了一个竖杠,所以大家看到的最终的一个现象, 最终的一个现象就是大家可以看到我把这个隐藏在再给大家跑一下,大家看一下 大家看到的现象,就是一个流逝的动态输出, 上海的天气预报,那这个是对应的是它输出的, 所以它中间每一个 token 之间是用一个竖杠进行了一个隔离,但这前面是什么东西啊? 哦,前面是因为我们把那个工具的打印给打开了,也就是这个地方,所以大家可以看到它当前所 m c p 搜索它所提供的工具。有这么多工具。 好,那还有一个呢,就是关于这个刚刚给大家看到的这个图片,因为这个图片呢,大家可以使用这个方法把它可以打印出来,也就是我这边提供给大家的一个方法这一款,那大家可以去把当前你所定义的这个 agent 把它的这个对应的工作流的这个图给保存, 那对应的一个方法,就是这样一个方法使用它一些工具,那这个都没什么,那本期视频就为大家介绍到这里。


看一下 long grief 里面的 stream 啊,我们之前有讲过关于那个 invoke 就是 这个,这个的话就是一个同步等待一次性出结果,然后这个的话是可以把它理解成是一个流式输出啊, 我们可以想象一下,就比如说你煮一碗面,普通的方法的话就是用之前的 in vlog 的 话,是要等面完全煮好以后才能看,然后如果你用嗯 stream 的 话,就相当于你可以让每煮一分钟就掀开锅盖,然后看一下面的熟度,然后每一步状态都能实时掌握。 然后呢它比较适合呢就是进行一些调试啊,或者说是实时监控的步骤场景,比如说循环处理数据和 ai 对 话的多轮情况等等啊, 然后我们来看一下整体我们要实现的逻辑啊,就是还是跟上节课一样,我们要进行数据抽象,然后转成大写处理,然后输出结果,然后一个简单的流程啊,然后呢并用 stream 的 话方式进行运行。 首先的话就是我们会传入对应的 hello long graf, 然后最后输出一个大输出,出一个大写的结果,然后呢传入一个自定义的,比如说叫 hello world, 然后呢对应也会返回对应的大写结果,然后还有一个就是用 for 循环便利 stream 的 返回结果,就能 逐个拿到每一个中间的状态,实现实时查看的效果。首先还是一样,我们需要进行先安装 rogram, 安装好以后呢,我们这里就是进进行一个定义啊,这这种东西的话之前已经已经说过了,所以说就不多说了,这里的话也是一样,我们进行了一个数据节点的定义,就是这里的话是呃出出发一个数据, 然后呢这里的话就是进进行内部执行,然后这里的话就是对应的呃,返回结果,我们还是一样,这里会定义一个字典的方式,用存存储共享的方式啊。然后这里的话就是定义各个节点,从哎,从步骤一到哎,步骤二到步骤三,然后这里的话就是对应的是一个呃启动节点的, 从哪个界面开始启动,然后这句话就是对应的变 s 一 到 s 二, s 二到 s 三,然后你的最后 s 三到最后的结束,然后这里的话就是一个变,变成一个可变的对象。然后我们这里使用的话,我们可以看到啊,我们我们我们这里的话就会变成一个对应的循环方式啊, 我们默认这句话还是只传了一个,呃,只传了一个空的,空空的那个字典啊,当然你也可以呃,跟他一样,就是上跟上节课的一样啊, stream 的 话他也支持一个自定义的,只只不过我这里没有写,大家只要把这里改改一下就可以了。好吧。然后呢, 呃,我们可以看见我,我们使用 for 循环,在循环这个 minecraft stream 的 时候,它会就是打打印出第几个步骤的下标以及中间步骤的结果。然后呢并且我们这个可以每每次进行加 e, 我 们来看一下。 首先第一个呢,就是我们可以看到呃,第一步的中间结果是呃 s e 里面它会有一个 hello my, 这是 hello long long graph 啊,因为这里面是默认自定义的吗?对吧?就是他自己定义好的抽象化的。然后呢?第二第二步的中间结果呢?是他会把它转成了大写,对不对?然后第三步的中间结果呢,相当于就是,呃,他会把这个值给 给,就是返回出来,就是我们可以实时看到他他里面的数据变化。而刚刚之前呢,我们来看一下,他是没有办法去看到实时变化的,好吧, 他是只他,只他是只能拿到最后的执行结果。这里的步骤一,步骤二其实是因为是我在这里定义的,所以说,嗯,大家大概是可以看到的,但实际上是看,实际上如果你要看到每个中中间步骤的话,其实还是要需要这个,哎, 还是需要这个对应的是追梦的循环方式啊,就是对应的去哪里了?好在这 呃,这个就是我们还还是要进行循环的,然后呢,我们可以得到得到一个结论,就是第一个呢,就是你使用 vivo 的 话,它也是支持对你传餐跟跟不传餐。然后第二个呢,就是它是一个流式的,你需要进行一个循环。 然后第三个呢,就是它可以获取到呃每一个实时的数据,然后第四个呢,它一般可能用于一些监控啊,或者说是实时查看的一些东西。
