在这篇文章中我们将学习 如何在仅 CPU 的计算机上部署和使用 GPT4All 模型 (我正在使用一个 Macbook Pro 没有 GPU!)

 

GPT4All is the Local ChatGPT for your Documents and it is Free!
在您的计算机上使用 GPT4All — 图片由作者提供

在本文中,我们将在本地计算机上安装 GPT4All(一个强大的 LLM),并且我们将发现如何使用 python 与我们的文档进行交互。 PDF 或在线文章的集合将成为我们的问题/答案的知识库。

 

什么是 GPT4All

 

从官方网站 GPT4All 来看,它被描述为 一个免费使用、本地运行、具有隐私意识的聊天机器人。 无需 GPU 或互联网。

GTP4All 是一个用于训练和部署的生态系统 强大的 和 定制 运行的大型语言模型 本地 在消费级 CPU 上。

我们的 GPT4All 模型是一个 4GB 文件,您可以下载该文件并将其插入 GPT4All 开源生态系统软件中。 逻辑人工智能 促进高质量和安全的软件生态系统,推动个人和组织能够在本地轻松训练和实施自己的大型语言模型。

 

它将如何运作?

 

GPT4All is the Local ChatGPT for your Documents and it is Free!
使用 GPT4All 的 QnA 工作流程 — 由作者创建

这个过程非常简单(当你知道的时候),并且也可以在其他模型上重复。步骤如下:

  • 加载 GPT4All 模型
  • 使用 朗查恩 检索我们的文档并加载它们
  • 将文档分割成可通过嵌入消化的小块
  • 使用 FAISS 创建带有嵌入的矢量数据库
  • 根据我们想要传递给 GPT4All 的问题,对我们的向量数据库执行相似性搜索(语义搜索):这将用作 语境 对于我们的问题
  • 将问题和上下文提供给 GPT4All 朗查恩 并等待答案。

所以我们需要的是嵌入。嵌入是一条信息的数字表示,例如文本、文档、图像、音频等。该表示捕获了嵌入内容的语义,而这正是我们所需要的。对于这个项目,我们不能依赖重型 GPU 模型:因此我们将下载 Alpaca 原生模型并使用 朗查恩 这 LlamaCpp嵌入。不用担心!一切都一步一步解释

 

让我们开始编码

 

创建虚拟环境

 

为您的新 Python 项目创建一个新文件夹,例如 GPT4ALL_Fabio(输入您的名字...):

 

接下来,创建一个新的 Python 虚拟环境。如果您安装了多个 python 版本,请指定您所需的版本:在这种情况下,我将使用与 python 3.10 关联的主安装。

 

python3 -m venv .venv.venv

虚拟环境提供了隔离的Python安装,允许您只为特定项目安装包和依赖项,而不影响系统范围的Python安装或其他项目。这种隔离有助于保持一致性并防止不同项目需求之间的潜在冲突。

创建虚拟环境后,您可以使用以下命令激活它:

 

GPT4All is the Local ChatGPT for your Documents and it is Free!
激活的虚拟环境

要安装的库

 

对于我们正在构建的项目,我们不需要太多的包。我们只需要:

  • GPT4All 的 python 绑定
  • Langchain 与我们的文档进行交互

LangChain 是一个用于开发由语言模型支持的应用程序的框架。它不仅允许您通过 API 调用语言模型,还可以将语言模型连接到其他数据源,并允许语言模型与其环境进行交互。

 

对于 LangChain,您会看到我们还指定了版本。该库最近收到了大量更新,因此为了确保我们的设置明天也能正常工作,最好指定一个我们知道运行良好的版本。非结构化是 pdf 加载器必需的依赖项, pytesseract 和 pdf2图像 以及。

笔记:在 GitHub 存储库上有一个requirements.txt 文件(由 jl adcr 建议),其中包含与该项目关联的所有版本。使用以下命令将其下载到主项目文件目录后,可以一次性完成安装:

 

在文章末尾,我创建了一个用于故障排除的部分。 GitHub 存储库还包含更新的 READ.ME,其中包含所有这些信息。

请记住,有些 库的可用版本取决于 python 版本 您正在虚拟环境中运行。

 

在您的 PC 上下载模型

 

这是非常重要的一步。

对于该项目,我们当然需要 GPT4All。 Nomic AI 上描述的过程非常复杂,并且需要并非所有人(像我一样)都拥有的硬件。这是已转换且可供使用的模型的链接。只需点击下载即可。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!
下载 GPT4All 模型

正如简介中简要描述的那样,我们还需要嵌入模型,这是一个可以在 CPU 上运行而不被破坏的模型。单击此处的链接下载 alpaca-native-7B-ggml,该文件已转换为 4 位,可以用作我们的嵌入模型。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!
点击 ggml-model-q4_0.bin 旁边的下载箭头

