通过使用 Pinecone 向量数据库和来自 Amazon SageMaker JumpStart

使用 Pinecone 向量数据库与 Llama2 实现检索增强生成以减少幻觉

作者 Vedant Jain James Briggs Xin Huang日期 2023年12月6日

关键要点

随着 LLMs大型语言模型在各行业的广泛应用,如何提高其响应准确性成为一大挑战。通过检索增强生成RAG技术,可以让 LLMs 使用外部数据源的信息来提升回答的准确性并减少“幻觉”现象。本文介绍如何利用 Amazon SageMaker JumpStart 结合 Pinecone 向量数据库和 Llama2 框架来部署 RAG pipeline。

尽管 LLM 在许多行业的应用迅猛,但它们只是推动新一轮人工智能浪潮的更广泛技术生态系统中的一部分。许多对话 AI 的使用案例需要像 Llama 2、Flan T5 和 Bloom 这样的 LLM 来回应用户查询。这些模型依赖参数知识来回答问题,而这些知识在训练过程中被学习并编码到模型参数中。为了更新这些知识,我们必须重训 LLM,这既耗时又昂贵。

幸运的是,我们还可以使用源知识来丰富我们的 LLM。源知识是通过输入提示传输到 LLM 的信息。为 LLM 提供源知识的一种流行方法是检索增强生成RAG。通过 RAG,我们可以从外部数据源中检索相关信息并将其输入到 LLM 中。

在本文中,我们将探讨如何通过 Amazon SageMaker JumpStart 部署 Llama2,并利用 Pinecone 向量数据库通过 RAG 持续更新 LLM 的相关信息,以防止 AI 幻觉的产生。

Amazon SageMaker 中的检索增强生成RAG

Pinecone 将处理 RAG 的检索部分,但你还需要两个关键组件:一个用于运行 LLM 推理的地方,以及一个用于运行嵌入模型的地方。

Amazon SageMaker Studio 是一个集成开发环境IDE,提供单一的基于 Web 的可视化界面,用户可以访问专用工具执行所有机器学习ML开发工作。它提供了 SageMaker JumpStart,这是一个模型中心,用户可在其 SageMaker 账户中找到、预览和启动特定模型。该平台提供了多种预训练的、公共的和专有的模型,适用于各种问题类型,包括基础模型。

Amazon SageMaker Studio 为开发支持 RAG 的 LLM 管道提供了理想环境。首先,使用 AWS 控制台,创建一个 SageMaker Studio 域并打开一个 Jupyter Studio 笔记本。

先决条件

请完成以下先决步骤:

设置 Amazon SageMaker Studio。注册 Amazon SageMaker 域。注册 Pinecone 向量数据库的免费套餐。安装必要的库:SageMaker Python SDK、Pinecone 客户端。

解决方案演示

在 SageMaker Studio 笔记本中,首先需要安装必备的库:

bash!pip install qU sagemaker pineconeclient==221 ipywidgets==700

部署 LLM

在本文中,我们讨论两种部署 LLM 的方法。第一种是通过 HuggingFaceModel 对象。这种方法适合直接从 Hugging Face 模型中心部署 LLM和嵌入模型。

例如,您可以为 google/flant5xl 模型创建可部署配置,如下所示:

pythonimport sagemakerfrom sagemakerhuggingface import ( HuggingFaceModel gethuggingfacellmimageuri)

