「Amazon SageMaker Data Wranglerを使用して、生成型AIのデータ準備をシンプルにする」

「Amazon SageMaker Data Wranglerを活用して、生成型AIのデータ準備を簡単にする方法」

生成的人工智能(生成AI)模型在生成高质量的文本、图像和其他内容方面展示了令人印象深刻的能力。然而,这些模型需要大量干净、结构化的训练数据才能发挥其全部潜力。大多数现实世界的数据以PDF等非结构化格式存在,因此在有效使用之前需要进行预处理。

根据IDC的数据,非结构化数据占当今所有业务数据的80%以上。这包括电子邮件、PDF、扫描文件、图像、音频、视频等格式。尽管这些数据包含了宝贵的见解,但它们的非结构化特性使得AI算法很难解释和学习。根据Deloitte的一项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提供支持)

事前条件

この手順では、次のものが必要です:

  • AWSアカウント:AWS Identity and Access Management(AWS IAM)ポリシーとロールを作成する権限を持つ
  • Amazon SageMakerへのアクセス:Amazon SageMaker StudioのインスタンスとStudioのユーザーが必要です。詳細は、Amazon SageMaker Canvasの使用を開始するを参照してください。
  • Amazon Bedrockモデルへのアクセス:モデルアクセスのガイドラインに従ってください。詳細は、モデルアクセスを参照してください。
  • Amazon Comprehendへのアクセス:Amazon SageMaker Studioの実行ロールには、Amazon Comprehendのアクションを呼び出す権限が必要です。
  • Amazon Textractへのアクセス:Amazon SageMaker Studioの実行ロールに、Amazon Textractを呼び出す権限が必要です。
  • Amazon Simple Storage Service(Amazon S3)バケットへの読み取りと書き込みアクセス権
  • ベクトルデータベースとしてのAmazon OpenSearchへのアクセス:ベクトルデータベースの選択は重要なアーキテクチャの決定です。いくつかの優れたオプションがあり、それぞれに独自の強みがあります。この例では、Amazon OpenSearchをベクトルデータベースとして選択しました。

注意:OpenSearchサービスドメインは、ここでの手順に従って作成してください。単純化のため、詳細なアクセス制御のためのマスターユーザー名とパスワードのオプションを選択します。ドメインが作成されたら、次のマッピングとAmazon Titanの埋め込みに合わせた次元1536のベクトルインデックスを作成します:

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コンソールで、ナビゲーションペインでドメインを選択します。
  2. ドメインを選択します。
  3. 起動メニューで、Canvasを選択します。

データフローを作成する

SageMaker Canvasでデータフローを作成するには、以下の手順を完了してください:

  1. SageMaker Canvasのホームページで、データの準備を選択します。
  2. ページの右側で作成を選択し、データフローの名前を入力して、作成を選択します。
  3. これにより、データフローページに移動します。
  4. データのインポートを選択し、タブularデータを選択します。

さて、Amazon S3バケットからデータをインポートしましょう:

  1. データのインポートを選択し、ドロップダウンリストからTabularを選択します。
  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)を選択します。

例のコードスニペットから、mask PII をブラウズして選択します。コードスニペットを適切に変更し、Add を選択します。

  1. 次のステップは、テキストコンテンツをチャンクに分割することです。 Add Step を選択し、Custom Transform を選択します。そして、Python(PySpark) を選択します。

例のコードスニペットから、テキストをチャンクに分割するために、必要な変更を行って Add を選択します。

  1. Amazon Bedrock Titan Embeddings モデルを使用して、テキストコンテンツをベクトル埋め込みに変換しましょう。 Add Step を選択し、Custom Transform を選択します。そして、Python(PySpark) を選択します。

例のコードスニペットから、Bedrock でテキスト埋め込みを生成するために、必要な変更を行って Add を選択します。

  1. 今、PDF ファイルのコンテンツにはベクトル埋め込みが利用できます。データを Amazon OpenSearch にインデックスします。 Add Step を選択し、Custom Transform を選択します。そして、Python(PySpark) を選択します。以下のコードを好みのベクトルデータベースを使用するように改変することもできます。単純化のために、マスターユーザー名とパスワードを使用して OpenSearch API にアクセスしていますが、本番ワークロードでは組織のポリシーに応じて適切なオプションを選択してください。

    from pyspark.sql.functions import col, udf
    from pyspark.sql.types import StringType
    import json
    import requests
    
    text_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.content
    
    indexing_udf = udf(index_data, StringType())
    df = df.withColumn('index_response',
                       indexing_udf(col("text_redacted_chunks"), col("text_redacted_chunks_embedding")))

