Press "Enter" to skip to content

LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器

LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第1张  

在过去的几个月中,大型语言模型(LLMs)引起了人们的广泛关注,吸引了全球开发者的兴趣。这些模型为开发聊天机器人、个人助理和内容创作等开发者带来了令人兴奋的前景。LLMs所带来的可能性在开发者、人工智能和自然语言处理社区中引发了一股热潮。

 

什么是LLMs?

 

大型语言模型(LLMs)指的是能够生成与人类语言密切相似并以自然方式理解提示的机器学习模型。这些模型使用包括图书、文章、网站和其他来源的大量数据集进行训练。通过分析数据中的统计模式,LLMs预测应该跟在给定输入后面的最有可能的单词或短语。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第2张  

通过利用大型语言模型(LLMs),我们可以将领域特定的数据融入到问题解决中,以达到更有效地回答查询的目的。当处理模型在初始训练过程中无法访问的信息时,如公司内部文档或知识库,这将特别有优势。

为此目的使用的体系结构被称为检索增强生成或更不常见的生成式问答

 

什么是LangChain

 

LangChain是一个令人印象深刻且免费提供的框架,精心设计用于支持以语言模型为基础的应用程序的开发,尤其是大型语言模型(LLMs)。

LangChain在多个模块中源自组件的无缝链接,使得能够创建基于LLMs强大功能的卓越应用程序成为可能。

阅读更多:官方文档

 

动机?

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第3张  

在本文中,我将演示从头开始创建自己的文档助手的过程,利用LLaMA 7b和LangChain,这是一个专门为与LLMs无缝集成而开发的开源库。

以下是博客结构的概述,概述了将详细介绍该过程的具体部分:

  1. 设置虚拟环境并创建文件结构
  2. 在本地机器上获取LLM
  3. 将LLM与LangChain集成并自定义PromptTemplate
  4. 文档检索和答案生成
  5. 使用Streamlit构建应用程序

 

第1节:设置虚拟环境并创建文件结构

 

设置虚拟环境可为运行应用程序提供受控且隔离的环境,确保其依赖项与其他系统范围的软件包分离。这种方法简化了依赖项的管理,并有助于在不同环境之间保持一致性。

为了为该应用程序设置虚拟环境,我将在我的GitHub存储库中提供pip文件。首先,让我们按照图示创建必要的文件结构。或者,您可以直接克隆存储库以获取所需的文件。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第4张  

我们将在models文件夹中存储要下载的LLMs,而pip文件将位于根目录中。

要在虚拟环境中创建并安装所有依赖项,可以从相同目录使用pipenv install命令,或者直接运行setup_env.bat批处理文件。它将从pipfile安装所有依赖项。这将确保所有必要的软件包和库都安装在虚拟环境中。安装依赖项成功后,我们可以继续下一步,即下载所需的模型。这是存储库链接。

 

第二节:在本地机器上获取LLaMA

 

LLaMA是什么?

 

LLaMA是由Meta AI设计的一种新型大型语言模型,Meta AI是Facebook的母公司。LLaMA具有从70亿到650亿个参数的多样化模型集合,是目前最全面的语言模型之一。2023年2月24日,Meta向公众发布了LLaMA模型,展示了他们对开放科学的承诺。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第5张  

考虑到LLaMA的卓越能力,我们选择利用这个强大的语言模型来实现我们的目标。具体而言,我们将使用最小版本的LLaMA,即LLaMA 7B。即使在这个较小的尺寸下,LLaMA 7B也提供了显著的语言处理能力,使我们能够高效、有效地实现我们的预期结果。

官方研究论文:LLaMA:开放和高效的基础语言模型

要在本地CPU上执行LLM,我们需要一个本地的GGML格式模型。有几种方法可以实现这一点,但最简单的方法是直接从Hugging Face模型仓库下载bin文件。在我们的情况下,我们将下载Llama 7B模型。这些模型是开源的,可以免费下载。