role = sagemakergetexecutionrole()hubconfig = { HFMODELID google/flant5xl # modelid from hfco/models HFTASK textgeneration # NLP task you want to use for predictions}

retrieve the llm image uri

llmimage = gethuggingfacellmimageuri(huggingface version=082)huggingfacemodel = HuggingFaceModel(env=hubconfig role=role imageuri=llmimage)

使用 Hugging Face 模型直接部署时,您需要初始化 mymodelconfiguration:

env 配置告知使用哪个模型及其任务。SageMaker 执行 role 赋予您部署模型的权限。imageuri 是特定于从 Hugging Face 部署 LLM 的镜像配置。

另外,SageMaker 还支持一组与 JumpStartModel 对象直接兼容的模型。许多受欢迎的 LLM,如 Llama 2,都可以通过这种方式初始化,如下所示:

pythonimport sagemaker from sagemakerjumpstartmodel import JumpStartModel

role = sagemakergetexecutionrole() mymodel = JumpStartModel(modelid=metatextgenerationllama27bf)

对于这两种版本的 mymodel,可以如下部署:

pythonpredictor = mymodeldeploy( initialinstancecount=1 instancetype=mlg54xlarge endpointname=llama2generator)

查询预训练的 LLM

初始化 LLM 端点后,您可以开始查询。查询的格式可能会有所不同特别是在对话与非对话 LLM 之间,但过程通常是一样的。对于 Hugging Face 模型,可以按如下方式查询:

pythonprompt = 根据给定的上下文回答以下问题。如果您不知道答案并且上下文中没有答案,请诚实地说“我不知道”。

答案:

payload = { inputs [ [ {role system content prompt} {role user content question} ] ] parameters {maxnewtokens 64 topp 09 temperature 06 returnfulltext False}}

out = predictorpredict(payload customattributes=accepteula=true)out[0][generation][content]

在这个生成的答案中,您可能会发现它并没有意义这是一个“幻觉”。

向 LLM 提供额外上下文

Llama 2 试图仅基于内部参数知识回答我们的提问。显然,模型参数并未存储有关 SageMaker 中可以使用的实例的知识。

为了正确回答此问题,我们必须使用源知识。换句话说,我们需要通过提示提供给 LLM 额外的信息。我们直接将这些信息作为模型的额外上下文进行添加。

pythoncontext = 管理型 Spot 训练可与 Amazon SageMaker 中所有支持的实例配合使用。管理型 Spot 训练在所有当前可用的 AWS 区域中受支持。

prompttemplate = 根据给定的上下文回答以下问题。如果您不知道答案并且上下文中没有答案,请诚实地说“我不知道”。

上下文:{context}

答案:

textinput = prompttemplatereplace({context} context)replace({question} question)

payload = { inputs [ [ {role system content textinput} {role user content question} ] ] parameters {maxnewtokens 64 topp 09 temperature 06 returnfulltext False}}

out = predictorpredict(payload customattributes=accepteula=true)generatedtext = out[0][generation][content]print(f[输入] {question}n[输出] {generatedtext})

输出示例

[输入] 管理型 Spot 训练可与 SageMaker 中的哪些实例配合使用?

[输出] 根据给定的上下文,您可以将管理型 Spot 训练与 Amazon SageMaker 中所有支持的实例一起使用。因此,答案是:

所有在 Amazon SageMaker 中支持的实例。

现在我们看到了对问题的正确回答;这很简单!然而,用户不大可能在提示中插入上下文,因为他们已经知道自己问题的答案。

为了避免手动插入单个上下文,自动识别来自更广泛数据库的相关信息是更可行的做法。这时你将需要检索增强生成技术。

检索增强生成

使用检索增强生成,您可以将信息数据库编码到一个向量空间,其中向量之间的接近度表示其相关性或语义相似性。利用这个向量空间作为知识库,您可以将新的用户查询转换成同一向量空间中的编码,然后检索之前索引的最相关记录。

在检索到这些相关记录后,选择其中的几个,并将其作为额外上下文包含在 LLM 提示中,从而向 LLM 提供高度相关的源知识。这是一个两步的过程:

索引:填充向量索引,以来自数据集的信息。检索:在查询过程中执行,从向量索引中检索相关信息。

这两个步骤都需要一个嵌入模型,将我们的可读文本转换为语义向量空间。可以使用 Hugging Face 的 MiniLM 句子转换器,如下所示。这不是 LLM,因此不以与我们的 Llama 2 模型相同的方式初始化。

pythonhubconfig = { HFMODELID sentencetransformers/allMiniLML6v2 # modelid from hfco/models HFTASK featureextraction}

huggingfacemodel = HuggingFaceModel( env=hubconfig role=role transformersversion=46 # transformers 版本 pytorchversion=17 # pytorch 版本 pyversion=py36 # python 版本)

encoder = huggingfacemodeldeploy( initialinstancecount=1 instancetype=mlt2large endpointname=minilmembedding)

您可以再次使用 deploy 部署该模型,使用较小的 CPU 实例 mlt2large。由于 MiniLM 模型非常小,因此不需要大量内存,也不需要 GPU,甚至可以在 CPU 上快速创建嵌入。如果需要,也可以在 GPU 上更快地运行模型。

要创建嵌入,使用 predict 方法并将待编码的上下文列表传递到 inputs 参数中,如下所示:

pythonout = encoderpredict({inputs [这里有一些文本这里还有一些文本]})

传入两个输入上下文,返回两个上下文向量嵌入,如下所示:

len(out)2

MiniLM 模型的嵌入维度为 384,这意味着 MiniLM 输出的每个向量嵌入应具有 384 的维度。然而,通过嵌入的长度,我们可以看到以下内容:

len(out[0]) len(out[1])(8 8)

两个列表各包含八个项目。MiniLM 首先在标记化步骤中处理文本。这个标记化将我们的可读文本转换为模型可读的标记 ID 列表。在模型的输出特征中,可以看到基于标记的嵌入。其中一个嵌入显示预期的维度为 384:

len(out[0][0])384

通过在每个向量维度之间取平均值,可以将这些基于标记的嵌入转换为基于文档的嵌入,示例代码如下:

pythonimport numpy as np embeddings = npmean(nparray(out) axis=1) embeddingsshape # (2 384)

现在我们有了两个分别表示每个输入文本的 384 维向量嵌入。为了简化我们的工作流程,将编码过程封装成一个函数,如下所示:

pythonfrom typing import List

def embeddocs(docs List[str]) gt List[List[float]] out = encoderpredict({inputs docs}) embeddings = npmean(nparray(out) axis=1) return embeddingstolist()

下载数据集

下载 Amazon SageMaker FAQs 作为知识库,以获取包含问题和答案列的数据。

在执行搜索时,仅查找答案,因此可以忽略问题列。 详细信息见笔记本。

我们的数据集和嵌入管道已经准备就绪。现在我们需要某个地方来存储这些嵌入。

vpn节点

索引

Pinecone 向量数据库用于存储向量嵌入并高效地进行大规模搜索。要创建数据库,您需要从 Pinecone 获取免费的 API 密钥。

pythonimport pineconeimport os

添加来自 apppineconeio 的 Pinecone API 密钥

apikey = osenvironget(PINECONEAPIKEY) or YOURAPIKEY

设置 Pinecone 环境 在控制台中找到与 API 密钥相邻

env = osenvironget(PINECONEENVIRONMENT) or YOURENV

pineconeinit(apikey=apikey environment=env)

连接到 Pinecone 向量数据库后,创建一个单独的向量索引类似于传统数据库中的表。将索引命名为 retrievalaugmentationaws,并将索引的 dimension 和 metric 参数与嵌入模型所需的参数本例中为 MiniLM对齐。

pythonimport time

indexname = retrievalaugmentationaws

if indexname in pineconelistindexes() pineconedeleteindex(indexname)

pineconecreateindex(name=indexname dimension=embeddingsshape[1] metric=cosine)

等待索引初始化完成

while not pineconedescribeindex(indexname)status[ready] timesleep(1)

要开始插入数据,执行以下代码:

pythonfrom tqdmauto import tqdm

batchsize = 2 # 可以增加但需要更大实例,否则实例会耗尽内存vectorlimit = 1000

answers = dfknowledge[vectorlimit]index = pineconeIndex(indexname)

for i in tqdm(range(0 len(answers) batchsize)) # 找到批次末尾 iend = min(i batchsize len(answers)) # 创建 ID 批次 ids = [str(x) for x in range(i iend)] # 创建元数据批次 metadatas = [{text text} for text in answers[Answer][iiend]] # 创建嵌入 texts = answers[Answer][iiend]tolist() embeddings = embeddocs(texts) # 为插入创建记录列表 records = zip(ids embeddings metadatas) # 插入到 Pinecone indexupsert(vectors=records)

您可以使用前面提到的问题查询索引。

python

提取问题的嵌入

queryvec = embeddocs(question)[0]

查询 Pinecone

res = indexquery(queryvec topk=1 includemetadata=True)

显示结果

res

输出示例:

python{matches [{id 90metadata {text 管理型 Spot 训练可与所有 支持 Amazon SageMaker 的实例配合使用。}score 0881181657values []}]namespace }

以上输出表明我们返回了相关上下文,以帮助我们回答问题。由于我们设置了 topk = 1,indexquery 返回了最相关的结果和元数据,其中读取为“管理型 Spot 训练可与所有支持 Amazon SageMaker 的实例配合使用”。

增强提示

使用检索到的上下文增强提示,决定最大可传递给 LLM 的上下文量。使用 1000 个字符的限制,迭代地将每个返回的上下文添加到提示中,直到超过内容长度。

在 LLM 提示中将 contextstr 传入,如下所示:

pythonpayload = createpayload(question contextstr)out = predictorpredict(payload customattributes=accepteula=true)generatedtext = out[0][generation][content]print(f[输入] {question}n[输出] {generatedtext})

清理工作

为了停止产生任何不必要的费用,请删除模型和端点。

pythonencoderdeletemodel()encoderdeleteendpoint()

结论

在本文中,我们向您介绍了在 SageMaker 上使用开放访问 LLM 的 RAG 方法。我们还展示了如何使用 Llama 2 部署 Amazon SageMaker Jumpstart 模型、使用 Flan T5 的 Hugging Face LLM 和 MiniLM 嵌入模型。

我们实现了一条完整的端到端 RAG 管道,使用我们开放访问的模型和 Pinecone 向量索引。通过这种方法,我们展示了如何最小化幻觉、保持 LLM 知识的时效性,并最终提升用户体验与对系统的信任。

要在自己的环境中运行此示例,请克隆此 GitHub 存储库,按照前面的步骤完成设置,并访问 GitHub 上的问答笔记本。

通过使用 Pinecone 向量数据库和来自 Amazon SageMaker JumpStart

关于作者

![Vedant Jain 个人资料照片](https