为什么我们需要嵌入?如果您还记得流程图中的第一步,在我们收集知识库的文档之后,就是 嵌入 他们。这个 Alpaca 模型的 LLamaCPP 嵌入完美地适合这项工作,而且这个模型也相当小 (4 Gb)。顺便说一句,您还可以将羊驼模型用于您的 QnA!

更新 2023.05.25:Mani Windows 用户在使用 llamaCPP 嵌入时面临问题。这主要是因为在安装 python 包 llama-cpp-python 期间使用:

 

pip 包将从库源代码进行编译。 Windows 机器上通常没有默认安装 CMake 或 C 编译器。但不要担心有解决方案

在 Windows 上运行 LangChain 所需的 llama-cpp-python 和 llamaEmbeddings 的安装默认情况下不会安装 CMake C 编译器,因此您无法从源代码构建。

对于使用 Xtools 和 Linux 的 Mac 用户,通常操作系统上已经提供了 C 编译器。

为了避免这个问题 你必须使用预编译的轮子

并寻找适合您的架构和 python 版本的编译轮 - 你必须使用 Weels 版本 0.1.49 因为高版本不兼容。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!


就我而言,我有 Windows 10、64 位、python 3.10

所以我的文件是 llama_cpp_python-0.1.49-cp310-cp310-win_amd64.whl

下载后需要将两个模型放到models目录下,如下图。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!
目录结构以及放置模型文件的位置

与 GPT4All 的基本交互

 

由于我们想要控制 GPT 模型的交互,因此我们必须创建一个 python 文件(我们称之为 pygpt4all_test.py),导入依赖项并向模型发出指令。你会发现这很容易。

 

这是我们模型的 python 绑定。现在我们可以调用它并开始询问。我们来尝试一下创意吧。

我们创建一个从模型读取回调的函数,并要求 GPT4All 完成我们的句子。

 

第一条语句告诉我们的程序在哪里可以找到模型(记住我们在上面的部分中做了什么)

第二个语句要求模型生成响应并完成我们的提示“Once Upon a time,”。

要运行它,请确保虚拟环境仍处于激活状态并只需运行:

 

您应该看到模型的加载文本和句子的完成。根据您的硬件资源,这可能需要一些时间。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!

结果可能和你的不一样……但对我们来说重要的是它正在运行,我们可以继续使用 LangChain 来创建一些高级的东西。

注意(2023年5月23日更新):如果您遇到与 pygpt4all 相关的错误,请查看有关此主题的故障排除部分以及 Rajneesh Aggarwal 或 Oscar Jeong 提供的解决方案。

 

GPT4All 上的 LangChain 模板

 

LangChain框架是一个非常神奇的库。它提供 成分 以易于使用的方式使用语言模型,它还提供 链条。链可以被认为是以特定方式组装这些组件,以便最好地完成特定的用例。这些旨在成为一个更高级别的界面,人们可以通过它轻松开始特定的用例。这些链条还被设计为可定制的。

在我们的下一个 python 测试中,我们将使用 提示模板。语言模型将文本作为输入——该文本通常称为提示。通常,这不仅仅是一个硬编码字符串,而是模板、一些示例和用户输入的组合。 LangChain 提供了多个类和函数,使构建和使用提示变得容易。我们也来看看如何做到这一点。

创建一个新的python文件并调用它 my_langchain.py

 

我们从 LangChain 导入 Prompt Template and Chain 和 GPT4All llm 类,以便能够直接与我们的 GPT 模型交互。

然后,在设置 llm 路径(就像我们之前所做的那样)之后,我们实例化回调管理器,以便我们能够捕获对查询的响应。

创建模板非常简单:按照文档教程,我们可以使用类似这样的东西......

 

这 模板 变量是一个多行字符串,包含我们与模型的交互结构:在花括号中我们将外部变量插入到模板中,在我们的场景中是我们的 问题

由于它是一个变量,您可以决定它是硬编码问题还是用户输入问题:这里有两个示例。

 

对于我们的测试运行,我们将对用户输入进行注释。现在我们只需要将模板、问题和语言模型链接在一起。

 

请记住验证您的虚拟环境是否仍处于激活状态并运行命令:

 

你可能会得到与我不同的结果。令人惊奇的是,您可以看到 GPT4All 试图为您找到答案的整个推理过程。调整问题也可能会给你带来更好的结果。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!

Langchain 与 GPT4All 上的提示模板


使用 LangChain 和 GPT4All 回答有关您的文档的问题

 

这里我们开始了令人惊奇的部分,因为我们将使用 GPT4All 作为回答我们问题的聊天机器人来与我们的文档进行对话。

步骤顺序,参考 使用 GPT4All 的 QnA 工作流程,就是加载我们的pdf文件,将它们分成块。之后,我们需要一个向量存储来进行嵌入。我们需要将分块文档输入向量存储中以进行信息检索,然后将它们与该数据库上的相似性搜索一起嵌入,作为 LLM 查询的上下文。

