ChatGPT如何读取网页 | 如何设计一个客服机器人 | Langchain + GPT

作者:FancyPig | 发布时间: | 更新时间:

相关阅读

data-postsbox="{"id":35592,"title":"ChatGPT如何读取PDF文档 | LangChain + GPT","author":"FancyPig","author_id":1,"cover_image":"https://static.pigsec.cn/wp-content/uploads/2023/04/20230428064637566.jpg","cover_video":"https://v.pigsec.cn/ChatGPT%20for%20YOUR%20OWN%20PDF%20files%20with%20LangChain_ts.m3u8","views":2691,"comment_count":1,"category":"knowledge","is_forum_post":false}">{"id":35592,"title":"ChatGPT如何读取PDF文档 | LangChain + GPT","author":"FancyPig","author_id":1,"cover_image":"https://static.pigsec.cn/wp-content/uploads/2023/04/20230428064637566.jpg","cover_video":"https://v.pigsec.cn/ChatGPT%20for%20YOUR%20OWN%20PDF%20files%20with%20LangChain_ts.m3u8","views":2691,"comment_count":1,"category":"knowledge","is_forum_post":false}

视频讲解

你是否曾想过让ChatGPT担任你的客服机器人,但是,如何让ChatGPT学习您的产品以及相关的技术知识呢?本期视频,我们将继续带大家来使用Langchain,将任意一个或多个网页分解成多个文档,并使用embedding以及Faiss索引库相关技术,方便机器人查询网页中的内容并使用自然语言输出相关结果。

图文讲解

在本视频中,我将向你展示如何为你的网站创建自定义聊天机器人。我将带领你一步步地完成这个过程。通常情况下,网站是由多个页面组成的。你可以使用网站的网站地图列出所有这些页面。例如,这里是OpenAI的网站,它是由多个链接或网页组成的,而你实际上可以通过简单的点击来导航到另一个页面。然而,如果你想列出这个网站的所有页面,你可以简单地使用网站地图。现在,我简单地添加了/sitemap.xml

如果你访问这个网站或这个页面,你会得到一个在这个网站的所有页面的列表,以及它们相应的地址。所以,这些都是URLs。在这个视频中,我将向你展示如何使用这些单独的URLs作为你的聊天机器人的信息来源,而聊天机器人将从多个URLs中提取信息,以便为你的访客创建一个回应。

架构讲解

所以,首先我们会看一下这个聊天机器人的整体架构图,然后我们会看一下代码实现。所以,让我们开始吧。好的,所以正如我所说的,网站地图记录了所有链接到你的网站的网页。所以,让我们说,如果你访问网站地图,这将是连接到不同的页面。所以,假设你有第1、2、3页,这是第n页。所以,根据网站的不同,会有不同数量的页面,在本例中用n表示。现在,为了训练一个聊天机器人,我们将使用一个大型语言模型。所以,它可以通过OpenAI或任何开源的聊天大语言模型。在我们的案例中,我们将采取一个网页,然后把它分成小的文件。

现在,这样做的原因是,我们将把它输入一个大型语言模型,和我们目前的大型语言模型,它们的上下文长度是有限的。这意味着它只能处理少量固定的文本。所以,正因为如此,我们要把每一页转换为几个文件。

所以,比如说,第1页被转换为n个不同的文件,对吗?然后第2页又被转换为另外n个文件、和第3页转换成另一个N个文件。

好的,我刚刚修正了一个错字。所以,这是第二个文件。所以,这就是2a到2n。现在,当我要给你看代码的时候,你会看到一个叫做chunk_size的东西。因此,这基本上是我们创建的多少个部分或文件,而每个文件将是一个特定的长度,将由块大小定义。

接下来,我们需要将我们的文件转换为嵌入物(embedding)。现在,你可能会问,什么是嵌入?现在,为了解释嵌入的概念,假设我们刚刚创建的每个文档都有一个1000个标记的块状大小。现在,嵌入被用来将其压缩成包含数值的更小的向量。所以,通过使用嵌入,你可能能够将这1000个标记转换成小得多的向量。例如,它将是浮点数。所以,它可能看起来像可能是这样的,对吗?

比方说,使用一个嵌入向量,我们也许能把它减少成一个大小为3的向量。这只是一个例子。而嵌入的真正魅力在于,在不同文件之间的比较中,你的所有查询在嵌入空间中实际上比原始文本或标记空间容易得多。

现在,在这里你可以看到,我们把每一个文件都转换为其相应的嵌入,对吗?然后我们简单地将所有这些嵌入存储到一个语义索引中,这就成为我们的知识库。

所以,这基本上就是你网站上的所有知识。在这个具体案例中,我们要看的是FAISS索引存储。

