

# ベクトルインデックスへのベクトルの挿入
<a name="s3-vectors-index-create"></a>

[PutVectors](https://docs.aws.amazon.com/AmazonS3/latest/API/API_S3VectorBuckets_PutVectors.html) API オペレーションを使用して、ベクトルインデックスにベクトルを追加できます。各ベクトルは、ベクトルインデックス内の各ベクトルを一意に識別するキーで構成されます。インデックスに既に存在するキーを持つベクトルを配置すると、既存のベクトルが完全に上書きされ、以前のベクトルを検索できなくなります。書き込みスループットを最大化し、コストを最適化するには、`PutVectors` の最大バッチサイズまで、大きなバッチでベクトルを挿入することをお勧めします。ただし、ライブ時など、より小さなバッチを使用する必要があるワークロードでは、受信ベクトルデータがすぐに検索可能になる必要があります。その場合は、同時に実行できる `PutVectors` リクエストの数を増やすことで、1 秒あたりの最大許容リクエスト数まで、より高い書き込みスループットを実現できます。`PutVectors` API コールあたりのベクトルの制限である `PutVectors` の最大バッチサイズと、1 秒あたり最大リクエスト数とベクトル数の制限の詳細については、「[制限と制約](s3-vectors-limitations.md)」を参照してください。さらに、メタデータ (年、作成者、ジャンル、場所など) をキーと値のペアとして各ベクトルにアタッチできます。デフォルトでは、ベクトルにアタッチされているすべてのメタデータキーはフィルタリング可能で、類似度クエリでフィルターとして使用できます。ベクトルインデックスの作成中にフィルタリング不可として指定されたメタデータキーのみがフィルタリングから除外されます。S3 ベクトルインデックスは、メタデータの文字列、数値、ブール値、およびリストタイプをサポートします。ベクトルあたりの合計メタデータサイズ制限とベクトルあたりのフィルタリング可能なメタデータサイズ制限の詳細については、「[制限と制約](s3-vectors-limitations.md)」を参照してください。メタデータサイズがこれらの制限を超えると、`PutVectors` API オペレーションは `400 Bad Request` エラーを返します。

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

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

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

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

## AWS SDK の使用
<a name="s3-vectors-create-sdk"></a>

------
#### [ 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"}
        }
    ]
)
```

------