「Amazon SageMaker JumpStartを使用したスケーラブルなテキスト埋め込みと文の類似性検索」

「スケーラブルなテキスト埋め込みと文の類似性検索を実現するためのAmazon SageMaker JumpStartの活用方法」

テキストベクトルまたは埋め込みは、大規模な言語モデル(LLM)によって生成される、テキストの数値ベクトル表現です。LLMは、テキストの補完、質問応答、翻訳などのさまざまなタスクから大規模なデータセットで事前にトレーニングされた後、テキスト埋め込みは入力テキストの意味情報を捉えます。テキスト埋め込みにより、類似度検索、情報検索、推薦と個別化、多言語翻訳など、さまざまな下流アプリケーションが可能になります。

テキスト埋め込みからインテリジェントなアプリケーションを構築する前に、企業や組織は既存のドキュメントを埋め込む必要がありましたが、これは高額で技術的に複雑な作業です。 Amazon SageMaker JumpStartは、この旅を加速するための機械学習(ML)ハブです。SageMaker JumpStartを使用すると、Hugging Face、AI 21 Labs、Cohere、Meta AIなどのさまざまなモデルプロバイダから事前トレーニング済みの先進的なテキスト埋め込みモデルにアクセスできます。SageMaker JumpStartのユーザーインターフェースまたはSDKを使用して、これらのモデルを本番環境にシームレスに展開できます。また、基になるモデルのトレーニングにはデータが使用されません。すべてのデータは暗号化され、独自のVPCから出て行かないため、データはプライベートかつ機密性が保たれます。

この記事では、SageMaker Python SDKを使用してテキスト埋め込みと文の類似性をどのように使用するかを実演します。文の類似性は、LLMによって埋め込みに変換された後の2つのテキストの類似度を評価することを意味し、検索増強型生成(RAG)などのアプリケーションの基礎ステップです。次の操作を実演します。

  • SageMaker JumpStartから展開されたテキスト埋め込みモデルで推論を実行する
  • 独自のデータセットに対して入力文の最も近い隣接点を見つける
  • 大規模なドキュメントにバッチ変換を実行してコストを最小化する

すべてのコードは GitHubで入手できます。

SageMaker JumpStartを使用してテキスト埋め込みモデルを展開する

Amazon SageMakerでモデルをホストするための最初のステップは、AWSサービスのセットアップと認証を行うことです。 Amazon SageMaker Studioでは、ノートブックインスタンスに関連付けられた実行ロールを使用します。次のコードを参照してください:

import sagemaker, boto3, json
from sagemaker.session import Session
sagemaker_session = Session()
aws_role = sagemaker_session.get_caller_identity_arn()
aws_region = boto3.Session().region_name
sess = sagemaker.Session()

Hugging Faceでは、Massive Text Embedding Benchmark(MTEB)がさまざまなテキスト埋め込みタスクのリーダーボードとして提供されています。現在、113の言語で8つの異なるタスクにわたる129のベンチマークデータセットが提供されています。MTEBのトップテキスト埋め込みモデルは、bgegtee5などを含めてSageMaker JumpStartから利用できます。この記事では、huggingface-sentencesimilarity-bge-large-enを使用します。SageMaker SDKを使用して、最先端のテキスト埋め込みモデルを展開できます:

from sagemaker.jumpstart.model import JumpStartModel
model_id = "huggingface-sentencesimilarity-bge-large-en"
text_embedding_model = JumpStartModel(model_id=model_id)
predictor = text_embedding_model.deploy()

テキスト埋め込みモデルのクエリ

テキスト埋め込みモデルのクエリについて詳しく見てみましょう。

テキストから埋め込みへ

SageMakerエンドポイントをすでに展開している場合、predictorは次のように復元できます:

from sagemaker.predictor import Predictor
from sagemaker.deserializers import JSONDeserializer
from sagemaker.serializers import IdentitySerializer
predictor = Predictor(
    endpoint_name=<YOUR_ENDPOINT_NAME>,
    deserializer=JSONDeserializer(),
    serializer=IdentitySerializer(),)
