使用 Amazon SageMaker

使用 Amazon SageMaker Studio 构建 RAG 问答解决方案

关键要点

  • 本文介绍如何使用 Amazon SageMaker Studio 构建 RAG(检索增强生成)问答解决方案。
  • 解决方案结合了 Llama 2、LangChain 和 Pinecone,来实现快速实验和高效问答。
  • 通过采集 Extrnal 知识源的数据,模型能够提供准确且上下文相关的回答。

Retrieval Augmented Generation (RAG) 使得大型语言模型 (LLM) 能够访问外部知识源数据,如文档、数据库和 API,而无需进行微调。在使用 进行问答时,RAG 使 LLM 能够基于最新信息回答问题,并可选地引用数据源以进行验证。

一个典型的 RAG解决方案会使用嵌入模型将数据源的数据转换为嵌入,并将这些嵌入存储在向量数据库中。当用户询问问题时,它会在向量数据库中搜索,与用户查询最相似的文档。然后,将检索到的文档和用户的查询结合在一起,以生成一个增强提示,发送给 LLM 进行文本生成。

在本篇文章中,我们演示了如何使用 构建 RAG问答解决方案。

使用笔记本进行基于 RAG 的问答

实现 RAG 通常涉及到尝试不同的嵌入模型、向量数据库、文本生成模型和提示,同时调试代码,直到达到一个功能原型。 提供的管理型 Jupyter 笔记本配备 GPU实例,使得在初始阶段快速进行实验成为可能,而无需额外配置基础设施。在 SageMaker 中使用笔记本有两个选项。第一个是通过 SageMakerStudio 快速启动的 。在 SageMaker Studio 中,专为机器学习构建的集成开发环境 (IDE) 可以启动在不同实例类型和配置下运行的笔记本,和同事进行协作,访问为 ML设计的额外功能。第二种选择是使用 ,这是一种完全管理的 ML计算实例,运行 Jupyter Notebook 应用。

在本篇文章中,我们展示了一种 RAG 解决方案,用额外的外部知识源数据来增强模型的知识,以提供特定于自定义领域的更精准的回答。我们使用一台 ml.g5.2xlarge 实例上的 SageMaker Studio 笔记本和 ,这是一个经过微调的 Llama 2 7b版本,专为 Hugging Face Hub 的对话用例进行了优化。我们选取了两篇 AWS 媒体与娱乐博客作为样本外部数据,并将其转换为使用

嵌入的嵌入向量。我们将这些嵌入存储在 ,这是一个提供高性能搜索和相似性匹配的向量数据库。我们还讨论了如何将实验从笔记本转移到将模型部署到 SageMaker 端点,进行实时推理,以完成原型设计。相同的方法也可以用于不同的模型和向量数据库。

解决方案概览

下图展示了解决方案架构。

删除)

实现解决方案包括两大高层次步骤:使用 SageMaker Studio 笔记本开发解决方案,以及为推理部署模型。

使用 SageMaker Studio 笔记本开发解决方案

完成以下步骤以开始开发解决方案:

  1. 在笔记本中从 Hugging Face Hub 加载 Llama-2 7b chat 模型。
  2. 使用 创建一个 PromptTemplate,并根据你的用例创建 prompts。
  3. 对于 1-2 个示例 prompt,从外部文档添加相关的静态文本作为提示上下文,并评估响应质量是否有所提升。
  4. 假设质量提升,实施 RAG 问答工作流:
  5. 收集可以帮助模型更好回答问题的外部文档。
  6. 加载 BGE 嵌入模型并用它生成文档的嵌入。
  7. 将这些嵌入存储到 Pinecone 中。
  8. 当用户提问时,在 Pinecone 中执行相似性搜索,并将最相似文档的内容添加到 prompt 的上下文中。

将模型部署到 SageMaker 进行大规模推理

当你达成性能目标时,可以将模型部署到 SageMaker,以便被生成式 AI 应用使用:

  1. 将 Llama-2 7b chat 模型部署到 SageMaker 实时端点。
  2. 将 嵌入模型部署到 SageMaker 实时端点。
  3. 在问答生成式 AI 应用中使用部署的模型。

在接下来的几节中,我们将带你逐步实现此解决方案。

前提条件

要按照本篇文章中的步骤进行,你需要拥有一个 AWS 账户,并且有一个 (IAM)角色,拥有创建和访问解决方案资源的权限。如果你是 AWS新用户,可以参考 。

要在你的 AWS 账户中使用 SageMaker Studio 笔记本,你需要有一个 ,并且用户配置文件具有启动 SageMaker Studio 应用的权限。如果你对 SageMaker Studio不熟悉,可以参考 ,这是最简单的入门方式。通过单击,SageMaker 将设置带有默认预设的 SageMaker 域,包括设置用户配置文件、IAM 角色、IAM认证和公共互联网访问。本篇假设使用 ml.g5.2xlarge 实例类型。要查看或增加你的配额,请打开 AWS 服务配额控制台,选择导航窗格中的 AWS 服务 ,并查阅 ml.g5.2xlarge 实例上运行的 Studio KernelGateway 应用的价值。

删除)

在确认配额后,你需要完成依赖项以使用 Llama 2 7b chat。

Llama 2 7b chat 在 下可用。要在 Hugging Face 上访问 Llama 2,你需要首先完成以下步骤:

  1. 如果你没有 Hugging Face 账户,请创建一个。
  2. 在 Meta 上填写“请求访问下一个版本的 Llama”表格。
  3. 请求访问 在 Hugging Face 上。

