使用Amazon SageMaker Data Wrangler简化生成式AI的数据准备
借助Amazon SageMaker Data Wrangler简化生成式AI数据准备
生成人工智能(生成AI)模型在生成高质量的文本、图像和其他内容方面展示了令人印象深刻的能力。然而,这些模型需要大量干净、结构化的训练数据才能发挥其全部潜力。大多数现实世界中的数据存在于诸如PDF之类的非结构化格式中,这需要预处理才能有效使用。
根据IDC的数据,非结构化数据占据了当今所有业务数据的80%以上。这包括电子邮件、PDF、扫描文件、图像、音频、视频等格式。虽然这些数据包含有价值的见解,但其非结构化特性使得AI算法难以解释和学习。根据德勤的2019年调查,只有18%的企业报告称能够利用非结构化数据。
随着AI采用的加速,未来开发有效的非结构化数据消化和学习机制变得更加关键。这可能涉及到更好的预处理工具、半监督学习技术和自然语言处理的进展。有效利用非结构化数据的企业将从AI中获得显著的竞争优势。干净的数据对于良好的模型性能至关重要。提取的文本仍然包含大量的无意义和样板文本(例如,阅读HTML)。从互联网上抓取的数据通常包含大量重复内容。社交媒体、评论或任何用户生成的内容也可能包含有毒和有偏见的内容,您可能需要使用一些预处理步骤将它们过滤掉。还可能存在大量低质量的内容或机器生成的文本,可以使用附带的元数据来过滤掉它们(例如,过滤掉获得低客户评级的客户服务回复)。
数据准备在检索增强生成(RAG)模型的多个阶段都非常重要。知识源文档需要进行预处理,例如清理文本和生成语义嵌入,以便它们可以高效地索引和检索。用户的自然语言查询也需要进行预处理,以便可以编码为向量并与文档嵌入进行比较。在检索相关上下文之后,可能需要进行其他预处理,例如截断,在与用户查询连接到基础模型的最终提示中。
解决方案概述
在本文中,我们使用一个PDF文档数据集——Amazon Bedrock 用户指南。此外,我们展示了如何为RAG预处理数据集。具体而言,我们清理数据并创建RAG工件,以回答关于数据集内容的问题。考虑以下机器学习(ML)问题:用户向一个大型语言模型(LLM)提问:“如何在Amazon Bedrock中过滤和搜索模型?”LLM在训练或微调阶段没有看到文档,因此无法回答这个问题,很可能会产生幻觉。我们在此文中的目标是从PDF中找到一段相关的文本(即,RAG),并将其附加到提示上,从而使LLM能够回答特定于此文档的问题。
下面,我们展示如何从Amazon SageMaker Data Wrangler执行所有这些主要的预处理步骤:
- 从PDF文档中提取文本(由Textract提供动力)
- 删除敏感信息(由Comprehend提供动力)
- 将文本划分为片段。
- 为每个片段创建嵌入(由Bedrock提供动力)。
- 将嵌入上传到向量数据库(由OpenSearch提供动力)
前提条件
在进行本教程之前,您应该具备以下条件:
- 拥有拥有权限创建 AWS Identity and Access Management (AWS IAM) 策略和角色的 AWS 账户
- 访问 Amazon SageMaker,一个 Amazon SageMaker Studio 实例,以及一个 Studio 用户。有关先决条件的更多信息,请参阅 开始使用 Amazon SageMaker Canvas.
- 访问 Amazon Bedrock 模型。按照 模型访问 的指南进行。
- 访问 Amazon Comprehend。Amazon SageMaker Studio 执行角色必须具有调用 Amazon Comprehend DetectPiiEntities 操作的权限。
- 访问 Amazon Textract。Amazon SageMaker Studio 执行角色必须具有调用 Amazon Textract 的权限。
- 对 Amazon Simple Storage Service (Amazon S3) 存储桶 有读写权限。
- 以向量数据库的形式访问 Amazon OpenSearch。选择向量数据库是一个重要的架构决策。有几个不错的选项可以考虑,每个选项都有自己的优点。在这个例子中,我们选择了 Amazon OpenSearch 作为我们的向量数据库。
注意:按照此处的说明创建 OpenSearch 服务域。为了简单起见,我们选择具有主用户名和密码以进行细粒度访问控制的选项。创建域之后,使用以下映射和向量维度1536创建一个向量索引,与 Amazon Titan 嵌入对齐:
PUT knowledge-base-index{ "settings": { "index.knn": True }, "mappings": { "properties": { "text_content": { "type": "text", "fields": { "keyword": { "type": "keyword" } } }, "text_content_v": { "type": "knn_vector", "dimension": 1536 }, } }} }
步骤
构建数据流
在本节中,我们将介绍如何构建一个数据流,从 PDF 中提取文本和元数据,清理和处理数据,使用 Amazon Bedrock 生成嵌入向量,并将数据索引到 Amazon OpenSearch。
启动 SageMaker Canvas
要启动 SageMaker Canvas,请完成以下步骤:
- 在 Amazon SageMaker 控制台中,选择导航窗格中的 Domains。
- 选择您的域。
- 在启动菜单中,选择 Canvas。
创建一个数据流程
按照以下步骤在SageMaker Canvas中创建一个数据流程:
- 在SageMaker Canvas主页上选择数据准备。
- 在页面右侧选择创建,然后给数据流程命名并选择创建。
- 这将进入一个数据流程页面。
- 选择导入数据,选择表格数据。
现在让我们从Amazon S3存储桶导入数据:
- 选择导入数据,从下拉列表中选择表格。
- 数据源, 从下拉列表中选择Amazon S3。
- 导航到包含PDF文件位置的元数据文件,并选择该文件。
- 现在,元数据文件已加载到数据准备数据流程中,我们可以继续添加下一步来转换数据并索引到Amazon OpenSearch。在这种情况下,文件具有以下元数据,每个文件在Amazon S3目录中的位置。
要添加一个新的转换步骤,请按照以下步骤完成:
- 选择加号并选择添加转换。
- 选择添加步骤并选择自定义转换。
- 您可以使用Pandas、PySpark、Python自定义函数和SQL PySpark创建自定义转换。对于这个用例,选择Python (PySpark)。
- 为步骤输入名称。从示例代码片段中浏览并选择从PDF中提取文本。对代码片段进行必要的更改,并选择添加。
- 让我们添加一步来隐藏从提取的数据中的个人身份信息(PII)数据,通过Amazon Comprehend来实现。选择添加步骤,并选择自定义转换。然后选择Python (PySpark)。
从示例代码片段中浏览并选择蒙面 PII(个人身份信息)。对代码片段进行必要的更改,然后选择添加。
- 下一步是对文本内容进行分块。选择添加步骤,选择自定义转换,然后选择Python(PySpark)。
从示例代码片段中浏览并选择分块文本。对代码片段进行必要的更改,然后选择添加。
- 让我们使用Amazon Bedrock Titan Embeddings 模型将文本内容转换为向量嵌入。选择添加步骤,选择自定义转换,然后选择Python(PySpark)。
从示例代码片段中浏览并选择使用 Bedrock 生成文本嵌入。对代码片段进行必要的更改,然后选择添加。
-
现在我们可以获得 PDF 文件内容的向量嵌入。让我们继续将数据索引到 Amazon OpenSearch。选择添加步骤,选择自定义转换,然后选择Python(PySpark)。您可以根据需要选择自己喜欢的向量数据库来重新编写以下代码。为简单起见,我们使用主用户名和密码来访问 OpenSearch API,请根据您的组织政策选择选项进行生产工作负载。
from pyspark.sql.functions import col, udffrom pyspark.sql.types import StringTypeimport jsonimport requeststext_column = "text_redacted_chunks_embedding"output_column = text_column + "_response"headers = {"Content-Type": "application/json", "kbn-xsrf": "true", "osd-xsrf": "true", "security_tenant": "global"};index_name = 's3_vector_data_v1'def index_data(text_redacted_chunks, text_redacted_chunks_embedding): input_json = json.dumps({"text_content": text_redacted_chunks[-1], "text_content_v": text_redacted_chunks_embedding[-1]}) response = requests.request(method="POST", url=f'https://search-canvas-vector-db-domain-dt3yq3b4cykwuvc6t7rnkvmnka.us-west-2.es.amazonaws.com/{index_name}/_doc', headers=headers, json=input_json, auth=(master_user, 'master_pass'), timeout=30) return response.contentindexing_udf = udf(index_data, StringType())df = df.withColumn('index_response', indexing_udf(col("text_redacted_chunks"), col("text_redacted_chunks_embedding")))
最后,创建的数据流如下:
通过这个数据流,PDF文件的数据已被读取并在亚马逊OpenSearch中进行向量嵌入索引。现在,我们需要创建一个带有查询的文件来查询索引的数据,并将其保存到亚马逊S3位置。我们将指向文件的搜索数据流,并将输出结果保存在亚马逊S3位置的新文件中。
准备提示信息
在将PDF转化为知识库后,我们可以通过搜索知识库来测试它是否正常工作。我们将按照以下步骤处理每个查询:
- 为查询生成嵌入(由亚马逊Bedrock提供支持)
- 查询向量数据库以获取最近的邻居上下文(由亚马逊OpenSearch提供支持)
- 将查询和上下文组合成提示信息。
- 使用提示信息查询LLM(由亚马逊Bedrock提供支持)
- 在SageMaker Canvas首页上选择数据准备。
- 选择页面右侧的创建,然后给出数据流名称并选择创建。
现在让我们加载用户问题,然后通过将问题和相似文档相结合来创建一个提示信息。将此提示信息提供给LLM,以生成对用户问题的答案。
- 加载包含用户问题的csv文件。选择导入数据,然后从下拉列表中选择表格。
- 数据源,选择从下拉列表中选择Amazon S3。或者,您可以选择上传一个包含用户查询的文件。
- 添加自定义转换以将数据转化为向量嵌入,并在从亚马逊OpenSearch中搜索相关嵌入之前,将其与来自知识库的查询和上下文结合起来。要为查询生成嵌入,您可以使用前面第7步提到的相同示例代码片段使用Bedrock生成文本嵌入。
让我们调用亚马逊OpenSearch API来搜索生成的向量嵌入的相关文档。添加一个使用Python(PySpark)的自定义转换。
from pyspark.sql.functions import col, udf
from pyspark.sql.types import StringType
import json
import requests
text_column = "Queries_embedding"
output_column = text_column + "_response"
headers = {"Content-Type": "application/json", "kbn-xsrf": "true", "osd-xsrf": "true", "security_tenant": "global"}
index_name = 's3_vector_data_v1'
def search_data(text_column_embedding):
input_json={'size':20,'query':{'knn':{'text_content_v':{'vector':{text_column_embedding},'k':5,},},},'fields':['text_content']}
response = requests.request(method="GET",
url=f'https://search-canvas-vector-db-domain-dt3yq3b4cykwuvc6t7rnkvmnka.us-west-2.es.amazonaws.com/{index_name}/_search',
headers=headers,
json=input_json,
auth=(master_user, master_pass'),
timeout=30)
return response.content
search_udf = udf(search_data, types.ArrayType())
df = df.withColumn(output_column,search_udf(col(text_column)))
让我们添加一个自定义的转换器,调用Amazon Bedrock API来查询响应,传递Amazon OpenSearch知识库中的文档。从示例代码段中选择使用上下文查询Bedrock。对代码段进行必要的更改,然后选择添加。
总之,基于RAG的问答数据流程如下:
机器学习实践者花费大量时间编写特征工程代码,对其初始数据集进行应用,对工程化数据集进行模型训练,并评估模型准确性。由于这项工作的实验性质,即使是最小规模的项目也会导致多次迭代。同样的特征工程代码通常会被反复运行,浪费时间和计算资源来重复相同的操作。在大型组织中,这可能导致更大的生产力损失,因为不同的团队经常运行相同的作业,甚至编写重复的特征工程代码,因为他们对之前的工作一无所知。为了避免重新处理特征,我们将导出数据流到Amazon的SageMaker管道。让我们选择查询右侧的+按钮。选择导出数据流,然后选择运行SageMaker管道(通过Jupyter笔记本)。
清理工作
为避免未来产生费用,请删除或关闭您在本文中创建的资源。有关更多详细信息,请参阅退出Amazon SageMaker Canvas。
结论
在本文中,我们展示了Amazon SageMaker Canvas的端到端功能,扮演了为LLM准备数据的数据专业人员的角色。交互式数据准备使得快速清理、转换和分析数据以生成有信息量的特征成为可能。通过消除编码复杂性,SageMaker Canvas允许快速迭代创建高质量的训练数据集。这种加速工作流直接导致构建、训练和部署出色的机器学习模型以实现业务影响力。凭借其全面的数据准备和从数据到洞察的统一体验,SageMaker Canvas赋予用户改善他们的机器学习成果的能力。
我们鼓励您通过探索Amazon SageMaker Data Wrangler、Amazon SageMaker Canvas、Amazon Titan模型、Amazon Bedrock和Amazon OpenSearch Service,使用本文中提供的示例实现和与您业务相关的数据集构建解决方案。如果您有问题或建议,请留言。