最後に、作成されたデータフローは以下のようになります:

このデータフローにより、PDFファイルからのデータがAmazon OpenSearchでベクトル埋め込みとして読み込まれ、インデックス化されます。それでは、クエリ用ファイルを作成し、インデックス化されたデータをAmazon S3の場所に保存しましょう。検索データフローをファイルに指定し、対応する結果を新しいファイルとしてAmazon S3の場所に出力します。

プロンプトの準備

PDFから知識ベースを作成した後、いくつかのサンプルクエリで知識ベースを検索してテストすることができます。各クエリの処理手順は次のとおりです:

  1. クエリの埋め込みを生成する(Amazon Bedrockで動作)
  2. ベクトルデータベースをクエリして最も近いネイバーコンテキストを取得する(Amazon OpenSearchで動作)
  3. クエリとコンテキストをプロンプトに組み合わせる
  4. プロンプトとともにLLMにクエリを送信する(Amazon Bedrockで動作)
  5. SageMaker Canvasのホームページで データの準備 を選択します。
  6. ページの右側にある 作成 を選択し、データフロー名を入力して 作成 を選択します。

さて、ユーザーの質問を読み込み、質問と類似のドキュメントを組み合わせてプロンプトを作成しましょう。このプロンプトは、ユーザーの質問に対する回答を生成するためにLLMに提供されます。

  1. ユーザーの質問が入ったcsvファイルを読み込みます。 データをインポート を選択し、ドロップダウンリストから タブular を選択します。
  2. データソース を選択し、ドロップダウンリストから Amazon S3 を選択します。または、ユーザークエリを含むファイルをアップロードすることもできます。
  3. カスタムトランスフォーメーションを追加してデータをベクトル埋め込みに変換し、それから関連する埋め込みをAmazon OpenSearchから検索し、ナレッジベースからクエリとコンテキストをAmazon Bedrockに送信するためにカスタムトランスフォーメーションを追加しましょう。クエリの埋め込みのためには、同じ例のコードスニペット Bedrockでテキスト埋め込みを生成する(ステップ#7で説明)を使用できます。

Amazon 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ベースの質問応答データフローは次のようになります:

MLプラクティショナーは、長い時間をかけて特徴エンジニアリングコードを作成し、初期データセットに適用し、エンジニアリングされたデータセットでモデルをトレーニングし、モデルの精度を評価することが多いです。この作業の実験的な性質から、最小のプロジェクトでも複数の繰り返しが発生します。同じ特徴エンジニアリングコードは何度も実行され、同じ操作が繰り返されて時間と計算リソースが浪費されることがよくあります。大規模な組織では、異なるチームがしばしば同じジョブを実行したり、前回の作業に関する知識がないために重複した特徴エンジニアリングコードを書いたりすることがあり、生産性の喪失がさらに大きくなることがあります。特徴の再処理を避けるために、データフローをAmazon SageMakerパイプラインにエクスポートします。クエリの右側の+ボタンを選択し、エクスポートデータフローを選択してSageMakerパイプラインを実行します(Jupyterノートブック経由)。

後片付け

今後の料金を発生させないために、この投稿の手順に従って作成したリソースを削除またはシャットダウンしてください。詳細については、Amazon SageMaker Canvasからログアウトを参照してください。

結論

この投稿では、Amazon SageMaker Canvasのエンドツーエンドの機能を通じて、LLMのデータの準備を行うデータ専門家の役割を担当しました。インタラクティブなデータの準備により、迅速にデータをクリーニング、変換、分析して情報のある特徴を作成しました。コーディングの複雑さを排除することで、SageMaker Canvasは高品質なトレーニングデータセットの作成に向けた迅速な繰り返し作業を可能にしました。この加速されたワークフローは、ビジネスへの影響をもたらすパフォーマントな機械学習モデルの構築、トレーニング、展開に直接つながりました。包括的なデータの準備とデータから洞察までの一貫したエクスペリエンスにより、SageMaker CanvasはユーザーによるMLの成果改善を支援します。

この投稿の提供されているサンプル実装とビジネスに関連するデータセットを使用して、Amazon SageMaker Data Wrangler、Amazon SageMaker Canvas、Amazon Titanモデル、Amazon Bedrock、Amazon OpenSearch Serviceなどの詳細を調べることをお勧めします。質問や提案がある場合は、コメントを残してください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more