获得访问权限后,你可以创建一个新的访问令牌以访问模型。要创建访问令牌,请转到 Hugging Face 网站上的 页面。

要将 Pinecone 作为向量数据库使用,你需要拥有一个 Pinecone 账户。Pinecone 通过 在 AWS 上提供。Pinecone 网站还提供创建

的选项,该账户具有创建单个索引的权限,足以满足本篇文章的需求。要检索你的 Pinecone 密钥,打开 并选择 API Keys

![Pinecone删除)

设置笔记本和环境

要跟随本文中的代码,请打开 SageMaker Studio,并克隆以下 。接下来,打开笔记本 ,选择 PyTorch 2.0.0 Python 3.10 GPU 优化映像,Python 3内核,以及 ml.g5.2xlarge 作为实例类型。如果这是你第一次使用 SageMaker Studio 笔记本,参见 。

删除)

要设置开发环境,你需要安装必要的 Python 库,如下所示:

python %%writefile requirements.txt sagemaker>=2.175.0 transformers==4.33.0accelerate==0.21.0 datasets==2.13.0 langchain==0.0.297 pypdf>=3.16.3 pinecone- client sentence_transformers safetensors>=0.3.3

python !pip install -U -r requirements.txt

加载预训练模型和分词器

在导入所需库后,可以从 Hugging Face 加载 模型及其对应的分词器。这些加载的模型工件存储在 SageMaker Studio的本地目录中。这使你能够在之后需恢复工作时快速重新加载它们到内存中。


from transformers import ( AutoTokenizer, LlamaTokenizer, LlamaForCausalLM,
GenerationConfig, AutoModelForCausalLM ) import transformers

tg_model_id = "meta-llama/Llama-2-7b-chat-hf" #在 Hugging Face 中的模型 IDtg_model_path = f"./tg_model/{tg_model_id}" #模型将保存到的本地目录

tg_model = AutoModelForCausalLM.from_pretrained(tg_model_id,
token=hf_access_token, do_sample=True, use_safetensors=True,
device_map="auto", torch_dtype=torch.float16) tg_tokenizer =
AutoTokenizer.from_pretrained(tg_model_id, token=hf_access_token)

tg_model.save_pretrained(save_directory=tg_model_path, from_pt=True)
tg_tokenizer.save_pretrained(save_directory=tg_model_path, from_pt=True) ```

## 提问以获取最新信息

现在可以开始使用模型并提出问题。Llama-2 聊天模型期望提示遵循以下格式:

`python <s>
创建基于提示格式的配方,以便轻松生成后续提示:

```python from langchain import PromptTemplate

template = """~~[INST] <>\nYou are an assistant for question-answering tasks.
You are helpful and friendly. Use the following pieces of retrieved context toanswer the query. If you don't know the answer, you just say I don't know. Usethree sentences maximum and keep the answer concise. <>\n {context}\n
{question} [/INST] """ prompt_template = PromptTemplate(template=template,
input_variables=
类型的链,传递 LLM、之前创建的提示模板和问题作为参数:

```python question = "When can I visit the AWS M&E Customer Experience Centerin New York City?"

tg_tokenizer.add_special_tokens({"pad_token": "[PAD]"})
tg_tokenizer.padding_side = "left"

tg_pipe = transformers.pipeline(task='text-generation', model=tg_model,
tokenizer=tg_tokenizer, num_return_sequences=1,
eos_token_id=tg_tokenizer.eos_token_id,
pad_token_id=tg_tokenizer.eos_token_id, max_new_tokens=400, temperature=0.7)

from langchain.chains import LLMChain from langchain.llms importHuggingFacePipeline

llm = HuggingFacePipeline(pipeline=tg_pipe, model_kwargs={'temperature': 0.7})
llm_chain = LLMChain(llm=llm, prompt=prompt_template) no_context_response =
llm_chain.predict(context="", question=question) print(no_context_response)

我们得到了以下生成的答案:

感谢您的联系!AWS M &E 客户体验中心目前因 COVID-19 大流行而关闭,无法进行参观。但是,您可以查看他们的官方网站或社交媒体账户,了解中心何时重新开放的更新。同时,您可以浏览他们提供的虚拟游览和在线资源。

通过为提示添加上下文来改善答案

我们生成的答案并不完全准确。让我们看看能否通过提供一些上下文来改进它。可以添加来自 的帖子中的摘录,该帖子包含2023年相关主题的更新信息:

"""媒体和娱乐(M&E)客户在生产更多内容、更快地将其分发到越来越多端点的挑战中不断面临困难。亚马逊网络服务(AWS)及其合作伙伴已在 NAB展(国家广播商协会)和 IBC 展(国际广播大会)等行业活动中展示了 M&E 解决方案的快速演变。到目前为止,AWS 为 M&E的技术演示仅限于每年几周的时间。客户比以往任何时候都更投入;他们希望进行更高质量的对话,讨论用户体验和媒体工具。这些对话最好通过有互联的解决方案架构来支持。M&E客户体验中心的参观安排将从 11 月 13 日开始,请发送电子邮件至 AWS-MediaEnt-CXC@amazon.com 以安排访问。"""

使用 LLMChain 再次传递前述文本作为上下文:

```python context

Leave a Reply

Required fields are marked *