为此,我们将直接使用 FAISS 朗查恩 图书馆。 FAISS 是 Facebook AI Research 的一个开源库,旨在快速查找大量高维数据中的相似项目。它提供索引和搜索方法,使您可以更轻松、更快速地发现数据集中最相似的项目。这对我们来说特别方便,因为它简化了 信息检索 并允许我们在本地保存创建的数据库:这意味着在第一次创建后,它将非常快速地加载以供进一步使用。

 

创建向量索引数据库

 

创建一个新文件并调用它 my_knowledge_qna.py

 

第一个库与我们之前使用的相同:此外我们正在使用 朗查恩 对于向量存储索引创建, LlamaCpp嵌入 与我们的 Alpaca 模型(量化为 4 位并使用 cpp 库编译)和 PDF 加载器进行交互。

让我们也用自己的路径加载我们的法学硕士:一个用于嵌入,一个用于文本生成。

 

为了进行测试,让我们看看是否能够读取所有 pfd 文件:第一步是声明要在每个文档上使用的 3 个函数。第一个是将提取的文本分割成块,第二个是使用元数据(如页码等)创建向量索引,最后一个是用于测试相似性搜索(稍后我将更好地解释)。

 

现在我们可以测试中文档的索引生成 文档 目录:我们需要将所有 pdf 文件放在那里。 朗查恩 还有一种加载整个文件夹的方法,无论文件类型如何:由于后期处理很复杂,我将在下一篇有关 LaMini 模型的文章中介绍它。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!

我的 docs 目录包含 4 个 pdf 文件



我们将把我们的函数应用到列表中的第一个文档

 

在第一行中,我们使用 os 库来获取 pdf 文件列表 在 docs 目录内。然后我们加载第一个文档(文档列表[0]) 从 docs 文件夹中 朗查恩,分割成块,然后我们使用以下命令创建矢量数据库 骆驼 嵌入。

pypdf页面

 

GPT4All is the Local ChatGPT for your Documents and it is Free!


我们可以使用终端命令运行 python 文件:

 

加载嵌入模型后,您将看到用于索引的标记:不要惊慌,因为这需要时间,特别是如果您像我一样仅在 CPU 上运行(花了 8 分钟)。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!
完成第一个向量db

正如我所解释的那样,pyPDF 方法速度较慢,但​​为我们提供了用于相似性搜索的附加数据。为了迭代所有文件,我们将使用 FAISS 的一种方便方法,该方法允许我们将不同的数据库合并在一起。我们现在要做的是使用上面的代码生成第一个数据库(我们将其称为 数据库0)并使用 for 循环创建列表中下一个文件的索引并立即将其合并 数据库0

这是代码:请注意,我添加了一些日志,以便使用以下命令向您提供进度状态 日期时间.日期时间.now() 并打印结束时间和开始时间的增量来计算操作花费的时间(如果您不喜欢它,可以将其删除)。

合并指令是这样的

 

最后的说明之一是在本地保存我们的数据库:整个生成过程甚至可能需要几个小时(取决于您拥有的文档数量),因此我们只需要执行一次就非常好!

 

这里是整个代码。当我们与直接从文件夹加载索引的 GPT4All 交互时,我们将注释其中的许多部分。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!运行python文件花了22分钟

 

向 GPT4All 询问有关您文档的问题

 

现在我们在这里。我们有了索引,可以加载它,并且通过提示模板,我们可以要求 GPT4All 回答我们的问题。我们从一个硬编码的问题开始,然后循环遍历我们的输入问题。

将以下代码放入 python 文件中 db_loading.py 并使用终端命令运行它 python3 db_loading.py

 

打印的文本是与查询最匹配的 3 个来源的列表,还为我们提供了文档名称和页码。

 

GPT4All is the Local ChatGPT for your Documents and it is Free!
运行文件的语义搜索结果 db_loading.py

 

现在我们可以使用提示模板将相似性搜索用作查询的上下文。在这 3 个函数之后,只需将所有代码替换为以下内容:

 

运行后你会得到这样的结果(但可能会有所不同)。太棒了不!?!?

 

如果您想要用户输入的问题来替换该行

 

像这样的东西:

 

结论

 

现在是你进行实验的时候了。针对与您的文档相关的所有主题提出不同的问题,然后查看结果。还有很大的改进空间,尤其是在提示和模板上:您可以在这里查看一些灵感。但 朗查恩 文档真的很棒(我可以遵循它!!)。

您可以按照文章中的代码进行操作,或者在我的 github 存储库上查看它。

 
 
教育家、教师、工程师和学习爱好者。他已经为年轻学生教学了 15 年,现在他在 Key Solution Srl 培训新员工。他于 2010 年开始了我作为工业自动化工程师的职业生涯。他从十几岁起就热衷于编程,发现了构建软件和人机界面以实现生活的美妙之处。教学和辅导是我日常工作的一部分,同时研究和学习如何成为一名具有最新管理技能的充满激情的领导者。与我一起踏上更好的设计之旅,在整个工程生命周期中使用机器学习和人工智能进行预测系统集成。

 
原来的。经许可转载。