使用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执行所有这些主要的预处理步骤:

  1. 从PDF文档中提取文本(由Textract提供动力)
  2. 删除敏感信息(由Comprehend提供动力)
  3. 将文本划分为片段。
  4. 为每个片段创建嵌入(由Bedrock提供动力)。
  5. 将嵌入上传到向量数据库(由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,请完成以下步骤:

  1. 在 Amazon SageMaker 控制台中,选择导航窗格中的 Domains
  2. 选择您的域。
  3. 在启动菜单中,选择 Canvas

创建一个数据流程

按照以下步骤在SageMaker Canvas中创建一个数据流程:

  1. 在SageMaker Canvas主页上选择数据准备
  2. 在页面右侧选择创建,然后给数据流程命名并选择创建
  3. 这将进入一个数据流程页面。
  4. 选择导入数据,选择表格数据。

现在让我们从Amazon S3存储桶导入数据:

  1. 选择导入数据,从下拉列表中选择表格
  2. 数据源, 从下拉列表中选择Amazon S3
  3. 导航到包含PDF文件位置的元数据文件,并选择该文件。
  4. 现在,元数据文件已加载到数据准备数据流程中,我们可以继续添加下一步来转换数据并索引到Amazon OpenSearch。在这种情况下,文件具有以下元数据,每个文件在Amazon S3目录中的位置。

要添加一个新的转换步骤,请按照以下步骤完成:

  1. 选择加号并选择添加转换
  2. 选择添加步骤并选择自定义转换
  3. 您可以使用Pandas、PySpark、Python自定义函数和SQL PySpark创建自定义转换。对于这个用例,选择Python (PySpark)
  4. 为步骤输入名称。从示例代码片段中浏览并选择从PDF中提取文本。对代码片段进行必要的更改,并选择添加
  5. 让我们添加一步来隐藏从提取的数据中的个人身份信息(PII)数据,通过Amazon Comprehend来实现。选择添加步骤,并选择自定义转换。然后选择Python (PySpark)

从示例代码片段中浏览并选择蒙面 PII(个人身份信息)。对代码片段进行必要的更改,然后选择添加。

  1. 下一步是对文本内容进行分块。选择添加步骤,选择自定义转换,然后选择Python(PySpark)。

从示例代码片段中浏览并选择分块文本。对代码片段进行必要的更改,然后选择添加。

  1. 让我们使用Amazon Bedrock Titan Embeddings 模型将文本内容转换为向量嵌入。选择添加步骤,选择自定义转换,然后选择Python(PySpark)。

从示例代码片段中浏览并选择使用 Bedrock 生成文本嵌入。对代码片段进行必要的更改,然后选择添加。

  1. 现在我们可以获得 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转化为知识库后,我们可以通过搜索知识库来测试它是否正常工作。我们将按照以下步骤处理每个查询:

  1. 为查询生成嵌入(由亚马逊Bedrock提供支持)
  2. 查询向量数据库以获取最近的邻居上下文(由亚马逊OpenSearch提供支持)
  3. 将查询和上下文组合成提示信息。
  4. 使用提示信息查询LLM(由亚马逊Bedrock提供支持)
  5. 在SageMaker Canvas首页上选择数据准备
  6. 选择页面右侧的创建,然后给出数据流名称并选择创建

现在让我们加载用户问题,然后通过将问题和相似文档相结合来创建一个提示信息。将此提示信息提供给LLM,以生成对用户问题的答案。

  1. 加载包含用户问题的csv文件。选择导入数据,然后从下拉列表中选择表格
  2. 数据源,选择从下拉列表中选择Amazon S3。或者,您可以选择上传一个包含用户查询的文件。
  3. 添加自定义转换以将数据转化为向量嵌入,并在从亚马逊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 WranglerAmazon SageMaker CanvasAmazon Titan模型、Amazon Bedrock和Amazon OpenSearch Service,使用本文中提供的示例实现和与您业务相关的数据集构建解决方案。如果您有问题或建议,请留言。