亚马逊 SageMaker 上的高级 RAG 模式 机器学习博客
Amazon SageMaker中的高级RAG模式
作者:Niithiyn Vijeaswaran AJ Dhimine Armando Diaz Sebastian Bustillo Farooq Sabir 和 Marco Punio日期:2024年3月28日来源:Amazon Machine Learning、Amazon SageMaker永久链接:文章连结
重点摘要
各行业客户正利用大型语言模型LLMs构建问答聊天机器人、搜索引擎和知识库等应用。生成式AI应用不仅能够自动化现有业务流程,还能改善用户体验,尤其在医疗、金融、旅行等领域。本文讨论了如何通过使用LangChain和一些高级技术如父文档检索器与上下文压缩来提高生成式AI应用的回应准确性。在当今,各行业客户包括金融服务、医疗健康、旅游、媒体娱乐、电信及SaaS等正在应用大型语言模型LLMs来构建如问答聊天机器人、搜索引擎和知识库等应用。这些生成式AI应用不仅用于自动化现有业务流程,还能够改变用户体验。随着类似Mixtral8x7B Instruct的LLMs在架构上的进步,客户持续寻求提高生成式AI应用的性能与准确性,同时利用更多的闭源和开源模型。
通常可以使用多种技术如参数高效微调PEFT、人类反馈的强化学习RLHF和[知识蒸馏](https//arxivorg/abs/230608543来提高LLM输出的准确性和性能。然而,在构建生成式AI应用时,您可以使用一种替代方法,允许动态整合外部知识,控制生成所用的信息,而无需微调现有的基础模型。这就是检索增强生成RAG的应用,特别是对于生成式AI应用,相较于较昂贵且复杂的微调方案具有明显优势。如果您在日常工作中实现复杂的RAG应用,可能会遇到一些常见挑战,比如检索不准确、文档规模和复杂性增加以及上下文溢出等问题,这些都可能显著影响生成答案的质量和可靠性。
本文讨论了一些RAG模式,通过使用LangChain及父文档检索器工具和上下文压缩技术,提高响应准确性,以帮助开发人员改善现有生成式AI应用。
解决方案概述
本文演示了如何将Mixtral8x7B Instruct文本生成与BGE Large En嵌入模型结合使用,在Amazon SageMaker笔记本中高效构建RAG问答系统,使用父文档检索器工具和上下文压缩技术。以下图表展示了该解决方案的架构。
通过Amazon SageMaker JumpStart,您只需几次点击即可部署此解决方案。SageMaker JumpStart是一个完全管理的平台,提供各种用例的最先进基础模型,如内容撰写、代码生成、问答、文案撰写、摘要、分类和信息检索。它提供了一系列预训练模型,可以快速轻松地部署,加速机器学习ML应用的开发和部署。SageMaker JumpStart的一个关键组成部分是模型库,它提供了丰富的预训练模型目录,例如Mixtral8x7B,适用于各种任务。
Mixtral8x7B使用MoE架构。该架构允许神经网络的不同部分专注于不同任务,从而有效地将工作量分配给多个专家。这种方法使得相比传统架构,可以更高效地训练和部署更大的模型。
MoE架构的主要优势之一是其可扩展性。通过将工作量分散到多个专家,MoE模型可以在更大的数据集上进行训练,并能够比同等规模的传统模型实现更好的性能。此外,MoE模型在推理时也能更高效,因为只需激活部分专家即可处理特定输入。
有关AWS上的Mixtral8x7B Instruct模型的更多信息,请参阅Mixtral8x7B现在可在Amazon SageMaker JumpStart中使用。Mixtral8x7B模型依据Apache 20许可协议提供,可以无任何限制地使用。
在本文中,我们讨论了如何使用LangChain创建高效且更具效率的RAG应用。LangChain是一个开源Python库,旨在构建与LLMs组合的应用程序。它提供了一个模块化且灵活的框架,用于将LLMs与其他组件如知识库、检索系统及其他AI工具结合,创建强大且可定制的应用程序。
我们将逐步构建基于SageMaker和Mixtral8x7B的RAG管道。我们采用Mixtral8x7B Instruct文本生成模型与BGE Large En嵌入模型,使用RAG在SageMaker笔记本中构建一个高效的问答系统。我们使用mlt3medium实例来演示如何通过SageMaker JumpStart部署LLMs,这可以通过SageMaker生成的API端点进行访问。该设置允许探索、实验和优化与LangChain的高级RAG技术。我们还展示了FAISS嵌入存储的集成在RAG工作流程中的作用,强调其在存储和检索嵌入以增强系统性能方面的作用。
我们简要介绍了SageMaker笔记本的操作。欲了解更详细的逐步说明,请参阅Advanced RAG Patterns with Mixtral on SageMaker Jumpstart GitHub Repo。
高级RAG模式的必要性
高级RAG模式对于改进LLMs在处理、理解和生成类人文本方面的能力至关重要。随着文档大小和复杂性的增加,将文档的多个方面以单一嵌入进行表示可能会导致特定性损失。尽管捕捉文档的整体精髓至关重要,但同样重要的是识别和表示文档内的不同子上下文。这是处理较大文档时面临的挑战之一。
此外,RAG的另一个挑战是,您并不知道文档存储系统在摄取时将处理的特定查询。这可能导致与查询最相关的信息被埋藏在文本上下文溢出中。为了减小失败率,提高现有RAG架构的有效性,可以使用先进的RAG模式父文档检索器和上下文压缩来减少检索错误、提升答案质量,并处理复杂问题。
通过本文讨论的技术,您可以解决与外部知识检索和整合相关的关键挑战,使您的应用能够提供更精准和具有上下文意识的响应。
在下面的章节中,我们将探讨父文档检索器和上下文压缩如何帮助您应对上述讨论的一些问题。
父文档检索器
在前面的部分中,我们强调了RAG应用在处理庞大文档时所遇到的挑战。为了解决这些问题,父文档检索器将传入的文档分类并指定为父文档。这些文档因其全面性而被认定,但并不直接以原始形式进行嵌入,而是将父文档分解为子文档。每个子文档捕捉父文档中不同的方面或主题。在识别到这些子文档后,分别为每个子文档分配嵌入,以捕捉它们的特定主题本质如下图所示。在检索期间,调用父文档。这种技术提供了针对性的广泛搜索能力,为LLM提供了更宽广的视角。父文档检索器同时给LLM提供了双重优势:子文档嵌入的具体性以实现精准和相关的信息检索,加上父文档的调用以增强生成响应的上下文丰富性。

上下文压缩
为了解决前文提到的上下文溢出问题,您可以使用上下文压缩,以便根据查询的上下文压缩和过滤检索到的文档,只保留和处理相关信息。这是通过初始文档获取的基础检索器与文档压缩器的结合实现的,根据相关性对这些文档的内容进行缩减或完全排除。正如以下图表所示,这种简化的方法通过上下文压缩检索器显著提高了RAG应用的效率,通过提供一种与大量信息中筛选和利用所需内容的方法,有效应对信息过载和无关数据处理的问题,从而提高响应质量、减少LLM操作的成本并优化整体检索过程。本质上,这是一个为特定查询打造的信息筛选工具,对于旨在优化其RAG应用以提升性能和用户满意度的开发人员来说,是一种必要工具。
前提条件
如果您是SageMaker的新手,请参考Amazon SageMaker开发指南。
在开始解决方案之前,请先创建一个AWS账户。创建AWS账户后,您将获得一个具有完全访问权的单一登录身份。这一身份称为AWS账户的根用户。
使用您创建账户时填写的电子邮箱地址和密码登录AWS管理控制台,即可获取账户中所有AWS资源的完全访问权。我们强烈建议您不要使用根用户进行日常任务,即使是管理性的。
相反,请遵循AWS身份和访问管理中的安全最佳实践,创建一个管理用户和用户组。然后安全地锁住根用户的凭证,仅在进行少量账户和服务管理任务时使用。
Mixtral8x7B模型需要mlg548xlarge实例。SageMaker JumpStart提供了一种简化的方式来访问和部署超过100种不同的开源和第三方基础模型。为了从SageMaker JumpStart启动并托管Mixtral8x7B端点,您可能需要请求服务配额增加以访问mlg548xlarge实例来用作端点。您可以通过控制台、AWS命令行接口AWS CLI或API请求服务配额的增加,以便获取这些附加资源。
设置SageMaker笔记本实例和安装依赖关系
开始之前,请创建SageMaker笔记本实例并安装所需的依赖项。请参阅GitHub Repo以确保成功设置。在设置好笔记本实例后,您可以部署模型。
您也可以在首选的集成开发环境IDE上本地运行笔记本。请确保您已安装Jupyter笔记本实验室。
部署模型
在SageMaker JumpStart上部署Mixtral8X7B Instruct LLM模型:
python
从SageMaker JumpStart库中导入JumpStartModel类
from sagemakerjumpstartmodel import JumpStartModel
指定HuggingFace Mixtral 8x7b Instruct LLM模型的模型ID
modelid = huggingfacellmmixtral8x7binstructmodel = JumpStartModel(modelid=modelid)llmpredictor = modeldeploy()
在SageMaker JumpStart上部署BGE Large En嵌入模型:
python
指定HuggingFace BGE Large EN嵌入模型的模型ID
modelid = huggingfacesentencesimilaritybgelargeentextembeddingmodel = JumpStartModel(modelid=modelid)embeddingpredictor = textembeddingmodeldeploy()
设置LangChain
在导入所有必要的库以及部署Mixtral8x7B模型和BGE Large En嵌入模型后,您可以开始设置LangChain。有关逐步说明,请参阅GitHub Repo。
数据准备
在本文中,我们使用了数年的亚马逊股东信作为文本语料库进行问答。有关准备数据的更详细步骤,请参阅GitHub Repo。
问答
一旦数据准备就绪,您可以使用LangChain提供的包装器,它将围绕向量存储以及LLM的输入进行包装。该包装器执行以下步骤:
获取输入问题。创建问题嵌入。获取相关文档。将文档与问题纳入提示中。通过提示调用模型,生成可读的答案。现在,向量存储已就位,您可以开始提问:
pythonprompttemplate = ltsgt[INST]{query}[INST]PROMPT = PromptTemplate( template=prompttemplate inputvariables=[query])query = AWS如何发展?answer = wrapperstorefaissquery(question=PROMPTformat(query=query) llm=llm)print(answer)
示例响应:由于自2006年推出以来,亚马逊网络服务AWS经历了显著演变。从最初仅提供一个实例大小、位于单一数据中心且支持Linux操作系统的服务开始,AWS为了增强监控、负载均衡和自动伸缩等功能进行了多次迭代。如今,AWS已经发展为一个年收入达850亿美元的多样化服务。
常规检索器链
在上面的示例中,我们探索了快速获得上下文感知答案的方式。现在,我们将借助RetrievalQA查看更可自定义的选项,您可以使用chaintype参数来自定义检索到的文档应如何添加到提示中。此外,您还可以通过以下代码更改k参数来控制要检索的相关文档数量。很多时候,您可能希望了解生成答案所用的来源文档。可以通过returnsourcedocuments获取这些文档,该参数会返回添加到LLM提示上下文中的文档。RetrievalQA还允许您提供一个可以针对模型的自定义提示模板。
pythonfrom langchainchains import RetrievalQA
prompttemplate = [INST]使用以下上下文来简明回答最后的问题。如果您不知道答案,请直接说不知道,不要尝试编造答案。
蓝鲸加速器官网下载{context}
问题:{question}
[INST]PROMPT = PromptTemplate( template=prompttemplate inputvariables=[context question])
qa = RetrievalQAfromchaintype( llm=llm chaintype=stuff retriever=vectorstorefaissasretriever( searchtype=similarity searchkwargs={k 3} ) returnsourcedocuments=True chaintypekwargs={prompt PROMPT})
让我们问个问题:
pythonquery = AWS如何发展?result = qa({query query})print(result[result])
示例响应:亚马逊网络服务AWS经历了从最初的投资亏损到85亿美元年收入的强劲盈利增长,提供广泛的服务与功能,并成为亚马逊投资组合中的重要部分。尽管面临质疑和短期逆风,AWS继续创新,吸引新客户,与现有客户进行迁移,提供了敏捷性、创新性、成本效