FAISS是一个由Facebook Research创建的矢量存储。它是一个用于高效相似性搜索和密集向量聚类的库。现在,FAISS不是唯一的选择。还有一些其他的选择。例如,Pinecone,ChromaDB,对吗?所以,这些是不同的矢量商店。而根据你的需要,你可以选择其中任何一个。现在,到目前为止,我们只谈了如何从你的网站创建一个知识库。现在,有一件事要记住,如果你添加一个新的网站,例如,如果你有一个博客,你添加另一个博客文章,对吗?你需要做的就是简单地计算这篇新博文的嵌入,并将其附加到你的知识库中。你真的不需要为其他的事情重新做,好吗?所以,我们知道如何创建一个知识库,但如果一个用户正在与一个聊天机器人互动,会发生什么?所以,这些是我们要遵循的不同步骤。

在这种情况下,发生的情况是,如果用户与聊天机器人进行互动,用户问了一个问题,那么这个问题将被发送到嵌入API。而且取决于你使用的嵌入API,例如,你可以使用OpenAI的嵌入或其他一些嵌入,例如,GPT-4或Llama Index,对吗?同样的嵌入将被用于嵌入你的问题或查询。现在,让我们假设结果是这是你从你的问题中得到的嵌入而这些是你在你的知识库中的嵌入基于你所拥有的文档,对吗?现在,下一步是做一个语义搜索或相似性搜索。所以,你要做的是,你基本上要把你的问题的嵌入与你已经存储在知识库中的文档的嵌入进行比较,对吗?所以,无论你使用什么相似度指标,你都会得到不同的排名。

例如,你只想得到前四个相似的文件,对吗?所以,它将简单地返回这四个文件的嵌入。因为我们知道基于嵌入的相应文档的索引,你实际上可以检索到实际的文件,对吗?而这些文件基本上成为你的上下文。

现在,这基本上是你要执行查询的文本,对吗?

所以,接下来要发生的是你会把这些文件,就是你的上下文,对吗?而你只需把原来的问题把这两个信息输入你的大型语言模型。然后你就会得到一个答案。所以,大型语言模型要看的是相似性搜索发现的与问题相似的文档基于嵌入,对吗?所以,把它作为一个背景,为你的问题生成答案,对吗?而当你使用它时,你会得到回应。

现在,我想重申一下,我们的聊天机器人有两个主要组成部分。首先是嵌入。所以,这只是用于寻找最相似的文件。第二个组件是LLM,用于生成自然语言的响应。现在,根据你的应用,你实际上可以选择你想要的任何其他类型的嵌入。而LLM可以是任何LLM。它可以是基于OpenAI的大型语言模型也可以是一个开源的大型语言模型。你实际上也可以混合和匹配它们。所以,例如,你可以使用OpenAI的嵌入因为,比方说,它们对于文档检索来说真的很好。但你可以使用另一个大的语言模型,让我们假设类似GPT4ALL,用于生成自然语言反应。所以,我希望这个解释是清楚的它解释了理论上的概念。接下来,我们要看一下这个聊天机器人的代码实现。

代码实现

现在,让我们看看如何实现这一目标的代码库。我在一台本地机器上运行这个。在这个具体的例子中,我将使用OpenAI来计算嵌入以及大型语言模型。然而,我有一个详细的视频,说明如何使用开源工具来做这件事。我将把那个视频的链接放在这里。以及,我将创建一个全新的视频并使用GPT4ALL作为你的语言模型和LLM指数作为嵌入。所以,请留意那个视频。在第一个区块中,我们只是简单地安装所需的软件包。

在这种情况下,我正在使用FAISS矢量存储。所以,CPU版本,Langchain和OpenAI。接下来,你要设置你的OpenAI密钥。你可以在你自己的账户中找到这个。好的。

现在,为了获得你的OpenAI API密钥,只需进入你的账户。有这一节的API密钥。

然后,只需点击创建一个新的API密钥,给它一个名字,然后创建API密钥,复制该密钥即可。

接下来,你想得到一个URL的列表,对吗?

如果你有自己的网站,你可以使用网站站点地图来获得所有URL的列表。在这种情况下,我手动提供了三个不同的URL的列表。这只是为了测试目的。所以,我并不是真的想去搜刮一个网站上的所有页面。我去看了三个大型语言模型的公告。一个是MPT-7b。另一个是StableLM。而最后一个是Vicuna,对吗?所以,我实际上是去了这些页面,把这些链接复制到这里。这基本上将是我想与之互动的数据库。

