山西省城乡建设厅网站,wordpress怎么登,网站开发文档有哪些,代理网址浏览器推荐#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 什么是LLMS#xff1f;
大型语言模型 #xff08;LLM#xff09; 是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用包括书籍、文章、网站和其他来源在内的… 推荐使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 什么是LLMS
大型语言模型 LLM 是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用包括书籍、文章、网站和其他来源在内的广泛数据集进行训练。通过分析数据中的统计模式LLM可以预测应遵循给定输入的最可能的单词或短语。 通过利用大型语言模型LLM我们可以整合特定领域的数据来有效地解决查询。当处理模型在初始训练期间无法访问的信息例如公司的内部文档或知识库时这变得特别有利。
用于此目的的体系结构称为检索增强生成或者不太常见的生成问答。
什么是语言链
LangChain 是一个令人印象深刻且免费提供的框架经过精心设计使开发人员能够创建由语言模型尤其是大型语言模型 LLM推动的应用程序。
LangChain彻底改变了各种应用程序的开发过程包括聊天机器人生成式问答GQA和总结。通过将来自多个模块的组件无缝链接在一起LangChain 能够创建围绕 LLM 的强大功能量身定制的卓越应用程序。
赋予动机 在本文中我将演示从头开始创建自己的文档助手的过程利用LLaMA 7b和Langchain一个专门为与LLM无缝集成而开发的开源库。
以下是博客结构的概述概述了将提供该过程详细细分的特定部分
Setting up the virtual environment and creating file structureGetting LLM on your local machineIntegrating LLM with LangChain and customizing PromptTemplateDocument Retrieval and Answer GenerationBuilding application using Streamlit
第 1 部分设置虚拟环境和创建文件结构
设置虚拟环境为运行应用程序提供了一个受控和隔离的环境确保其依赖项与其他系统范围的包分开。此方法简化了依赖项的管理并有助于在不同环境之间保持一致性。
为了设置此应用程序的虚拟环境我将在我的 GitHub 存储库中提供 pip 文件。首先让我们创建必要的文件结构如图所示。或者您可以简单地克隆存储库以获取所需的文件。 在模型的文件夹中我们将存储我们将下载的LLM而pip文件将位于根目录中。
要创建虚拟环境并安装其中的所有依赖项我们可以使用同一目录中的命令或简单地运行批处理文件它将从.这将确保所有必要的包和库都安装在虚拟环境中。成功安装依赖项后我们可以继续下一步其中包括下载所需的模型。这是存储库。pipenv installsetup_env.batpipfile
第 2 部分在本地计算机上获取 LLaMA
什么是LLaMA
LLaMA是由Facebook的母公司Meta AI设计的一种新的大型语言模型。LLaMA 拥有从 7 亿到 65 亿个参数的各种模型集合是可用的最全面的语言模型之一。24 年 2023 月 日Meta 向公众发布了 LLaMA 模型展示了他们对开放科学的奉献精神。 考虑到LLaMA的卓越功能我们选择利用这种强大的语言模型来实现我们的目的。具体来说我们将采用最小版本的LLaMA称为LLaMA 7B。即使在这种缩小的尺寸下LLaMA 7B也提供了重要的语言处理能力使我们能够高效地实现预期的结果。 官方研究论文 LLaMA: Open and Efficient Foundation Language Models 要在本地CPU上执行LLM我们需要一个GGML格式的本地模型。有几种方法可以实现这一点但最简单的方法是直接从Hugging Face模型存储库下载 bin 文件。在我们的例子中我们将下载 美洲驼7B 模型。这些模型是开源的可免费下载。
如果您想节省时间和精力请不要担心 - 我已经为您提供了保障。这是您下载模型的直接链接只需下载它的任何版本然后将文件移动到我们根目录中的 models 目录中。这样您就可以方便地访问模型以供您使用。
什么是 GGML为什么选择GGML如何GGML拉马大学 CPP GGML 是一个用于机器学习的张量库它只是一个C库允许您仅在 CPU 或 CPU GPU 上运行 LLM。它定义了用于分发大型语言模型 LLM 的二进制格式。GGML利用了一种称为量化的技术该技术允许大型语言模型在消费者硬件上运行。
现在什么是量化
LLM 权重是浮点十进制数字。就像与小整数例如 1000相比它需要更多的空间来表示大整数例如 1一样与低精度浮点数例如 0.0001相比它需要更多的空间来表示高精度浮点数例如 0.1。量化大型语言模型的过程涉及降低表示权重的精度以减少使用该模型所需的资源。GGML支持许多不同的量化策略例如4位5位和8位量化每种策略在效率和性能之间提供了不同的权衡。 为了有效地使用这些模型必须考虑内存和磁盘要求。由于模型当前已完全加载到内存中因此您需要足够的磁盘空间来存储它们并需要足够的 RAM 在执行期间加载它们。对于 65B 型号即使在量化之后也建议至少有 40 GB 的可用 RAM。值得注意的是内存和磁盘要求目前是等效的。
量化在管理这些资源需求方面起着至关重要的作用。除非您可以访问特殊的计算资源
通过降低模型参数的精度并优化内存使用量化使模型能够在更适度的硬件配置上使用。这可确保在更广泛的设置下运行模型仍然可行且高效。
如果它是一个C库我们如何在 Python 中使用它
这就是Python绑定发挥作用的地方。绑定是指为我们python和C在两种语言之间创建桥梁或接口的过程。我们将使用 哪个 Python 绑定它充当纯 C/C 中 LLaMA 模型的推理。的主要目标是使用 4 位整数量化运行 LLaMA 模型。这种集成使我们能够有效地利用LLaMA模型利用C / C实现的优势和4位整数量化的优势llama-cpp-pythonllama.cppllama.cpp 准备好 GGML 模型并准备好我们所有的依赖项感谢 pipfile是时候开始我们的 LangChain 之旅了。但在进入令人兴奋的 LangChain 世界之前让我们先从习惯的“Hello World”仪式开始——这是我们在探索新语言或框架时遵循的传统毕竟LLM 也是一种语言模型。 瞧!! 我们已经成功地在CPU上执行了我们的第一个LLM完全离线完全随机你可以使用超参数温度。
随着这一激动人心的里程碑的完成我们现在准备开始我们的主要目标使用 LangChain 框架对自定义文本进行问答。
第 3 部分LLM 入门 — 语言链集成
在上一节中我们使用美洲驼cpp 初始化了LLM。现在让我们利用LangChain框架来开发使用LLM的应用程序。您可以通过文本与它们进行交互的主要界面。为了简化很多模型都是文本输入文本输出。因此LangChain 中的许多接口都以文本为中心。
快速工程的兴起
在不断发展的编程领域出现了一个引人入胜的范式提示。提示涉及向语言模型提供特定输入以引发所需的响应。这种创新的方法使我们能够根据我们提供的输入来塑造模型的输出。
值得注意的是我们表达提示的方式中的细微差别会显着影响模型响应的性质和实质。结果可能因措辞而异这突出了在制定提示时仔细考虑的重要性。
为了提供与LLM的无缝交互LangChain提供了几个类和函数使使用提示模板可以轻松构造和处理提示。这是生成提示的可重现方法。它包含一个文本字符串模板可以从最终用户那里获取一组参数并生成提示。让我们举几个例子。 我希望前面的解释对提示的概念有了更清晰的把握。现在让我们继续提示LLM。 这工作得很好但这不是LangChain的最佳利用。到目前为止我们已经使用了单个组件。我们采用格式化的提示模板然后采用 llm然后将这些参数传递到 llm 中以生成答案。对于简单的应用程序单独使用 LLM 是可以的但更复杂的应用程序需要将 LLM 相互链接或与其他组件链接。
LangChain为此类链式应用程序提供了链接口。我们非常笼统地将链定义为对组件的一系列调用其中可以包括其他链。链允许我们将多个组件组合在一起以创建一个单一的、连贯的应用程序。例如我们可以创建一个链该链接受用户输入使用提示模板对其进行格式化然后将格式化的响应传递给LLM。我们可以通过将多个链组合在一起或者通过将链与其他组件组合在一起来构建更复杂的链。
为了理解这一点让我们创建一个非常简单的链该链将接受用户输入使用它格式化提示然后使用我们已经创建的上述各个组件将其发送到LLM。 处理多个变量时您可以选择使用字典共同输入它们。本节到此结束。现在让我们深入了解主要部分我们将外部文本合并为检索器以进行问答。
第 4 部分生成用于问答的嵌入和向量存储
在许多LLM应用程序中需要模型训练集中未包含的用户特定数据。LangChain 为您提供加载、转换、存储和查询数据的基本组件。 这五个阶段是
文档加载器它用于将数据加载为文档。文档转换器它将文档拆分为较小的块。嵌入它将块转换为矢量表示即嵌入。矢量存储它用于将上述块向量存储在向量数据库中。猎犬它用于检索一组向量这些向量与嵌入在同一潜在空间中的向量形式的查询最相似。 现在我们将演练五个步骤中的每一个步骤以检索与查询最相似的文档块。之后我们可以根据检索到的向量块生成答案如提供的图像所示。
但是在继续之前我们需要准备执行上述任务的文本。出于这个虚构测试的目的我从维基百科上复制了一篇关于一些流行的 DC 超级英雄的文本。以下是文字 加载和转换文档
首先让我们创建一个文档对象。在此示例中我们将使用文本加载器。但是Lang 链提供对多个文档的支持因此根据您的特定文档您可以使用不同的加载器。接下来我们将使用该方法检索数据并将其作为文档从预配置的源加载。load
加载文档后我们可以通过将文档分解为较小的块来继续转换过程。为了实现这一点我们将使用文本分配器。默认情况下拆分器在“\n\n”分隔符处分隔文档。但是如果将分隔符设置为 null 并定义特定的区块大小则每个区块将具有指定的长度。因此生成的列表长度将等于文档长度除以区块大小。总之它将类似于这样的东西。让我们说到做到。list length length of doc / chunk size 旅程的一部分是嵌入!!
这是最重要的一步。嵌入生成文本内容的矢量化描绘。这具有实际意义因为它允许我们在向量空间内概念化文本。
词嵌入只是单词的向量表示向量包含实数。由于语言通常包含至少数万个单词因此由于维度数量众多简单的二进制词向量可能变得不切实际。词嵌入通过在低维向量空间中提供单词的密集表示来解决此问题。
当我们谈论检索时我们指的是检索一组与嵌入在同一潜在空间中的向量形式的查询最相似的向量。
LangChain 中的基本嵌入类公开了两种方法一种用于嵌入文档另一种用于嵌入查询。前者将多个文本作为输入而后者则采用单个文本。 为了全面了解嵌入我强烈建议深入研究基础知识因为它们构成了神经网络如何处理文本数据的核心。我已经在我的一个博客中使用TensorFlow广泛地讨论了这个主题。这是链接。
词嵌入 — 神经网络的文本表示
创建矢量存储和检索文档
矢量存储可有效管理嵌入式数据的存储并代表您促进矢量搜索操作。嵌入和存储生成的嵌入向量是存储和搜索非结构化数据的常用方法。在查询期间还会嵌入非结构化查询并检索与嵌入查询相似度最高的嵌入向量。这种方法能够有效地从载体存储中检索相关信息。
在这里我们将利用Chroma这是一个嵌入数据库和矢量存储专门用于简化包含嵌入的AI应用程序的开发。它提供了一套全面的内置工具和功能以方便您的初始设置所有这些都可以通过执行简单的命令方便地安装到您的本地计算机上。pip install chromadb 到目前为止我们已经见证了嵌入和向量存储从大量文档集合中检索相关块的非凡能力。现在是时候将这个检索到的块作为上下文与我们的查询一起呈现给LLM。挥动其神奇的魔杖我们将恳求LLM根据我们提供给它的信息生成答案。重要的部分是提示结构。
但是强调结构良好的提示的重要性至关重要。通过制定精心设计的提示我们可以减轻LLM产生幻觉的可能性 - 在面对不确定性时可能会发明事实。
在不延长等待的情况下让我们现在进入最后阶段看看我们的LLM是否能够产生令人信服的答案。现在是见证我们努力达到顶峰并揭晓结果的时候了。我们在这里咕噜咕噜 这是我们一直在等待的时刻我们已经做到了我们刚刚利用本地运行的LLM构建了自己的问答机器人。
第 5 部分使用流光链接所有内容
本节完全是可选的因为它不能作为 Streamlit 的综合指南。我不会深入研究这部分;相反我将介绍一个允许用户上传任何文本文档的基本应用程序。然后他们将可以选择通过文本输入提问。在后台该功能将与我们在上一节中介绍的功能保持一致。
但是在Streamlit中上传文件时有一个警告。为了防止潜在的内存不足错误特别是考虑到LLM的内存密集型性质我将简单地读取文档并将其写入文件结构中的临时文件夹并将其命名为这样无论文档的原始名称如何Textloader都将在将来无缝处理它。raw.txt.
目前该应用程序专为文本文件而设计但您可以将其改编为 PDF、CSV 或其他格式。基本概念保持不变因为LLM主要用于文本输入和输出。此外您可以尝试使用由 Llama C 绑定支持的不同 LLM。
在不进一步深入研究复杂细节的情况下我展示了该应用程序的代码。随意自定义它以适合您的特定用例。
以下是流光应用程序的外观。 这次我喂了从维基复制的《黑暗骑士》的剧情只是问谁的脸被严重烧伤了 LLM回答说——哈维·登特。
原文链接LangChain Streamlit Llama将对话式AI引入本地机器 (mvrlink.com)