本文介绍了如何结合 LlamaIndex 和 Llama 2Chat 快速构建强大的问答应用。通过使用大型语言模型LLM,结合信息检索和自然语言生成,我们能够从海量文本中提取准确且有价值的答案。以下是构建这一应用所需的关键步骤和要素:
LlamaIndex:作为数据框架,旨在帮助构建 LLM 应用,支持多种数据源和格式。Llama 270BChat:Meta 开发的强大 LLM,预训练在大量文本数据上。Retrieval Augmented Generation (RAG):结合信息检索与生成能力,提供更具上下文且连贯的回答。在海量文本中解锁准确和深刻的答案是大型语言模型LLMs赋能的一项令人兴奋的能力。当构建 LLM 应用时,通常需要连接和查询外部数据源,以为模型提供相关上下文。一种流行的方法是使用检索增强生成RAG,创建能够理解复杂信息并自然响应的问答系统。RAG 使得模型能够利用广泛的知识库,提供类人对话,使聊天机器人和企业搜索助手等应用得以实现。
在本文中,我们探讨如何利用 LlamaIndex、Llama 270BChat 和 LangChain 来构建强大的问答应用。凭借这些先进的技术,你可以获取文本语料库,索引重要知识,并生成准确明确地回答用户问题的文本。
Llama 270BChat 是一个强大的 LLM,竞争于市场上领先的模型。它在 2 万亿个文本标记上进行预训练,Meta 的目标是为用户提供聊天助手。预训练数据来源于公开可用的数据,截至 2022 年 9 月,而微调数据截至 2023 年 7 月。有关模型训练过程、安全考虑、学习和预期用途的更多细节,请参阅论文 Llama 2 Open Foundation and FineTuned Chat Models。Llama 2 模型可在 Amazon SageMaker JumpStart 中快速有效地部署。
LlamaIndex 是一个数据框架,用于构建 LLM 应用。它提供工具,能够通过多种源和格式PDF、文档、API、SQL等引入已有数据。无论数据存储于数据库还是 PDF 中,LlamaIndex 均可轻松提取和利用这些数据。如我们在本文中演示的,LlamaIndex API 使数据访问变得简单,帮助你创建强大的自定义 LLM 应用和工作流程。
如果你正在尝试构建 LLM,可能会对 LangChain 熟悉,它是一个强大的框架,简化了 LLM 应用的开发与部署。与 LangChain 类似,LlamaIndex 提供了多种工具,包括数据连接器、数据索引、引擎、数据代理以及应用集成工具、可观察性、跟踪和评估。LlamaIndex 专注于帮助用户在数据和强大的 LLM 之间架起桥梁,通过用户友好的特性简化数据任务。LlamaIndex 专门设计并优化用于构建检索和搜索应用,如 RAG,因为它提供了一个简单的接口,用于查询 LLM 和检索相关文档。
在本文中,我们演示如何使用 LlamaIndex 和 LLM 创建一个基于 RAG 的应用。以下图表展示了此解决方案的逐步架构。
RAG 将信息检索与自然语言生成结合,以产生更具洞察力的回应。当被提示时,RAG 首先在文本语料库中搜索,检索与输入内容最相关的示例。在生成回答时,模型会考虑这些示例以增强其能力。通过添加相关检索到的段落,RAG 的回答通常比基本生成模型更具事实依据、连贯性和上下文一致性。这个检索生成框架结合了检索和生成的优势,能有效解决纯自行回归对话模型中可能出现的重复和缺乏上下文的问题。RAG 以有效的方式构建对话代理和 AI 助手,以提供具有上下文、高质量的响应。
构建此解决方案的步骤如下:
风驰vnp设置 Amazon SageMaker Studio 作为开发环境并安装所需依赖。从 Amazon SageMaker JumpStart 中部署嵌入模型。下载新闻稿以用作我们的外部知识库。根据新闻稿构建索引,以便查询并添加额外的上下文到提示中。查询知识库。使用 LlamaIndex 和 LangChain 代理构建问答应用。本文中的所有代码都可以在 GitHub 仓库中找到。
在这个示例中,你需要一个拥有 SageMaker 域的 AWS 账户,并具有适当的 AWS 身份和访问管理IAM权限。有关账户设置的说明,请参见 创建 AWS 账户。如果你没有 SageMaker 域,请参见 Amazon SageMaker 域 概述以创建一个。在本文中,我们使用 AmazonSageMakerFullAccess 角色。建议在生产环境中使用最低权限角色,而不是使用此凭证。你还可以探索如何使用 Amazon SageMaker 角色管理器 来直接通过 SageMaker 控制台构建和管理面向常见机器学习需求的基于角色的 IAM 角色。
此外,你需要访问以下最低实例规格:
mlg52xlarge 用于部署 Hugging Face GPTJ 文本嵌入模型的端点mlg548xlarge 用于部署 Llama 2Chat 模型端点要增加你的配额,请参阅 请求配额增加。
本节提供两种部署 SageMaker JumpStart 模型的选项。你可以使用提供的代码进行基于代码的部署,或使用 SageMaker JumpStart 用户界面UI。
你可以使用 SageMaker Python SDK 来部署 LLM,详细信息请参见 代码。完成以下步骤:
设置用于部署嵌入模型的实例规格:instancetype = mlg52xlarge查找用于嵌入的模型 ID。在 SageMaker JumpStart 中,模型 ID 为 modelid = huggingfacetextembeddinggptj6bfp16获取预训练模型容器并进行部署。SageMaker 将返回模型端点的名称,并在嵌入模型成功部署时显示以下消息。
要通过 SageMaker JumpStart 在 Studio 中部署模型,请完成以下步骤:
在 SageMaker Studio 控制台,选择导航窗格中的 JumpStart。搜索并选择 GPTJ 6B 嵌入 FP16 模型。选择“部署并自定义部署配置”。对于此示例,我们需要 mlg52xlarge 实例,SageMaker JumpStart 默认建议的实例类型。再次选择“部署”以创建端点。该端点大约需要 510 分钟才能开始服务。
在部署嵌入模型后,为了使用 LangChain 与 SageMaker API 的集成,你需要创建一个函数来处理输入原始文本,并使用该模型将其转换为嵌入。你通过创建一个名为 ContentHandler 的类来完成,这个类接受输入数据的 JSON,并返回文本嵌入的 JSON:class ContentHandler(EmbeddingsContentHandler)。
传递模型端点名称到 ContentHandler 函数,以转换文本并返回嵌入:
pythonembeddings = SagemakerEndpointEmbeddings(endpointname=huggingfacetextembeddinggptj6bfp16 regionname= awsregion contenthandler=embcontenthandler)
你可以在 SDK 的输出或 SageMaker JumpStart UI 的部署详情中找到端点名称。
你可以通过输入一些原始文本并运行 embeddingsembedquery(text) 函数来测试 ContentHandler 函数和端点是否按预期工作。你可以使用示例文本 text = Hi! Its time for the beach,也可以尝试你自己的文本。
现在,你可以部署能够与用户进行互动对话的模型。在此示例中,我们选择 Llama 2Chat 模型之一,其 ID 为:
pythonmymodel = JumpStartModel(modelid = metatextgenerationllama270bf)
该模型需要通过 predictor = mymodeldeploy() 部署到实时端点。SageMaker 将返回模型的端点名称,稍后你可以将其用于 endpointname 变量。
你定义一个 printdialogue 函数来发送输入到聊天模型,并接收其输出响应。负载包括模型的超参数,例如:
maxnewtokens:指模型在输出中可以生成的最大标记数量。topp:指模型在生成输出时可以保留的令牌的累积概率temperature:指模型生成输出的随机性。大于 0 或等于 1 的温度会增加随机性,而温度为 0 则会产生最可能的令牌。应根据用例选择超参数,并进行适当测试。像 Llama 系列这样的模型要求你添加一个额外参数,表明你已阅读并接受最终用户许可证协议EULA:
pythonresponse = predictorpredict(payload customattributes=accepteula=true)
要测试模型,替换输入负载中的内容部分:content what is the recipe of mayonnaise。你可以使用自己的文本值并更新超参数,以更好地理解它们。
与嵌入模型的部署类似,你可以使用 SageMaker JumpStart UI 部署 Llama70BChat:
在 SageMaker Studio 控制台,选择导航窗格中的 JumpStart。搜索并选择 Llama270bChat model。接受 EULA 并选择 Deploy,再次使用默认实例。
与嵌入模型一样,可以通过创建输入和输出的内容处理程序模板来利用 LangChain 集成。在这种情况下,你将输入定义为来自用户,并指明它们由 system prompt 控制。system prompt 告诉模型在特定用例中协助用户的角色。
在调用模型时将此内容处理程序与前面提到的超参数和自定义属性EULA 接受一起传递。你使用以下代码解析所有这些属性:
pythonllm = SagemakerEndpoint( endpointname=endpointname regionname=useast1 modelkwargs={maxnewtokens500 topp 01 temperature 04 returnfulltext False} contenthandler=contenthandler endpointkwargs = {CustomAttributes accepteula=true} )
当端点可用时,你可以测试它是否按预期工作。你可以用自己的文本更新 llm(what is amazon sagemaker)。你也需要定义特定的 ContentHandler 以使用 LangChain 调用 LLM,如代码所示 此处,及以下代码片段:
pythonclass ContentHandler(LLMContentHandler) contenttype = application/json accepts = application/json def transforminput(self prompt str modelkwargs dict) gt bytes payload = { inputs [ [ { role system content systemprompt } {role user content prompt} ] ] parameters modelkwargs } inputstr = jsondumps( payload ) return inputstrencode(utf8)
def transformoutput(self output bytes) gt str responsejson = jsonloads(outputread()decode(utf8)) content = responsejson[0][generation][content] return content
contenthandler = ContentHandler()
接下来,安装 LlamaIndex 以创建 RAG 应用。你可以使用 pip 安装 LlamaIndex:pip install llamaindex
首先你需要将数据知识库加载到 LlamaIndex 以进行索引。这涉及几个步骤:
选择数据加载器:LlamaIndex 提供了一些数据连接器,常见数据类型如 JSON、CSV 和文本文件的连接器可在 LlamaHub 中找到,以及其他数据源,允许你引入各种数据集。在本文中,我们使用 SimpleDirectoryReader 加载几个 PDF 文件,如代码所示。我们的数据样本为两个 PDF 格式的亚马逊新闻稿,位于代码库中的 press releases 文件夹中。加载 PDF 后,可以看到它们已被转换为长度为 11 的元素列表。
除了直接加载文档,你还可以在发送到索引之前将 Document 对象转换为 Node 对象。选择将整个 Document 对象发送到索引或在索引之前将其转换为 Node 对象取决于你的特定用例和数据结构。通常,节点方法对于长文档是一个不错的选择,你希望提取和检索文档中的特定部分,而不是整个文档。有关更多信息,请参阅 Documents / Nodes。
实例化加载器并加载文档:此步骤初始化加载器类及所需配置,例如是否忽略隐藏文件。有关详情,请参考 SimpleDirectoryReader。
调用加载器的 loaddata 方法以解析源文件和数据,并将其转换为 LlamaIndex Document 对象,为索引和查询做好准备。你可以使用以下代码完成数据摄取并使用 LlamaIndex 的索引和检索能力进行全文搜索:pythondocs = SimpleDirectoryReader(inputdir=pressrelease)loaddata()
构建索引:LlamaIndex 的关键特性是其构建组织良好的数据索引的能力,数据以文档或节点的形式存在。索引有助于高效查询数据。我们使用默认的内存向量存储创建索引,并使用我们定义的设置配置。LlamaIndex Settings 是一个配置对象,为 LlamaIndex 应用中的索引和查询操作提供常用资源和设置。它充当单例对象,允许你设置全局配置,同时允许你通过直接传递到使用它们的接口如
留言框-