例如,这里是他们在宣布Vicuna时发布的博客文章,对吗?而类似的,也有针对MosaicML、MPT-7b模型以及StableLM的博文。现在,我选择不同的网站的原因是我想同时向你展示如何从你的模型中检索信息源。接下来,你想从这些网站上读取数据,对吗?所以,为此,我们将使用LangChain文档加载器中的非结构化URL加载器,对吗?所以,你需要做的是,你只需要把URL列表传递给你的非结构化URL加载器,然后在加载器上调用加载函数。这将给你的URLs中包含的所有数据,对吗?

所以,比如说,在这里我看了一下,这些基本上是三个不同的网页,对吗?所以,对于每个网页,你有一个不同的加载器这显示了像这些网页中的每一个所包含的整个文本。基于我们的架构图,到目前为止,我们只是在这个第二步,对吗?所以,假设你有一个网站地图或像一个URL的列表,我们刚到这里。接下来,我们需要把这些网页中的每一个分成小的文件。这样,我们就可以将其输入我们的大型语言模型,以及嵌入计算模型。所以,为此,我们将使用LangChain中文本分割器的字符文本分割器,对吗

现在,这里发生了什么?

而我想解释一下这里的设计选择。所以,首先,我们想把每一个文件或网页划分为1000个标记大小。现在,粗略的说,把一个token看作是一个词。所以,首先把1000个词分成一个大块,然后我们要定义一个200个令牌的重叠部分。现在,在有些情况下,重叠(overlap)是非常重要的。例如,如果你用多个句子来表达一个想法,而最后一个句子是依赖于,比方说,前面的句子,对吗?如果你只是简单地做一个正常的分块,没有重叠,而最后几句话最后是在单独的文件中,那么在这种情况下,它可能没有正确传达信息。这就是为什么你需要有一个重叠,这样就有了信息的连续性。所以,在你有句子或序列的时间依赖的情况下,你要使用重叠。在没有时间依赖性的情况下,你可以忽略重叠。我喜欢把它保持在10%或20%左右。现在,我希望这很清楚。现在,最后一个设计选择是分隔符,在这里我们使用新行。所以,这块内容将在新的一行结束,它将根据下一句话来划分。然后,我们所做的是,我们把我们的数据,所以所有这三个文件,对吗?而我们通过这个字符文本分割器来运行它,对吗?所以,作为一个结果,我们将得到一些文件,对吗?所以,你看这里,而不是只有三个

我们实际上将得到一个总数,让我看看,我们有多少个文件?好的,所以现在我们有大约62个文件。

这就是你得到的东西,对吗?所以,我们定义了像n个文件。现在,每一个页面都不会给你完全相同数量的文件,因为不同的页面可能包含不同数量的文本。好了,现在,如果你看过我以前关于信息检索的视频,其余的过程都很相似。但我想深入了解模型本身的更多细节,对吗?所以,下一步是要获得嵌入物。而在这种情况下,我们使用的是OpenAI的嵌入,对吗?所以,即使是嵌入,在OpenAI中也有许多不同的模型可用。所以,对于这个特定的案例,我们使用默认的,是text-embedding-ada-002模型。

使用该API,我们只需为我们创建的每个文件计算嵌入,对吗?但接下来,我们需要将它们存储在一个矢量存储中。所以,为了这个目的,我们将使用FAISS矢量存储。所以,我们所做的是我们采取我们的文件和我们的嵌入模型。在此基础上,我们将计算所有的嵌入,并将它们存储在矢量存储中。

我通常把它们写到磁盘上,这样我就不必一次又一次地重新计算这些嵌入。因为有相关的费用,对吗?所以,你所需要做的只是把嵌入物转储到你的硬盘上。

然后当你需要这些嵌入时,你只需从磁盘上读取它们,而不是再次计算它们。现在,下一步是做信息检索。所以,这就是有人从你的聊天机器人问问题并与你的网站互动的整个步骤。现在,为了做到这一点,我们将使用一个langchain的检索问题答案与来源链。现在,我使用这个特定的链,因为除了答案之外,我还想看看答案是从哪里来的。现在,为了生成自然语言的回答,我们需要一个语言模型,一个大型的语言模型。在这种情况下,我们使用的是OpenAI的默认模型。所以,让我们看看这个。默认模型是text-davinci-003

现在,你也可以看一下其他一些参数。我们设定温度。最大令牌是256,对吗?但我们实际上可以改变默认模式。所以,让我告诉你如何做到这一点。所以,如果你去OpenAI的网站,有很多模型可以使用,对吗?所以,即使你有gpt-3.5-turbo,对吗?

现在,为了改变模型,你将需要传递另一个参数到这个函数,修改model_name,对吗?

