Retrieval Augmented Generation (RAG) 使得大型语言模型 (LLM) 能够访问外部知识源数据,如文档、数据库和 API,而无需进行微调。在使用 进行问答时,RAG 使 LLM 能够基于最新信息回答问题,并可选地引用数据源以进行验证。
一个典型的 RAG解决方案会使用嵌入模型将数据源的数据转换为嵌入,并将这些嵌入存储在向量数据库中。当用户询问问题时,它会在向量数据库中搜索,与用户查询最相似的文档。然后,将检索到的文档和用户的查询结合在一起,以生成一个增强提示,发送给 LLM 进行文本生成。
在本篇文章中,我们演示了如何使用 构建 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,以便被生成式 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,你需要首先完成以下步骤:
获得访问权限后,你可以创建一个新的访问令牌以访问模型。要创建访问令牌,请转到 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