predictor.content_type = "application/x-text"

モデルが正常に展開された後、JSONペイロード内の一連の入力テキストでエンドポイントをクエリできます:

sentences = [    # ペット    "あなたの犬はとてもかわいいです。",    "どれくらいかわいいあなたの犬です!",    "あなたはとてもかわいい犬を持っています!",    # 都市    "シドニーは私が働く場所です。",    "私はシドニーで働いています。",    # 色    "あなたは一番好きな色は何ですか?",    "あなたのお気に入りの色は何ですか?",]predictor.predict(json.dumps(sentences).encode('utf-8'))

これらの文の埋め込みの相関関係は、以下の図にプロットされています。

correlation_heat_map

前の図に示されているように、同じ主題は自身の内部で高い相関を持ち、PetsCities、およびColorを含みます。異なる主題は非常に異なります。これは、LLMs(この場合、bge)によって生成された埋め込みが意味情報を正確に表現できることを示しています。

この記事では、SageMaker JumpStartから現在利用可能なさまざまな文埋め込みモデル間のレイテンシーを比較しました。レイテンシーとは、ユーザーがリクエストを送信してからアプリケーションがリクエストが完了したことを示すまでの時間のことです。以下のテーブルの数値は、ml.g5.2xlargeおよびml.c6i.xlargeインスタンスで同じ一連の入力テキストを使用して合計100回リクエストした場合の平均レイテンシーを示しています。

モデル g5.2xlarge 平均レイテンシー(ms) c6i.xlarge 平均レイテンシー(ms) 言語サポート
all-MiniLM-L6-v2 19.5 27.9 英語
BGE Base En 21.2 114 英語
BGE Small En 28.3 45.6 英語
BGE Large En 34.7 337 英語
Multilingual E5 Base 22.1 118 多言語
Multilingual E5 Large 39.8 360 多言語
E5 Base 25.6 117 英語
E5 Base V2 25.2 123 英語
E5 Large 32.2 339 英語
E5 Large V2 32.5 331 英語
GTE Base 22.2 112 英語
GTE Small 19.7 46 英語
GTE Large 39.7 347 英語

最寄りの近傍を取得する

SageMaker JumpStartから展開されるモデルは、クエリ内のコーパスへの最寄りの近傍を特定するプロセスを支援することもできます。クエリとコーパスが提供されると、モデルはcorpus_id(入力コーパスリスト内の関連するコーパスエントリの位置を示す)とクエリへの近さを示すスコアを生成します。以下のパラメータを使用します:

  • corpus – 最寄りの近傍を見つけるための入力リストを提供します
  • queries – コーパスから最寄りの近傍を見つけるための入力リストを提供します
  • top_k – コーパスから見つける最寄りの近傍の数
  • mode – コーパス内の入力クエリに対して最寄りの近傍を取得するためにnn_corpusとして設定されます

以下のコードを参照してください:

corpus = [    "Amazon SageMakerは、完全に管理されたサービスであり、データの準備、構築、トレーニング、展開、あらゆるユースケースの機械学習(ML)モデルを完全に管理されたインフラストラクチャ、ツール、ワークフローで行うことができます。",    "Amazon SageMakerは、MLストレージボリュームにコードを格納し、セキュリティグループで保護し、必要に応じて静止状態で暗号化することができます。",    "Amazon SageMakerはフルエンドツーエンドのワークフローを提供しますが、既存のツールをSageMakerと共に使用することもできます。各ステージの結果をSageMakerの内外に簡単に転送でき、ビジネスの要件に従います。"
]queries = [    "Amazon SageMakerとは何ですか?",    "Amazon SageMakerはコードをどのように保護していますか?",    "自社のノートブック、トレーニング、またはホスティング環境がある場合はどうすればよいですか?"
]payload_nearest_neighbor = {"corpus": corpus, "queries": queries, "top_k": 3, "mode": "nn_corpus"}query_response = predictor.predict(payload_nearest_neighbor)

以下の出力が得られます:

[    [        {'corpus_id': 0, 'score': 0.8992230892181396},        {'corpus_id': 2, 'score': 0.8664969205856323},        {'corpus_id': 1, 'score': 0.8456423282623291}    ],    [        {'corpus_id': 1, 'score': 0.8919335603713989},        {'corpus_id': 0, 'score': 0.840064525604248},        {'corpus_id': 2, 'score': 0.8145401477813721}    ],    [        {'corpus_id': 2, 'score': 0.7712811231613159},        {'corpus_id': 1, 'score': 0.7564010620117188},        {'corpus_id': 0, 'score': 0.7525666356086731}    ]]

この結果は、最初のクエリが最初のコーパスに最も類似していること、2番目のクエリが2番目のコーパスに近いこと、そしてそれ以降の順番に対応していることを意味します。この例では正しい一致です。

また、前のサンプルを使用して、SageMaker JumpStartで現在利用可能なさまざまな文埋め込みモデル間のレイテンシを比較しました。「ml.g5.2xlarge」インスタンスと「ml.c6i.xlarge」インスタンスで同じペイロードを使用した100回のリクエストの平均レイテンシーを示しています。

モデル g5.2xlarge 平均レイテンシー(ms) c6i.xlarge 平均レイテンシー(ms) 言語サポート
all-MiniLM-L6-v2 21.7 69.1 英語
BGE Base En 29.1 372 英語
BGE Small En 29.2 124 英語
BGE Large En 47.2 1240 英語
Multilingual E5 Base 30 389 多言語
Multilingual E5 Large 47.1 1380 多言語
E5 Base 30.4 373 英語
E5 Base V2 31 409 英語
E5 Large 45.9 1230 英語
E5 Large V2 49.6 1220 英語
GTE Base 30.3 375 英語
GTE Small 28.5 129 英語
GTE Large 46.6 1320 英語

大規模データセットで最も近い隣人を取得する

SageMakerの呼び出しエンドポイントへのリクエストでは、ペイロードは約5MBに制限され、リクエストのタイムアウトは1分に設定されています。コーパスのサイズがこれらの制限を超える場合、SageMakerのトレーニングジョブを使用して、大規模データセットの埋め込みを生成し、モデルとともにSageMakerエンドポイント内に保存することができます。したがって、それらは呼び出しのペイロードの一部として渡す必要はありません。最も近い隣人を見つけるプロセスは、SentenceTransformerとそのユーティリティ関数を使用して行われます。最も近い隣人は、入力文の埋め込みとトレーニングジョブ中に事前計算された文の埋め込みとのコサイン類似度に基づいています。

次の例では、入力の質問に最も近い隣人を見つけるために、Amazon_SageMaker_FAQsデータセットを取得して準備します:

!aws s3 cp s3://jumpstart-cache-prod-us-west-2/training-datasets/Amazon_SageMaker_FAQs/Amazon_SageMaker_FAQs.csv Amazon_SageMaker_FAQs.csvimport pandas as pddata = pd.read_csv("Amazon_SageMaker_FAQs.csv", names=["Questions", "Answers"])data["id"] = data.indexdata_req = data[["id", "Answers"]]data_req.to_csv("data.csv", index=False, header=False)output_bucket = sess.default_bucket()output_prefix = "jumpstart-example-ss-training"s3_output_location = f"s3://{output_bucket}/{output_prefix}/output"training_dataset_s3_path = f"s3://{output_bucket}/{output_prefix}/data/data.csv"!aws s3 cp data.csv {training_dataset_s3_path}

アルゴリズム固有のトレーニングハイパーパラメータは、SageMaker SDKから取得または上書きすることができます:

from sagemaker import hyperparametershyperparameters = hyperparameters.retrieve_default(model_id=model_id, model_version = "*")hyperparameters["batch_size"] = "64"print(hyperparameters)>>> {'max_seq_length': 'None', 'batch_size': '64', 'store_text_with_embedding': 'True'}

SageMakerのトレーニングは、エスティメータオブジェクトを作成し、トレーニングジョブを開始するという2つのステップで構成されます。出力は、トレーニングデータとして使用される大規模データセットの埋め込みが付いたモデルであり、任意の入力文の最も近い隣人を取得するためにデプロイできます。以下のコードを参照してください:

from sagemaker.jumpstart.estimator import JumpStartEstimatorestimator = JumpStartEstimator(    model_id=model_id,    hyperparameters=hyperparameters,    output_path=s3_output_location)estimator.fit(    {"training": f"s3://{output_bucket}/{output_prefix}/data"})predictor = estimator.deploy()

テキストを埋め込みに変換するためのクエリ構文は以前と同じです。ただし、最も近い隣人を取得するためのコードは、以下のように簡略化できます:

payload_nearest_neighbour = {    "queries": ["Amazon SageMakerでRをサポートしていますか?"],    "top_k": 1,    "mode": "nn_train_data",}response = predictor.predict(payload_nearest_neighbour)>>> [[{'id': '9', 'score': 0.9240573048591614}]]data["Answers"].iloc[int(response[0][0]["id"])]>>> "はい、Amazon SageMakerはRをサポートしています。SageMakerノートブックインスタンス内でRを使用することができます。それには、事前にインストールされたRカーネルとreticulateライブラリが含まれています。Reticulateは、Amazon SageMaker Python SDKのRインターフェースを提供し、MLプラクティショナーがRモデルを構築、トレーニング、調整、展開することができます。"

Amazon_SageMaker_FAQsデータセットの質問でエンドポイントにクエリを行い、正しい対応する回答がいくつ返されるかを比較することもできます。以下の例では、トップ3の精度を測定し、似たような質問回答のペアがある場合を考慮しています。つまり、正しい回答がトップ3のうちの1つとして返された場合、正しいクエリとして扱われます。

total_correct_answers = 0for i in range(len(data)):    question = data["Questions"].iloc[i]    payload_nearest_neighbor = {        "queries": [question],        "top_k": 3,        "mode": "nn_train_data",    }    response = predictor.predict(payload_nearest_neighbor)    response_ids = [int(res["id"]) for res in response[0]]    if i in response_ids:        total_correct_answers += 1    else:        pred_answer = [data["Answers"].iloc[response_id] for response_id in response_ids]print(total_correct_answers*100/len(data))>>>81.16883116883118

大規模データセット上で埋め込みを取得するためのバッチ変換を実行する

単一エンドポイントインスタンスのメモリを超える大量の歴史的文書を保持する企業や組織では、コストを節約するためにSageMakerバッチ変換を利用することができます。バッチ変換ジョブを開始すると、SageMakerは必要な計算リソースを起動してデータを処理します。ジョブ中、SageMakerは計算リソースを自動的にプロビジョニングおよび管理します。バッチ変換ジョブが完了すると、これらのリソースは自動的にクリーンアップされ、コストを最小限に抑えることができます。大規模データセットをより小さなチャンクに分割し、より多くのインスタンスを使用することで、インフラストラクチャの管理はせずに、同様のコストでより高速な推論をスケールアウトすることができます。バッチ変換の最大ペイロードは100 MBで、タイムアウトは1時間です。

バッチ変換ジョブの入力形式は、JSON行リスト(JSONの1行がエントリとなる形式)であり、idtext_inputsから構成されます。以下のコードを参照してください:

test_data_file_name = "test.jsonl"test_data = []for i in range(len(data)):    answer = data.loc[i, "Answers"]    payload = {"id": i, "text_inputs": answer}    test_data.append(payload)with open(test_data_file_name, "w") as outfile:    for entry in test_data:        outfile.write(f"{json.dumps(entry)}\n")s3 = boto3.client("s3")s3.upload_file(test_data_file_name, output_bucket, f"{output_prefix}/batch_input/test.jsonl")

データが Amazon Simple Storage Service (Amazon S3) に準備されたら、SageMaker JumpStart モデルからバッチ変換オブジェクトを作成し、変換ジョブを開始します:

s3_input_data_path = f"s3://{output_bucket}/{output_prefix}/batch_input/"s3_output_data_path = f"s3://{output_bucket}/{output_prefix}/batch_output/"batch_transformer = text_embedding_model.transformer(    instance_count=1,    instance_type="ml.p3.2xlarge",    output_path=s3_output_data_path,    assemble_with="Line",    accept="text/csv",    max_payload=1,)batch_transformer.transform(    s3_input_data_path,    content_type="application/jsonlines",    split_type="Line")batch_transformer.wait()

バッチ変換ジョブが完了したら、Amazon S3 から結果をダウンロードすることができます:

s3 = boto3.client("s3")s3.download_file(    output_bucket, output_prefix + "/batch_output/" + "test.jsonl.out", "predict.jsonl")with open("predict.jsonl", "r") as json_file:    json_list = list(json_file)

結論

SageMaker JumpStart は、テキスト埋め込みやセマンティック検索のための先進的な大規模言語基盤モデルを簡単に利用する方法を提供します。ユーザーインターフェースまたはわずかなコード行を使用して、高精度なテキスト埋め込みモデルを展開し、大規模データセットでセマンティックマッチを見つけ、スケールとコストの効率性が向上します。SageMaker JumpStart は、MTEBリーダーボード上でベンチマークされたモデルなど、最先端のモデルへの即時アクセスを提供することで、セマンティック検索の実装の障壁を取り除きます。ビジネスや開発者は、より高速にインテリジェントな検索や推薦システムを構築することができます。

この記事では、類似の意味を持つ質問と回答の検索方法を紹介しました。これは、RAGユースケース、推奨およびパーソナライゼーション、多言語翻訳などに適用することができます。言語モデルの進化とSageMaker JumpStartのシンプルさにより、より多くの組織が生成的なAI機能を製品に組み込むことができます。次のステップとして、独自のデータセットでSageMaker JumpStartのテキスト埋め込みモデルを試し、RAGユースケースに対して結果をテストおよびベンチマークしてみることができます。

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

機械学習

AIキャリアのトレンド:人工知能の世界で注目されているものは何ですか?

急速に成長しているAI分野でのキャリアをお探しですか?エキサイティングな機会を提供するAIキャリアのトップ6つを発見してく...

データサイエンス

SIGGRAPH特別講演:NVIDIAのCEOがLAショーに生成AIをもたらす

生成AIがますますデジタルでハイパーコネクテッドな世界に広がる中、NVIDIAの創設者兼CEOであるJensen Huang氏は、世界最高の...

人工知能

「Stack Overflowは、OverflowAIによって開発者サポートを革新します」

Stack Overflowは、技術的な回答を求める開発者向けの有名なプラットフォームです。革新的なOverflowAIの提供により、生成型A...

AI研究

「地震をAIで把握する:研究者が深層学習モデルを公開、予測の精度を向上」

研究チームは地震モデルの現状を変革しようとしています。 カリフォルニア大学バークレー校、カリフォルニア大学サンタクルー...

AIニュース

「世界最大の広告主がAIの力を受け入れる:広告業界におけるパラダイムシフト」

広告業界を再構築する可能性を秘めた動きとして、世界でも有名な広告主の一部が生成型人工知能(AI)の可能性を活用していま...

人工知能

ChatGPT Vislaプラグインを使用してビデオを作成する方法

たった一つのプロンプトで、Visla ChatGPTプラグインはわずか数秒でスクリプトとストック画像を使用したビデオを作成します