如果你想节省时间和精力,不用担心,我会帮你的。这是你下载模型的直接链接 ?. 只需下载其中的任意版本,然后将文件移动到我们根目录下的models目录中。这样,你就可以方便地访问这个模型。

 

什么是GGML?为什么使用GGML?如何使用GGML?LLaMA CPP

   

GGML是一个用于机器学习的张量库,它只是一个允许你在CPU或CPU + GPU上运行LLMs的C++库。它定义了一种二进制格式,用于分发大型语言模型(LLMs)。GGML利用一种称为量化的技术,使得大型语言模型可以在消费者硬件上运行。

 

现在什么是量化?

 

LLM的权重是浮点(十进制)数。就像表示一个大整数(例如 1000)需要更多的空间,而表示一个小整数(例如 1)需要较少的空间一样,表示高精度浮点数(例如 0.0001)需要更多的空间,而表示低精度浮点数(例如 0.1)需要较少的空间。将大型语言模型量化的过程涉及减少权重表示的精度,以减少使用模型所需的资源。GGML支持多种不同的量化策略(例如4位、5位和8位量化),每种策略在效率和性能之间提供不同的权衡。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第6张  

要有效地使用这些模型,有必要考虑内存和磁盘需求。由于目前这些模型完全加载到内存中,因此您需要足够的磁盘空间来存储它们,并且需要足够的RAM在执行过程中加载它们。当涉及到65B模型时,即使经过量化处理后,建议至少有40GB的可用RAM。值得注意的是,内存和磁盘需求目前是等价的。

量化在管理这些资源需求方面起着关键作用。除非您有特殊的计算资源

   

通过减少模型参数的精度并优化内存使用,量化使得这些模型可以在更普通的硬件配置上使用。这确保了在更广泛的设置中运行这些模型是可行和高效的。

 

如果它是一个C++库,我们在Python中如何使用它?

 

这就是Python绑定的作用。绑定是指为我们的Python和C++之间创建一个桥梁或接口的过程。我们将使用llama-cpp-python,这是一个用于llama.cpp的Python绑定,它充当纯C/C++中LLaMA模型的推断。llama.cpp的主要目标是使用4位整数量化来运行LLaMA模型。这种集成使我们能够有效地利用LLaMA模型,充分发挥C/C++实现的优势和4位整数量化的好处

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第7张  

准备好GGML模型和所有的依赖项后(感谢pipfile),现在是时候开始我们的LangChain之旅了。但在深入探索LangChain的精彩世界之前,让我们从传统的“Hello World”仪式开始——这是我们在探索一门新语言或框架时必须遵循的传统,毕竟LLM也是一种语言模型。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第8张 图片作者:与LLM在CPU上的交互  

Voilà!我们已经成功地在CPU上完全离线和完全随机的方式下执行了我们的第一个LLM(您可以使用超参数temperature进行调整)。

   

完成了这个令人兴奋的里程碑后,我们现在准备开始我们的主要目标:使用LangChain框架对自定义文本进行问答。

 

第三部分:开始使用LLM — LangChain集成

 

在上一节中,我们使用llama cpp初始化了LLM。现在,让我们利用LangChain框架来开发使用LLM的应用程序。通过文本是与它们进行交互的主要接口。简化来说,许多模型都是输入文本,输出文本。因此,LangChain中的许多接口都围绕文本展开。

 

提示工程的崛起

 

在不断发展的编程领域中,出现了一种引人注目的范式:提示。提示涉及向语言模型提供特定的输入以引发期望的响应。这种创新的方法允许我们根据提供的输入来塑造模型的输出。

令人惊讶的是,我们提供提示的措辞方式可能会显著影响模型响应的性质和内容。结果可能根据措辞方式有根本性的差异,突显了在构思提示时认真考虑的重要性。

为了提供与LLM的无缝交互,LangChain提供了几个类和函数,以使用提示模板轻松构建和处理提示。它是一种可复制的生成提示的方式。它包含一个文本字符串模板,可以从最终用户那里接收一组参数并生成提示。让我们来看几个例子。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第9张 图片作者:没有输入变量的提示  

LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第10张 图片作者:带有一个输入变量的提示  

LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第11张 图片作者:带有多个输入变量的提示  

希望之前的解释能更清楚地理解提示的概念。现在,让我们继续提示LLM。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第12张 图片由作者提供:通过Langchain LLM进行提示

这样做效果非常好,但这不是LangChain的最佳利用方式。到目前为止,我们已经使用了各个组件。我们获取了格式化的提示模板,然后获取了llm,并将这些参数传递给llm以生成答案。独立使用LLM对于简单的应用程序来说是可以的,但更复杂的应用程序需要将LLM链接在一起-要么彼此链接,要么与其他组件链接。

LangChain为此类链接应用程序提供了Chain接口。我们将链定义为一系列对组件的调用,其中可以包括其他链。链允许我们将多个组件组合在一起,创建一个单一、连贯的应用程序。例如,我们可以创建一个链,接收用户输入,使用提示模板进行格式化,然后将格式化的响应传递给LLM。我们可以通过将多个链组合在一起或将链与其他组件组合来构建更复杂的链。

为了理解一个链,让我们创建一个非常简单的,它将接收用户输入,使用它进行提示格式化,然后使用上述已经创建的各个组件将其发送给LLM。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第13张 图片由作者提供:LangChain中的链接

在处理多个变量时,您可以选择使用字典来集体输入它们。这就结束了本节。现在,让我们深入探讨主要部分,我们将将外部文本作为检索器用于问答目的。

 

第4节:生成嵌入和用于问答的向量存储

 

在许多LLM应用中,需要用户特定的数据,该数据不包含在模型的训练集中。LangChain为您提供了加载、转换、存储和查询数据的基本组件。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第14张 LangChain中的数据连接:源

这五个阶段分别是:

  1. 文档加载器:用于将数据加载为文档。
  2. 文档转换器:将文档拆分为较小的块。
  3. 嵌入:将块转换为向量表示,也称为嵌入。
  4. 向量存储:用于将上述块向量存储在向量数据库中。
  5. 检索器:用于检索与查询最相似的一组向量,这些向量以向量的形式嵌入在相同的潜在空间中。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第15张 文档检索/问答循环

现在,我们将逐步介绍这五个步骤,以执行与查询最相似的文档块的检索。然后,我们可以根据检索到的向量块生成答案,如提供的图像所示。

但是,在继续之前,我们需要准备一个文本来执行上述任务。为了进行这个虚构的测试,我从维基百科复制了一段关于一些流行的DC超级英雄的文本。以下是该文本:

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第16张 图片由作者提供:用于测试的原始文本

加载和转换文档

 

首先,让我们创建一个文档对象。在本例中,我们将使用文本加载器。但是,Lang chain支持多个文档,因此根据您的具体文档,您可以使用不同的加载器。接下来,我们将使用load方法从预配置的源中检索数据并将其加载为文档。

一旦文档加载完成,我们可以通过将其分成较小的块来进行转换过程。为了实现这一点,我们将使用TextSplitter。默认情况下,分割器会在“\n\n”分隔符处分割文档。然而,如果您将分隔符设置为null并定义特定的块大小,每个块将具有指定的长度。因此,结果列表的长度将等于文档长度除以块大小。总结起来,它将类似于这样:列表长度 = 文档长度 / 块大小。让我们说到做到。

LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第17张 图片由作者提供:加载和转换文档

旅程的一部分是嵌入向量!!!

这是最重要的步骤。嵌入向量生成文本内容的矢量化描绘。这在实践中具有重要意义,因为它允许我们在矢量空间中概念化文本。

词嵌入仅仅是一个词的矢量表示,其中矢量包含实数。由于语言通常包含至少成千上万个词,简单的二进制词向量由于维度过高而变得不实用。词嵌入通过在低维向量空间中提供密集表示来解决这个问题。

当我们谈论检索时,我们指的是检索与嵌入在相同潜在空间中的查询向量最相似的一组向量。

