00:17各位朋友大家好,今天这期视频是咱们这个 LangChain 系列讲解的第三讲,今天咱们这期主要的内容是讲解 LangChain 里边最核心最重要的一个概念,模块叫 Agent
00:35首先,我们来看看这个官网上给它的定义,它的定义是一段英文,我就不念了,我把它翻译一下,把核心内容给大家讲解一下
00:52就是说是在 LangChain 的这个 Agent 里边,最重要的一点就是它所采取的一系列的行为,都是由这个大语言模型来决定的
01:10和我们传统的这个程序里边不一样,传统程序里的这个程序的运行,运行都是这个 Hard Code,也就是说都是写好、预定义好的
01:28而在这个 LangChain 的这个 Agent 里边,它所采取的所有的行为,以及采用的
01:45 各行为的顺序,都是基于这个大语言模型的推理机制来决定的
02:01我们看一下这个图,就说明在LangChain里,边上的Agent其实是大语言模型模块、Memory模块和Tools模块的一个组合体
02:17这个Large Language Model(大语言模型)负责的是思考、推理、决策
02:33Memory模块主要负责的是记忆,负责上下文的记忆
02:48Tools模块是定义了一系列的工具
03:04也就是说,给定一个目标,我们可以完成这个目标,可以使用哪些工具
03:20因此,Agent就是这样的一个组合
03:36可能讲到这的时候,大家还是有一些不太明了、不太透彻理解的
03:52没关系,我们做了两个小的动画,相信通过看完这两个动画以后,大家对这个Agent就会有一个特别清晰的理解了
04:08然后看完这两个动画以后, 再结合我们对代码的讲解,一步一步的讲解,我们就可以自己轻松地实现一个 Agent 了
04:33好了,现在我们进入正式课程开始吧
04:58我们通过这个动画先来讲解一下,现在我们在传统程序中是如何控制一个程序的流程的,比如说,在给定一个目标之后,我们会用程序把它编制好,它要采取的行为,比如说,这个就是我们的目标,是让这只小老鼠吃掉屏幕上所有的奶酪,但要避开这些陷阱,也就是获得奖励,但要避开风险
05:23所有的控制都是由这个遥控器来控制的,也就是说,这个形象的遥控器其实代表了我们程序里面控制的流程,所以,这只小老鼠永远都是先吃左侧的那块,因为它没有自己的推理和思考能力
05:49我们的程序就是这样设计的
06:14 它永远不会先吃右侧的这块,无论执行多少次,它都按照一二三四这个顺序来完成这个任务,虽然看似很完美,不会出错,但其实它所有的控制,都是在我们的程序里边预先写好的
06:48它没有任何这只小老鼠没有任何自主思考的能力,所以这也决定了,就是说在我们的传统代码里边,所有的业务流程,都是我们人为控制的
07:23我们代码里边会充斥着大量的 these if...else 等等的判断语句,这就是我们传统程序代码里边对流程的控制的一个体现
07:57 好,我们通过这个动画,就可以来讲解一下,在LangChain里边Agent具体实现的原理和它这个所实现的步骤
08:31首先,我们先把LangChain里的Agent显像成是一个... 在原始社会边的一个原始人,在这个时候呢,他只是一个人,没有任何思考能力,也没有任何行动能力
08:51经过漫长岁月的进化,很幸运,他逐渐大脑发育,他开始有了思考和记忆的能力
09:11这个在我们的 LangChain 里面,其实就配备好了两个模块,第一个模块是大语言模型,简称 LLM,主要负责思考、推理、判断
09:31第二个模块是记忆模块,就是这个 memory 模块,它主要是来配合这个 LLM,配合让这个 LLM 大语言模型的判断可以更加高效
09:50这是一个记忆模块
10:10第一步,好,我们这个原始人已经有了自己的思考和记忆能力了,他现在可以做一些事情了
10:30同时,如果我们想让他完成一些目标,还需要给他提供一些工具,他才能具体完成一些目标,例如,我们给他了一些工
10:50 具有匕首、长毛、鱼钩、弓箭、石锤、大棒、火焰,好,这就是它所拥有的所有工具集
11:14有说在LangChain里边,这个Agent三要素已经具备齐全了
11:39第一个是大模型,负责决策;第二个是记忆模块,对决策模型进行支持;第三个就是工具模块,比如说如果我们现在给它一个目标,它就可以通过思考判断,来自发的决定你应该使用哪个工具去完成某个任务,或者是在完成任务中的某个步骤
12:03好,我们这个Agent,它就已经成型了,也就是说我们已经把它配置好
12:28好,在初始化配置完一个Agent之后呢,我们来看看,如果我们给Agent一个目标,或者给它一个任务,看看他是怎么通过这个判断推理,来完成这个目标的原理
12:53 啊,我们给的一个场景就是,我们给这个Agent一个最简单的目标,就是饿了要吃饭,要通过打猎的途径来获取食物
13:14第一天,我们这个人在出门看到了一条鱼,他通过在记忆模块里的搜索,知道鱼是可以作为食物的,所以他现在经过这个大脑模型的推理决策,从工具箱里选择了可以捕捉鱼作为食物的工具
13:34我们看到他选取了鱼钩和钩虎(钩子)
13:55那他第一步是用鱼钩,把鱼吊上来,同时他决定使用这个工具的顺序,就是第一步用鱼钩把鱼钓上来,然后第二步把鱼烤熟,就可以获得一顿非常丰富的晚餐了
14:16第二天,他碰到了一只兔子,同样的道理,同样的流程,他在记忆模块上搜索,兔子也是可以作为食物的
14:37好,那他继续进行推理决策,认为兔子是一个跑得非常快的动物
14:58 所以要决策使用不同的工具来进行捕猎,所以他采用了弓箭来把兔子逮到,烤熟作为第二天的晚餐
15:16第三天,他依然出去打猎,很不幸啊,没有碰到什么猎物,碰到的是临近部落的一个非常壮的一个大汉
15:34啊,这个大汉是来跟他抢食物的,所以他经过决策以后,已经把最初的目标——饿了要吃饭,已经转化成为消灭掉这个壮汉
15:52啊,因为如果不消灭他,以后所有的食物都可能被他抢走了,啊,就没有吃,没有饭可吃了
16:10 所以经过推理以后,他会在工具里边,选择所有最具杀伤力的工具作为武器
16:29啊,已经要把目标转化成为,由目标把这个目标由这儿吃饭,转化成为干掉这个壮汉
16:47啊,所以说最终的目标中间,已经新增了一个步骤,就是撞掉、干掉壮汉,然后再去捕猎
17:05 所以,这就意味着我们通过这个形象的例子,就可以看出来,所有的这些决策并不是我们程序预先设计好告诉Agent的,而都是Agent经过不同的环境的变化,以及对这些工具的深刻理解和判断,来决定应该用什么工具去完成最终的任务
17:43这就是Agent和我们之前在程序里边,在传统程序里边所采取的方式不同,所以,这就意味着,如果给Agent配置的描述够强大,它是可以自主地产生很多你意想不到的结果的
18:22好,经过刚才那两个动画的讲解呢,我相信大家已经对这个Agent的底层逻辑和它的这个运行模式已经有了一个比较深刻的理解了,所以,我们现在进入到一个实际操作的环节,就是通过一个项目的代码讲解,来实际地运行起来
19:00 来,我们来看 Agent 在这个 Lunchchain 里边是怎么运行的,我们这个项目的主要目的是给 Agent 一个题目,然后让它给你生成一个相对完整的小论文,这对于我们在平常日常工作和学习中都是非常有用的,所以我们看的就是,提出一个问题,然后它就开始给我们收集资料,最终给我们一个相对完整、质量非常高的论文
19:41待会儿我们会有一个 Demo 演示,现在我们先具体来看一下里面的具体代码
20:22首先第一步呢,我们肯定是要先初始化这个 Agent,然后给这个 Agent 配合上它的三要素,这是最基本的大圈模型、记忆模块,以及它可使用的工具集,这三个要素,我们在后边会分别详细讲解
21:03 还有这两个呢,是 agent 的类型和 agent 的角色描述
21:44首先,我们来修一下这个 agent 的类型啊
22:25我们看一下,我们选用的是这个叫 OpenAI 的 Functions 的,你看,我们看到 agent 类型里面有很多,负责聊天的,负责这个文档的等等等等啊
23:08我们之所以选用这个呢,就是说它已经经过一些优化了,大家可以自己去官网上看看这个具体的描述啊,我们在这里就不赘述了
23:51 所以呢,我们就选用的,是因为我们的项目目标是收集资料,汇聚、汇聚、汇聚成一篇论文嘛,所以选择这个是比较合适的
24:34所以我们就选用了这个 agent 的这个 OpenAI Functions 这个类型的 agent,然后呢,这个呢,是一个…… Agent 的描述啊,决策的描述,我们看这一块啊,是在这儿的啊,就是我们对 Agent 进行描述,也就是说它是一个啊,这个研究员啊,他所采取的就是到网上去收集资料,然后呢把它总结,同时呢要一定要是基于事实和数据啊,没有任何自己编造的成分,所以呢,我们在这呢,给他配的这个 temperate 也是真零啊,以及呢,我们可以要求他做所有的研究的时候呢,不要超过五轮啊,也就是说,这就防止他会不断重复地去调用啊,这也是控制成本的一个约束吧,所以呢,大家想想就用其他的这个角色的时候呢,还是我之前推荐的啊,就是用这个 FlowGPT 这个网站的,这个还是非常好用的啊,如果大家不知道怎么用的话呢,可以看我之前的视频,比如
25:17 像我们这个,这就是我们搜到一个research的,非常详细
25:17大家可以使用不同的prompt来定义我们agent的角色、性格、类型等等,这些可能会有不同的结果
00:00这就让大家去尝试了
00:00我们就用了一个比较简单的描述
00:01第二个就是,我们来讲一下大模型的配置
00:01我们刚才说了,因为我们希望它是一个非常严谨的、学术性的,所以我们不需要它发挥,所以就把它的随机性配置为0
00:02我们选用的这个model,是GPT-3.5 Turbo 16K版本,版本号是0613
00:02这就是它的输入输出的标志,这是它的一个时间车的标志
00:03我们选用它,是为了在G
00:03 PT 官网有很多这个模型可选,这个是GPT-4的,这是GPT-3.5的
00:04我们选用的是这个模型,大家也可以尝试不同的模型,选用不同的模型,看会有什么不同的结果
00:04它每一个后面都附有非常详细的描述,以及它可以接受的最大Tokens是多少
00:05我们选用的是这个Token很大,所以选择这个也是为了配合我们的OpenAI函数,也就是说我们的Agent这个类型来配合它,因此选择这模型就没有什么可说的了
00:05这个Memory我们配的是这个Conversation Summary Buffer Memory,就是它可以有上下文记忆的Memory,所以现在就是在
00:06 Agent的初始化以后,我们给它配备了三个要素,已经全部配置好,以及这个Agent的角色是什么,后面呢,我们会再详细讲一下
00:06就是说,我们给这个Agent具体配置了哪些工具集,也就是说它为了完成这个目标,可以使用哪些工具来快速完成这项工作,这就是工具集的一个体现
00:07好,我们来继续讲这个工具集,就是我们在给这个Agent的时候,给它都配了哪些工具可以调用
00:07首先,我们来看工具集的主要内容,有search,有去抓取网站内容,因为我们是一个在网上收集资料的Agent,一个助手,所以我们就是要给它配置一个,首先是能够去search,这个search我们调用的是Google Search的API
00:08 在这个视频的系列的第一集里,已经详细讲了这个工具呢,在这就不详细讲了,大家如果没看过或者有疑问的话,可以看第一集里的一个讲解啊
00:08得说,它就是通过Google,把网上的内容搜集过来,然后呢,通过这个URL去抓取这个网站上的内容,如果抓起来的话,我们用的是这个叫Browserless,这个网站,它是可以通过它的API去抓取网站的内容,它的API也是有免费的,这个可用的,就可以做Demo用的,大家可以放心用,它抓取完以后,如果抓取的内容很大的话,我们可以把它进行切片,切片处理,切片处理的目的呢,就是让我们的GPT可以进行总结
00:09 结啊,我们也知道GPT是有Token限制的,如果超过Token的限制,它是没法进行这个总结的,所以呢,就是我们要把它束缚好,然后我们总结的这个模型也用的也是这个
00:09我们在这个给Azure的配置的这个模型里面的具体参数,大家可以看一看,这个就是我们切片的,就是比如说有一个一万字的文章,我们把它按5000字切成一份,5000字切成一份,这个200的意思就是说明上下文,比如说在第二段里面会有第一段的最后200个字,这样的话呢,能保证它的这个上下文的连续,让它总结出来的呢,是不是非常的这个白板或者特别的生冷
00:10就是说因为它是采用这个MapReduce
00:10 这么一个模式,大家可以看啊,它采用的这个MapReduce的这个方式去进行的这个切片,然后总结MapReduce的意思就是说,它会把一篇文章切成几块,然后分别总结这几块的要义,再把这几个要义再总结出来,总结出这一个整体的要义
00:11所以就是说,如果我们把这篇文章如果切得严丝合缝的话,它可能总结的就没有那么好看了,就是没有那么准确,所以呢,我们要让它有一个交叠、交集,每一块和每一块之间有一个交集
00:11这就是呢,我们这个工具吧,它有一个色池的功能,有一个抓取网页的功能,抓取网页内容的功能,还有一个去切片整理总结出我们抓取的内容要义的功能
00:12就是说呢,我们会配上这两个工具啊
00:12 第一个工具,它的名字叫色质,很重要的是这个description,我们要给它描述好了
00:13我们这个工具是要做什么用的,这样的话,我们的这个大语言模型就可以根据这个description去判断我们是否要选用这个工具去完成这个任务
00:13与此同时,我们看,这也是我们要给它这个description里面描述得非常清楚,它是用来抓取网站的,同时要是基于这个URL的,不要对这个URL做任何的改变
00:14所以,这就说明我们告诉了agent,我们现在有这三个工具,这三个工具分别是用来做什么的:有用于搜索的,有用来抓取网站内容的,有用于总结的
00:14那么,agent呢,会在它执行任务的时候,分别根据这三个工具进行操作
00:15 具的定义来推理思考,来选择不同的工具,进行不同的工作,最后来给我们生成一篇高质量的短文吧
00:15嗯,这就是对整个代码的这么一个解读啊
00:16其实非常简单,就是几大块
00:16第一块就是初始化好我们的Agent,然后给他配好他的几个要素,以及对Agent进行一个详细的说明和他的类型的定义
00:17最关键的一步就是,或者说是代表量最大的步骤,就是说我们要写自己的Tools,就是说我们给Agent提供的工具越多,他所能完成的任务也就越多
00:17我们现在只是在一个Demo,所以只给他提供了这两三个工具啊
00:18所以呢,这个呢,就是这些代码啊,到时候我会上传到这个GitHub上,到时候,今天大家可以通过链接去下载自己去看啊
00:18 啊,一会儿我们通过一个demo来演示一下,这个就是我们可以通过让它自主地根据你给出的任务目标,它去自主地思考推理,哪一个工具去完成这个任务,最终给出一个高质量的结果,好,好,我们现在就来演示一下我们这个AI资料收集和论文整理的助手的这个demo
00:19我们用的是这个Streamlit这个UI产品
00:19好,我们看现在,这个已经跑起来了
00:20现在,比如说,我们现在就给这个Agent提一个问题,我们让它介绍一下这个SpaceX吧
00:20好,我们看一下面后台
00:21好,我们看现在,结果出来了
00:21我们通过后台可以看到,它并没有调用我们的任何工具,也没有调用色尺,也没有调用网站的爬虫,因为它 认为他经过他的大规模模型判断,他认为在他现有的知识结构里面,已经完全可以回答这个问题了,所以他就不用很麻烦地去调用这些工具去再收集这些资料了
00:22因此,我们看到的,这就是他根据自己的理解,开始决定这个任务该怎么执行,调用什么工具执行,以及执行的顺序
00:22好,我们接着再看另一个,我们再试一个例子,看一下,就是……好,我们看啊,他已经开始调用这个search了,这就是结果,这是开始爬取这个内容了
00:23这是爬取完内容以后开始进行总结
00:23不,用等一下,完成了
00:24好,我们看到的,就是agent根据我们提出的这个要求,无论是详细介绍英伟达,当然,我们这个提问的方式也比较初级,因为它只是一 个demo,当然,我们这个提问…… 的方式也比较的这个阶段啊,因为它只是一个demo啊,我们看到它经过调用这个搜索啊,调用这个网站爬虫的这个工具,以及进行总结的这个工具啊,它总结出来了这个详细的内容,同时给出了这个它爬取的链接,所以我们看到就是啊,agent他通过对这个的判断,他调用了,分别调用了工具库里面的这些工具来完成这个任务,这些完全都是自动的,并不是我们说我们提前像传统程序那样说你应该先调用哪个,再调用哪个,完全没有这个定义,这都是他根据实际的情况进行自动的调用,所以就是说,我们可以看到agent给出的这个还还是比较的细致的,就是他已经开始具备了自我判断的能力,以及可以根据这个实际情况进行这个工具的调用
00:24 用来完成任务,当然我们这个任务是比较简单的,所以呢,大家可以根据我们这个代码和实际情况对这个Agent进行深入的了解和体验吧,然后呢,下一期呢,我们会介绍一个更有意思的,就是现在我们只是在这个Agent在进行工作,下一期呢,我们会进行多个Agent,让他们进行互动,就是agent和agent之间进行配合,进行工作,或者甚至进行游戏、娱乐这些,那是一个非常有意思的几个项目,我们会在下一期介绍,欢迎大家持续关注
00:25好,代码呢,我会上传到GitHub上,大家关注,可以自己把这个task出来,然后运行去跑一跑,还是非常有意思的
00:25今天就这样,感谢大家
00:26