ベクトルインデックスへのベクトルの挿入 - Amazon Simple Storage Service

ベクトルインデックスへのベクトルの挿入

注記

Amazon S3 Vectors は Amazon Simple Storage Service のプレビューリリースであり、変更される可能性があります。

PutVectors API オペレーションを使用して、ベクトルインデックスにベクトルを追加できます。各ベクトルは、ベクトルインデックス内の各ベクトルを一意に識別するキーで構成されます。インデックスに既に存在するキーを持つベクトルを配置すると、既存のベクトルが完全に上書きされ、以前のベクトルを検索できなくなります。書き込みスループットを最大化するには、PutVectors の最大バッチサイズまで、大きなバッチでベクトルを挿入することをお勧めします。PutVectors API コールあたりのベクトルの制限である PutVectors の最大バッチサイズの詳細については、「制限と制約」を参照してください。さらに、メタデータ (年、作成者、ジャンル、場所など) をキーと値のペアとして各ベクトルにアタッチできます。デフォルトでは、ベクトルにアタッチされているすべてのメタデータキーはフィルタリング可能で、類似度クエリでフィルターとして使用できます。ベクトルインデックスの作成中にフィルタリング不可として指定されたメタデータキーのみがフィルタリングから除外されます。S3 ベクトルインデックスは、メタデータの文字列、数値、ブール値、およびリストタイプをサポートします。ベクトルあたりの合計メタデータサイズ制限とベクトルあたりのフィルタリング可能なメタデータサイズ制限の詳細については、「制限と制約」を参照してください。メタデータサイズがこれらの制限を超えると、PutVectors API オペレーションは 400 Bad Request エラーを返します。

PutVectors API オペレーションを使用してベクトルインデックスにベクトルデータを追加する前に、raw データをベクトル埋め込みに変換する必要があります。これは、浮動小数点数の配列としてのコンテンツの数値表現です。ベクトル埋め込みはコンテンツのセマンティックな意味をキャプチャし、PutVectors オペレーションを通じてベクトルインデックスに保存されると類似検索を有効にします。データ型とユースケースに応じて、さまざまな方法を使用してベクトル埋め込みを生成できます。これらの方法には、機械学習フレームワーク、特殊な埋め込みライブラリ、Amazon Bedrock などの AWS のサービスの使用が含まれます。例えば、Amazon Bedrock を使用している場合は、InvokeModel API オペレーションと任意の埋め込みモデルを使用して埋め込みを生成できます。

さらに、Amazon Bedrock ナレッジベースは、Amazon Bedrock が S3 データソースからデータを自動的に取得し、コンテンツをテキストブロックに変換し、埋め込みを生成してベクトルインデックスに保存するフルマネージドのエンドツーエンド RAG ワークフローを提供します。その後、ナレッジベースをクエリし、ソースデータから取得したチャンクに基づいてレスポンスを生成できます。

さらに、オープンソースの Amazon S3 Vectors Embed CLI ツールを使用すると、埋め込みを生成し、コマンドラインからセマンティック検索を簡単に実行できます。Amazon Bedrock 基盤モデルによるベクトル埋め込みの生成と、S3 ベクトルインデックス内のセマンティック検索オペレーションの両方を自動化するこのオープンソースツールの詳細については、「s3vectors-embed-cli を使用したベクトル埋め込みの作成とセマンティック検索の実行」を参照してください。

注記

ベクトルデータをベクトルインデックスに挿入するときは、ベクトルデータを float32 (32 ビット浮動小数点) 値として指定する必要があります。より正確な値を AWS SDK に渡すと、S3 Vectors は値を 32 ビットの浮動小数点に変換してから保存します。GetVectorsListVectors、および QueryVectors オペレーションはfloat32値を返します。AWS SDK によってデフォルトの数値タイプが異なる場合があるため、使用している SDK に関係なく、ベクトルが float32 値として適切にフォーマットされていることを確認してください。例えば、Python では、numpy.float32 を使用するか、明示的に値をキャストします。

SDK for Python
# Populate a vector index with embeddings from Amazon Titan Text Embeddings V2. import boto3 import json # Create Bedrock Runtime and S3 Vectors clients in the AWS Region of your choice. bedrock = boto3.client("bedrock-runtime", region_name="us-west-2") s3vectors = boto3.client("s3vectors", region_name="us-west-2") # Texts to convert to embeddings. texts = [ "Star Wars: A farm boy joins rebels to fight an evil empire in space", "Jurassic Park: Scientists create dinosaurs in a theme park that goes wrong", "Finding Nemo: A father fish searches the ocean to find his lost son" ] # Generate vector embeddings. embeddings = [] for text in texts: response = bedrock.invoke_model( modelId="amazon.titan-embed-text-v2:0", body=json.dumps({"inputText": text}) ) # Extract embedding from response. response_body = json.loads(response["body"].read()) embeddings.append(response_body["embedding"]) # Write embeddings into vector index with metadata. s3vectors.put_vectors( vectorBucketName="media-embeddings", indexName="movies", vectors=[ { "key": "Star Wars", "data": {"float32": embeddings[0]}, "metadata": {"source_text": texts[0], "genre":"scifi"} }, { "key": "Jurassic Park", "data": {"float32": embeddings[1]}, "metadata": {"source_text": texts[1], "genre":"scifi"} }, { "key": "Finding Nemo", "data": {"float32": embeddings[2]}, "metadata": {"source_text": texts[2], "genre":"family"} } ] )