然后你简单地定义你想使用的模型类型。我打算保持默认,但只是想告诉你这是你可以简单地改变模型名称的地方。好的,那么,我们有了我们的模型。我们有了我们的矢量存储。现在,我们需要创建链。所以,为了创建这个检索链,我们要从LLM中调用这个函数,对吗?所以,那是一个大型的语言模型。然后你把你所使用的大型语言模型传给它。同样,它不一定是OpenAI。它可以是任何其他的模型。而在随后的视频中,我将向你展示如何做这整个过程使用绝对的开源模型在你的本地机器上运行,而不用Hugging Face。所以,Hugging Face是另一种选择,你可以使用,但我要告诉你一个完全不同的过程。我已经有一个关于Hugging Face的视频。我打算在这里放一个链接。

好的,那么,我们把语言模型和我们的向量存储传递给它,对吗?这和我们创建一个链。现在,接下来,当我们传递一个问题给我们的链,对吗?所以,比如说,在这里,如果我传递一个问题,它就会把这个问题,计算出相应的嵌入,然后对它进行语义搜索,对吗?

检索出与这个问题最接近的文件,对吗?把这些文件作为一个背景,然后使用我们选择的OpenAI LLM根据它认为最相关的文件来回答一个问题,并给我们一个答案。

所以,例如,在这种情况下,我运行这个查询。Stable LLM有多大?回复是Stable LLM在30亿、70亿参数中可用,后面还有150亿到650亿参数模型,对吗?所以,这就是回应。然后,它也显示了它从哪里得到这些信息的来源所以,在这种情况下,它看的是Stability AI的博文所以,这是我提供的链接之一。

我问的下一个问题是Vicuna有多好,对吗?所以,在这种情况下,回答是Vicuna能够生成详细的和结构良好的答案,质量高与ChatGPT相当,超过其他模型如Lama和斯坦福的Alpaca在超过90%的情况下。但是,它有一定的局限性比如不擅长任务涉及的数学推理,对吗?所以,这就是回应。然后它还列出了来源。所以,这是第二篇博文,对吗?然后我问了一个关于MPT-7b模型的问题,对吗?

而答案是,我想应该是哪一个是最好的,对吗?所以,答案是最好的MPT-7b模型是Instruct模型它是在1万亿个tokens上训练出来的。这是非常主观的因为有三个不同的MPT-7b模型,对吗?但同样,它列出了来源。所以,这就是你如何实际使用自己的网站与OpenAI来创建自定义的聊天机器人。我想创建这个非常详细的视频,来引导你们一步步地了解这个架构如何运作以及设计选择。我将创建更多的内容使用语言链和大型语言模型。如果你喜欢这类教程,请在下面的评论区告诉我。

API费用

好的,我想最后一件事大家都会感兴趣的是用量。所以,对于这个特定的API密钥,我有一个5美元的限制。我一直在玩这个模型相当一段时间。所以,为了准备这个教程,我不得不多次运行这个到目前为止,我已经花费了大约33美分。

所以,这其实并不重要。然而,这只是我的实验,对吗?如果你在你的网站上提供这种模型,并且让我们说你有大量的流量,那么成本可能是巨大的。所以,我认为这将是有帮助的如果我可以真正显示你的定价。所以,我个人没有机会接触到GPT-4 API。

所以,这里是定价。而这个是相当昂贵的。所以,每1000个令牌,你要看0.06美元,对吗?或每1,000个令牌6美分。但如果你用ChatGPT gpt-3.5-turbo,所以你要看的是每1,000个令牌0.002美元。我想我们使用的是Davinci模型,对吗?所以,这就是0.02。其实我应该选择…是的,可能。出于某种原因,我认为它的价格比较低。总之,如果你要做问答,就用ChatGPT模型它比我们之前使用的Davinci模型要便宜很多。现在,对于计算你的数据集的嵌入。所以,目前的定价在这里。这实际上是还好吧,对吗?所以,我的建议是你可以潜在地使用OpenAI的嵌入。然后你可以运行你自己的大型语言模型,如GPT4All甚至是Vicuna,对吗?来创建自然语言反应。所以,你也许能减少这些成本。我希望这个视频对你有帮助。现在,如果你有一个类似的项目,任何与大型语言模型相关的项目,并希望得到专家的意见,你实际上可以通过我的电子邮件与我联系。一如既往地,如果你有任何问题、把它们放在评论中。我将尽力回应他们。如果你们想让我就某一特定主题创作内容,也别忘了联系我。我很愿意这样做。希望你喜欢这个视频。感谢您的观看。下一集见。

标签:学习, ChatGPT, langchain, 客服机器人, 技术知识, 文档, 产品, Faiss索引库, embedding, 网页分解, 机器人查询, 网页内容, 自然语言输出