使用 SageMaker JumpStart 中的 Llama3 模型构建基于 RAG 的问答应用程
使用 SageMaker JumpStart 创建基于 RAG 的问答应用程序
关键点
在本文中,我们将介绍如何构建一个结合 RAG 技术的企业级问答应用程序,使用 SageMaker JumpStart 中的 Llama3 模型和 BGE Large embedding 模型。该应用将提升用户体验并提高员工生产力,实现更高质量的上下文响应。
组织生成了大量专有数据,从中获得洞察力对改善业务成果至关重要。生成式人工智能 和基础模型在利用组织数据创建提升客户体验和员工生产力的应用程序中发挥着重要作用。
基础模型通常在互联网上可公开获取的大量数据上进行预训练,在自然语言理解任务中表现良好,如摘要、文本生成和问答等。然而,当回答未经过训练的问题时,它们有时会产生不准确的回答。为了防止错误响应并提高响应准确性,可以使用名为检索增强生成 (RAG) 的技术为模型提供上下文数据。
在本文中,我们提供了创建企业级 RAG 应用程序例如问答机器人的分步指南。我们使用 Llama38B 模型进行文本生成,并使用 BGE Large EN v15 文本嵌入模型生成嵌入,均来自 Amazon SageMaker JumpStart。我们将演示如何使用 FAISS 作为嵌入存储以及 LangChain 等软件包与组件进行交互,并在 SageMaker Studio 笔记本中运行推理。
SageMaker JumpStart
SageMaker JumpStart 是 Amazon SageMaker ML 平台中的强大功能,为机器学习从业者提供了广泛的公开和专有基础模型的汇聚中心。
Llama 3 概述
Llama 3由 Meta 开发具有两种参数大小8B 和 70B,以及 8K 的上下文长度,能够支持广泛的用例,并在推理、代码生成和指令遵循方面有所提高。Llama 3 采用仅解码器的变换器架构及新 tokenizer,提供 128K 大小的改进模型性能。此外,Meta 改进了后训练程序,大幅降低了错误拒绝率,提高了模型对齐度,并在模型响应中增加了多样性。
飞兔加速器永久免费版BGE Large 概述
BGE Large 嵌入模型代表 BAAI 的通用嵌入大型模型,由 BAAI 开发,旨在增强大型语言模型 (LLM) 的检索能力。该模型支持三种检索方法:
密集检索 (BGEM3)词汇检索 (LLM 嵌入器)多向量检索 (BGE 嵌入重排名器)。您可以使用 BGE 嵌入模型检索相关文档,然后使用 BGE 重排名器获取最终结果。
在 Hugging Face 上,提供了大规模文本嵌入基准MTEB作为多样化文本嵌入任务的排行榜。目前提供了 129 个基准测试数据集,覆盖 113 种语言的 8 种不同任务。MTEB 排行榜上的顶级文本嵌入模型都在 SageMaker JumpStart 中可用,包括 BGE Large。
有关此模型的更多详细信息,请参见官方 Hugging Face 模型卡页面。
RAG 概述
检索增强生成 (RAG) 是一种允许将外部知识源与基础模型集成的技术。RAG 主要包含三个步骤:检索、增强和生成。
首先,根据用户的查询从外部知识库中检索相关内容。接下来,这些检索到的信息与用户的原始输入结合或增强,创建一个增强提示。最后,基础模型处理这个包含查询和检索到的上下文信息的增强提示,并生成一个针对特定上下文的响应,结合外部源相关的知识。
解决方案概述
您将在 SageMaker 笔记本上使用 Llama38B 模型和 BGE Large 嵌入模型构建一个 RAG 问答系统。以下图示说明了该解决方案的分步架构,并在后续章节中进行描述。
实现该解决方案需要三个主要步骤:模型部署、数据处理和向量化、运行推理。
为演示该解决方案,我们在 GitHub 仓库 中提供了一个示例笔记本。
该笔记本以 mlt3medium 实例为基础,演示如何使用 SDK 通常 SageMaker JumpStart 将模型作为 API 端点进行部署。您可以使用这些模型端点进行探究、实验和优化,以比较使用 LangChain 的高级 RAG 应用技巧。我们还展示了如何将 FAISS 嵌入存储集成到 RAG 工作流程中,强调其在存储和检索嵌入中的作用,以增强应用程序的性能。
我们还将讨论如何使用 LangChain 创建高效的 RAG 应用。LangChain 是一个用于基于语言模型构建应用程序的 Python 库。它提供了一个模块化且灵活的框架,用于将 LLM 与其他组件如知识库、检索系统和其他 AI 工具相结合,以创建强大且可定制的应用。
在所有设置完成后,当用户与问答应用交互时,流程如下:
用户通过问答应用发送查询。应用将用户查询发送到向量数据库,以查找相似文档。返回的文档作为上下文被应用捕获。问答应用向 SageMaker JumpStart 模型端点提交请求,包含用户查询和从向量数据库返回的上下文。端点将请求发送到 SageMaker JumpStart 模型。LLM 处理请求并生成适当的响应。响应被问答应用捕获并显示给用户。前提条件
要实施该解决方案,您需要满足以下条件:
具有创建 AWS 身份与访问管理 (IAM) 角色和策略权限的 AWS 账户。有关更多信息,请参见 访问管理概述:权限和策略。对 SageMaker 和支持 LLM 的 AWS 服务有基本了解。Jupyter Notebooks需要 mlt3medium 配置。您需要访问加速实例 (GPU) 来托管 LLM。此解决方案需要至少以下实例大小:mlg512xlarge 用于部署 BGE Large En v15 文本嵌入模型时的端点使用mlg52xlarge 用于部署 Llama38B 模型端点时的端点使用要增加配额,请参阅 请求配额增加。
Llama3 的提示模板
尽管 Llama 2 和 Llama 3 都是强大的语言模型,针对对话任务进行了优化,但它们在处理多轮对话、指定角色和标记消息边界的提示格式上存在显著差异,反映出不同的设计选择和权衡。
Llama 3 提示格式: Llama 3 采用结构化格式,旨在支持涉及不同角色系统、用户和助手的多轮对话。它使用专用的标记显式标记角色、消息边界和提示结束:
占位符标记: {{usermessage}} 和 {{assistantmessage}}角色标记: ltstartheaderidgt{role}ltendheaderidgt消息边界: lteotidgt 表示轮次内消息的结束。提示结束标记: ltstartheaderidgtassistantltendheaderidgt 表示助手响应的开始。Llama 2 提示格式: Llama 2 使用更紧凑的表示方法,以不同标记处理对话:
用户消息封闭: [INST][/INST]序列的开始和结束: ltsgtlt/sgt系统消息封闭: ltltSYSgtgtltlt/SYSgtgt消息分隔: ltsgtlt/sgt 用于分隔用户消息和模型响应。主要区别:
角色指定: Llama 3 使用更多的显式方法,采用专用标记,而 Llama 2 则依赖封闭标签。消息边界标记: Llama 3 使用 lteotidgt,Llama 2 使用 ltsgtlt/sgt。提示结束标记: Llama 3 使用 ltstartheaderidgtassistantltendheaderidgt,Llama 2 使用 [/INST] 和 lt/sgt。选择取决于应用场景和集成需求。Llama 3 的格式更为结构化,并具有角色意识,更适合复杂的多轮对话的对话 AI 应用。Llama 2 的格式虽然更紧凑,但在处理角色和消息边界方面可能缺乏明确性。
实施解决方案
要实施解决方案,您将使用以下步骤:
设置 SageMaker Studio 笔记本在 Amazon SageMaker JumpStart 上部署模型使用 LangChain 设置 Llama38b 和 BGE Large En v15 模型准备数据并生成嵌入加载不同类型的文档并生成嵌入以创建向量存储使用 LangChain 中的以下方法获取问题相关文档常规检索链父文档检索链准备一条输入 LLM 的提示,并以人性化的方式呈现答案设置 SageMaker Studio 笔记本
要按照本文中的代码进行操作:
打开 SageMaker Studio 并克隆以下 GitHub 仓库。打开笔记本 RAGrecipes/llama3raglangchainsmjsipynb,选择 PyTorch 200 Python 310 GPU 优化镜像、Python 3 内核,并将实例类型设置为 mlt3medium。如果您第一次使用 SageMaker Studio 笔记本,请参见 创建或打开 Amazon SageMaker Studio 笔记本。要设置开发环境,您需要安装所需的 Python 库,如下代码所示。示例笔记本提供了这些命令:
pythonwritefile requirementstxtlangchain==0114pypdf==410faisscpu==180boto3==13458sqlalchemy==2029
编辑完 requirementtxt 后,安装所有库:
python!pip install U r requirementstxt quiet
部署预训练模型
在导入所需库后,您可以使用 SageMaker SDK 在 SageMaker JumpStart 上部署 Llama 3 8B Instruct LLM 模型:
从 SageMaker JumpStart 库中导入 JumpStartModel 类。pythonfrom sagemakerjumpstartmodel import JumpStartModel
指定 HuggingFace Llama 3 8B Instruct LLM 模型的模型 ID,然后部署该模型。pythonmodelid = metatextgenerationllama38binstructaccepteula = Truemodel = JumpStartModel(modelid=modelid)predictor = modeldeploy(accepteula=accepteula)
指定 HuggingFace BGE Large EN 嵌入模型的模型 ID,并部署该模型。
pythonmodelid = huggingfacesentencesimilaritybgelargeenv15textembeddingmodel = JumpStartModel(modelid=modelid)embeddingpredictor = textembeddingmodeldeploy()
使用 LangChain 设置模型
在此步骤中,您将使用以下代码设置模型。
pythonimport jsonimport sagemaker
from langchaincoreprompts import PromptTemplatefrom langchaincommunityllms import SagemakerEndpointfrom langchaincommunityembeddings import SagemakerEndpointEmbeddingsfrom langchaincommunityllmssagemakerendpoint import LLMContentHandlerfrom langchaincommunityembeddingssagemakerendpoint import EmbeddingsContentHandler
将以下代码片段中的端点名称替换为您环境中已部署的端点名称。您可以从上节创建的预测器获取端点名称,或通过访问 SageMaker Studio 中的导航菜单,依次选择部署 端点来查看创建的端点,并替换 llmendpointname 和 embeddingendpointname 变量的值。pythonsess = sagemakersessionSession() # 在不同的 AWS API 中交互的 SageMaker 会话region = sessregionnamellmendpointname = metatextgenerationllama38binstructXXXXembeddingendpointname = hfsentencesimilaritybgelargeenv1XXXXX
转换输入和输出数据以处理 Amazon SageMaker 中的 Llama 3 8B Instruct API 调用。pythonfrom typing import Dict
class Llama38BContentHandler(LLMContentHandler) contenttype = application/json accepts = application/json
def transforminput(self prompt str modelkwargs dict) gt bytes payload = { inputs prompt parameters { maxnewtokens 1000 topp 09 temperature 06 stop [lteotidgt] } } inputstr = jsondumps(payload) return inputstrencode(utf8)def transformoutput(self output bytes) gt str responsejson = jsonloads(outputread()decode(utf8)) content = responsejson[generatedtext]strip() return content利用 SageMaker 和 LangChain 实例化 LLM。python
为 Llama38B 实例化内容处理器
llamacontenthandler = Llama38BContentHandler()
配置 Llama38B 模型与 SageMaker 端点一起使用
llm = SagemakerEndpoint( endpointname=llmendpointname regionname=region modelkwargs={maxnewtokens 1024 topp 09 temperature 07} contenthandler=llamacontenthandler )
转换输入和输出数据以处理 Amazon SageMaker 中的 BGE Large En API 调用。pythonfrom typing import List
class BGEContentHandlerV15(EmbeddingsContentHandler) contenttype = application/json accepts = application/json
def transforminput(self textinputs List[str] modelkwargs dict) gt bytes inputstr = jsondumps( { textinputs textinputs modelkwargs } ) return inputstrencode(utf8)def transformoutput(self output bytes) gt List[List[float]] responsejson = jsonloads(outputread()decode(utf8)) return responsejson[embedding]用 SageMaker 和 LangChain 实例化嵌入模型。pythonbgecontenthandler = BGEContentHandlerV15()sagemakerembeddings = SagemakerEndpointEmbeddings( endpointname=embeddingendpointname regionname=region modelkwargs={mode embedding} contenthandler=bgecontenthandler)
准备数据并生成嵌入
在本示例中,您将使用数年的 亚马逊年度报告 (SEC文件) 作为文本语料库执行问答。
首先,使用以下代码