LangChain中的基本嵌入类公开了两种方法:一种用于嵌入文档,另一种用于嵌入查询。前者接受多个文本作为输入,而后者接受单个文本。

LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第18张 图片由作者提供:嵌入向量

为了全面理解嵌入向量,我强烈建议深入研究基础知识,因为它们构成了神经网络处理文本数据的核心。我在其中一篇博客中使用TensorFlow广泛涵盖了这个主题。这是链接。

词嵌入-神经网络的文本表示

创建向量存储和检索文档

向量存储有效地管理嵌入数据的存储,并代表您执行向量搜索操作。嵌入和存储结果嵌入向量是存储和搜索非结构化数据的普遍方法。在查询时,还将嵌入非结构化查询,并检索到与嵌入查询最相似的嵌入向量。这种方法能够有效地从向量存储中检索相关信息。

在这里,我们将使用Chroma,这是一个专门设计用于简化嵌入的AI应用程序开发的嵌入数据库和向量存储。它提供了一套全面的内置工具和功能,以便于您的初始设置,而且可以通过执行简单的pip install chromadb命令方便地在本地机器上安装。

LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第19张 图片由作者提供:创建向量存储

到目前为止,我们已经见证了嵌入和向量存储在从大量文档集合中检索相关块方面的显着能力。现在,时刻已经到来,将这个检索到的块作为上下文与我们的查询一起呈现给LLM。通过它神奇的魔杖,我们将恳求LLM根据我们提供给它的信息生成一个答案。重要的部分是提示结构。

然而,强调一个结构良好的提示的重要性至关重要。通过制定一个精心设计的提示,我们可以减少LLM在面对不确定性时捏造事实的潜力。

不再延长等待时间,让我们现在继续进入最后阶段,看看我们的LLM是否能够生成一个令人信服的答案。时刻到了,让我们见证我们的努力的顶点和结果。我们开始吧!

LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第20张 图片由作者提供:与文档的问答

 

这就是我们一直在等待的时刻!我们成功了!我们刚刚构建了我们自己的问题回答机器人,利用本地运行的LLM。

 

第5节:使用Streamlit连接所有内容

 

本节是完全可选的,因为它不是Streamlit的全面指南。我不会深入探讨这部分内容;相反,我将呈现一个基本应用程序,允许用户上传任何文本文档。然后,他们可以通过文本输入提出问题。在幕后,功能与我们在前一节中介绍的内容保持一致。

然而,在使用Streamlit进行文件上传时存在一个注意事项。为了防止潜在的内存错误,特别是考虑到LLM的内存密集型特性,我只会将文档读取并写入到我们文件结构中的临时文件夹中,命名为raw.txt。这样,无论文档的原始名称如何,Textloader都可以无缝地在未来处理它。

目前,该应用程序仅适用于文本文件,但您可以根据需要调整为PDF、CSV或其他格式。基本概念仍然相同,因为LLM主要设计用于文本输入和输出。此外,您可以尝试使用Llama C++绑定支持的不同LLM。

在不深入复杂细节的情况下,我提供了应用程序的代码。请随意自定义以适应您的特定用例。

   

这是streamlit应用程序的外观。

  LangChain + Streamlit + Llama:将对话式人工智能带到您的本地机器 四海 第21张  

这次我输入了从维基百科复制的《黑暗骑士》的情节,然后只问了谁的脸受到严重烧伤?LLM回答说——哈维·登特

   

好了,好了,好了!随着这篇博客的结束,我们也到了尾声。

我希望您喜欢这篇文章!并且觉得它既有趣又有用。您可以关注我Afaque Umer,以获取更多类似的文章。

我将尝试提出更多的机器学习/数据科学概念,并尝试将那些听起来很高级的术语和概念解释为更简单的方式。

    Afaque Umer是一名热衷于机器学习工程师。他喜欢利用最新的技术来应对新的挑战,以找到高效的解决方案。让我们一起推动人工智能的界限!

  原文。经授权转载。  

Leave a Reply

Your email address will not be published. Required fields are marked *