0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

S3 Vectorsを試してみた

Posted at

背景・目的

S3 Vectorsが先日発表されたので整理します。

まとめ

下記に特徴を整理します

特徴 説明
Amazon S3 Vectors セマンティック検索や AI アプリケーション向けに、コスト最適化された専用ベクターストレージを提供

S3 レベルの弾力性と耐久性を備え、ベクターデータセットを 1 秒未満のクエリパフォーマンスで保存できる S3 Vectors は、ベクターインデックスの構築と拡張が必要なアプリケーションに最適

下記の主要コンポーネントで構成される
・ベクター バケット
・ベクターインデックス
・ベクター
ベクター バケット ベクターを保存およびクエリするために特別に構築された新しいバケットタイプ
ベクターインデックス ・ベクターバケット内では、ベクターデータをベクターインデックス内に整理できる
・ベクターインデックス内のベクターデータに対して類似性クエリを実行する
ベクター ・ベクターはベクターインデックスに保存する
・類似検索や AI アプリケーションでは、ベクターはベクター埋め込みとして作成される
・ベクター埋め込みは、コンテンツ(テキスト、画像、音声など)間の意味的関係を維持する数値表現であり、類似するアイテムは互いに近い位置に配置される
・S3 ベクターは、ベクター間の数学的な近さを比較することで、完全一致ではなく意味的な意味に基づいた類似検索を実行できる
・ベクターデータをベクターインデックスに追加する際に、メタデータを添付することで、タイムスタンプ、カテゴリ、ユーザー設定などの条件に基づいてクエリをフィルタリングできる
S3 Vercotrsを使用した類似検索のユースケース ・Medical imaging
・Copyright infringement
・Image deduplication
・Video understanding
・Enterprise document search
・Personalization
S3 Vectorsの機能 ・Purpose-built storage for vectors
・Perform similarity queries
・Metadata filtering
・Access management and security
・Integration with AWS services

2025/7/20現在、Previewです

2025/7/20現在、下記のリージョンで提供されています

  • 米国東部 (バージニア北部)
  • 米国東部 (オハイオ)
  • 米国西部 (オレゴン)
  • アジアパシフィック (シドニー)
  • 欧州 (フランクフルト) リージョン

概要

下記を基に特徴をまとめます

What is Amazon S3 Vectors?

  • セマンティック検索や AI アプリケーション向けに、コスト最適化された専用ベクターストレージを提供

  • Amazon S3 レベルの弾力性と耐久性を備え、ベクターデータセットを 1 秒未満のクエリパフォーマンスで保存できる S3 Vectors は、ベクターインデックスの構築と拡張が必要なアプリケーションに最適

  • インフラストラクチャをプロビジョニングすることなく、ベクターデータの保存、アクセス、類似性クエリの実行を専用の API 操作セットできる

  • 下記の主要コンポーネントで構成される

    • ベクター バケット
      • ベクターを保存およびクエリするために特別に構築された新しいバケットタイプ
    • ベクターインデックス
      • ベクターバケット内では、ベクターデータをベクターインデックス内に整理できる
      • ベクターインデックス内のベクターデータに対して類似性クエリを実行する
    • ベクター
      • ベクターはベクターインデックスに保存する
      • 類似検索や AI アプリケーションでは、ベクターはベクター埋め込みとして作成される
      • ベクター埋め込みは、コンテンツ(テキスト、画像、音声など)間の意味的関係を維持する数値表現であり、類似するアイテムは互いに近い位置に配置される
      • S3 ベクターは、ベクター間の数学的な近さを比較することで、完全一致ではなく意味的な意味に基づいた類似検索を実行できる
      • ベクターデータをベクターインデックスに追加する際に、メタデータを添付することで、タイムスタンプ、カテゴリ、ユーザー設定などの条件に基づいてクエリをフィルタリングできる
  • S3 Vectorsへの書き込みは強力な整合性を備えているため、最後に追加されたデータにすぐにアクセスできる

  • 時間の経過とともにベクトルを書き込み、更新、削除すると、S3 Vectorsはベクトルデータを自動的に最適化し、データセットが拡張および進化しても、ベクトルストレージの最高のコストパフォーマンスを実現する

  • バケットやIAMポリシーなど、Amazon S3の既存のアクセス制御メカニズムを使用して、ベクトルデータへのアクセスを制御できる

Use cases: Similarity searches across large datasets

  • 類似検索では、キーワードの正確な一致ではなく、ベクトル表現に基づいて概念的に関連するアイテムを見つけることができる
  • これらの検索では、正確な単語や視覚要素が異なっていても、類似した意味や特徴を持つコンテンツを特定する
  • S3 Vectors を使用した類似性検索の一般的なユースケースは下記の通り
    • Medical imaging
      • 数百万枚の医療画像から類似点を見つけ、診断と治療計画を支援する
    • Copyright infringement
      • 大規模なメディアライブラリから派生コンテンツの可能性があるものを特定する
    • Image deduplication
      • 大規模な画像コレクションから重複した画像やほぼ重複した画像を検出して削除する
    • Video understanding
      • ビデオアセット内の特定のシーンやコンテンツを検索
    • Enterprise document search
      • 企業ドキュメント全体にわたるセマンティック検索を可能にし、意味に基づいて関連情報を検索する
    • Personalization
      • 類似アイテムを検索してカスタマイズされたおすすめを配信

Features of S3 Vectors

Purpose-built storage for vectors

  • S3 Vectors は、ベクターデータの保存とクエリに特化したクラウド初の専用オブジェクトストレージ

  • ベクターバケットは、ベクターデータ向けに、コスト効率、弾力性、耐久性に優れたストレージを提供するように設計されている

  • ベクトル埋め込みは、顧客による非構造化データをりようされている

    • 医療画像間の類似点検出
    • 数千時間におよぶビデオ映像における異常値の検出
    • 大規模なコードベースのナビゲーション
    • 特定の法的問題に最も関連性の高い判例の特定など、
  • これらの新興アプリケーションは、埋め込みモデルと組み合わせることで、データ(テキスト、画像、ビデオ、コードなど)の意味を数値ベクトル埋め込みとしてエンコードする

  • ベクターバケット内では、インフラストラクチャをプロビジョニングすることなく、ベクターデータをベクターインデックス内に整理できる

  • 時間の経過とともにベクターの書き込み、更新、削除が行われると、S3 Vectors はベクターデータを自動的に最適化し、データセットがスケールして進化しても、ベクターストレージの最高のコストパフォーマンスを実現する

Perform similarity queries

  • S3 Vectors を使用すると、効率的な類似性クエリを実行し、クエリベクトルに最も類似するベクトルを 1 秒未満の応答時間で見つけることができる
  • S3 Vectors は、クエリの頻度が低いワークロードに最適

Metadata filtering

  • メタデータ(年、著者、ジャンル、場所など)をキーと値のペアとしてベクターに添付できる
  • デフォルトでは、明示的にフィルタリング不可と指定しない限り、すべてのメタデータはフィルタリング可能
  • フィルタリング可能なメタデータを使用すると、特定の属性に基づいてクエリ結果をフィルタリングし、クエリの関連性を高めることができる
  • ベクターインデックスは、下記のメタデータをサポートしている
    • 文字列
    • 数値
    • ブール値
    • リスト型

Access management and security

  • AWS Organizations のIAM とサービスコントロールポリシーを使用して、ベクターバケット内のリソースへのアクセスを管理できる
  • S3 Vectors は、Amazon S3 とは異なるサービス名前空間s3vectors(namespace)を使用する
  • そのため、S3 Vectors サービスとそのリソースに特化したポリシーを設計できる
  • 個々のベクターインデックス、ベクターバケット内のすべてのベクターインデックス、またはアカウント内のすべてのベクターバケットへのアクセスを許可するポリシーを設計できる
  • Amazon S3 のすべてのブロックパブリックアクセス設定は、ベクターバケットに対して常に有効になっており、無効にすることはできない

Integration with AWS services

  • Amazon OpenSearch Service
    • OpenSearch APIオペレーションを継続しながら、ベクターストレージコストを最適化する
    • 下記のような高度な検索機能を必要とするワークロードに最適
      • ハイブリッド検索
      • 集約
      • 高度なフィルタリング
      • ファセット検索
    • S3ベクターインデックスのスナップショットをAmazon OpenSearch Serverlessにエクスポートすることで、高QPSかつ低レイテンシーなベクター検索を実現できる
  • Amazon Bedrock ナレッジベース
    • S3 Vectors 内のベクターインデックスをベクターストアとして選択し、検索拡張生成 (RAG) アプリケーションのストレージコストを節約する
  • SageMaker Unified Studio の Amazon Bedrock
    • S3 Vectors をベクター ストアとして使用してナレッジ ベースを開発およびテストする

Limitations and restrictions

下記を基に特徴を整理します

制約事項 内容
アカウント内の AWS リージョンあたりのベクターバケット数 10,000
ベクトルバケットあたりのベクトルインデックス 10,000
ベクトルインデックスあたりのベクトル数 最大5000万
ベクトルあたりの次元値 1 ~ 4,096
ベクターあたりのメタデータ合計 最大 40 KB (フィルタ可能 + フィルタ不可能)
ベクトルあたりのメタデータキーの合計数 最大10
ベクターあたりのフィルタリング可能なメタデータ 最大 2 KB
ベクトルインデックスあたりのフィルタリング不可能なメタデータキー 最大10
ベクトルインデックスあたりの1秒あたりの書き込み要求数 最大5
リクエストペイロードサイズ 最大20 MiB
API呼び出しあたりのベクトル数PutVectors 最大500
API呼び出しあたりのベクトル数DeleteVectors 最大500
API呼び出しあたりのベクトル数GetVectors 最大100
リクエストごとのトップK結果QueryVectors 最大30件
応答のページあたりにリストされるベクトル数ListVectors 最大 1,000
応答のページごとにリストされるベクター バケットの数ListVectorBuckets 最大 500 個
応答のページごとにリストされるベクター インデックスListIndexes 最大 500 個
並列リストのセグメント数 最大16

Pricing

下記を基に特徴を整理します

本ページは、バージニアを基に整理しています。

分類 項目 金額
S3 Vectors ストレージ ベクトルデータ、キー、メタデータの月間論理ストレージ 1GB 0.06ドル
S3 Vectors リクエスト 1GBあたりのPut 1GBあたり、0.20ドル
GET,LIST,その他すべてのリクエスト 1000リクエストあたり、0.0055ドル
S3 Vectorsクエリ 1000リクエストあたり 0.0025ドル
S3 ベクトルデータ 最初の10万個 1TBあたり、0.00040ドル
10万以上 1TBあたり、0.00040ドル

イメージ

image.png

※出典:Introducing Amazon S3 Vectors: First cloud storage with native vector support at scale (preview)

実践

下記を基に試します。

  1. AWSにサインインします
  2. オレゴンに移動します

2025/7/20現在、リージョンが制限されています。今回はオレゴンを利用します

S3 Vectors バケットを作成

  1. S3に移動します

  2. ナビゲーションペインで、「ベクトルバケット」をクリックします
    image.png

  3. 「ベクトルバケットを作成」をクリックします

  4. 下記を入力し、「ベクトルバケットを作成」をクリックします

    • ベクトルバケット名:任意
    • サーバ側の暗号化:暗号化タイプを指定しない(※デフォルトでSSE-S3)
      image.png

Vector Indexesの作成

  1. 上記で作成したS3バケットを選択します
  2. 「ベクトルインデックスを作成」をクリックします
  3. 下記を入力し、「ベクトルインデックスを作成」をクリックします
    • ベクトルインデックス名:任意
    • ディメンション:ここでは1024
    • 距離メトリック:ここではコサイン
      image.png

モデルアクセス

  1. Bedrockにアクセスします
  2. ナビゲーションペインで「モデルアクセス」をクリックします
  3. 「特定のモデルを有効にする」をクリックします
  4. 「Titan Text Embeddings V2」を選択し、「次へ」をクリックします
  5. 「送信」をクリックします
  6. アクセスが付与されました
    image.png

クライアントアプリの作成

boto3のバージョンアップ

  1. 現在のboto3のバージョンを確認します

    % pip list | grep boto3
    boto3                     1.35.51
    % 
    
  2. アップグレードします

    % pip install --upgrade boto3 botocore
    
  3. あらためてバージョンを確認します(1.39.9になりました)

    % pip list | grep boto3               
    boto3                     1.39.9
    % 
    

事前準備:GitHubリポジトリの作成

  1. リポジトリを作成します
    % gh repo create sample-s3-vector-client --public --clone
    ✓ Created repository XXXXX/sample-s3-vector-client on github.com
      https://github.com/XXXXX/sample-s3-vector-client
    % 
    
  2. できました
    % gh repo view sample-s3-vector-client
    
    XXXXX/sample-s3-vector-client
    No description provided
    
    This repository does not have a README
    
    View this repository on GitHub: https://github.com/XXXXX/sample-s3-vector-client
    % 
    
  3. 作成したフォルダをCursorのワークスペースに追加します

Embeddingのコードを作成

まずは、説明文をベクトル変換するプログラムを作成し、動作を確認します

  1. s3vectors_example.py

    import boto3 
    import json 
    
    # Create a Bedrock Runtime client in the AWS Region of your choice. 
    bedrock = boto3.client("bedrock-runtime", region_name="us-west-2") 
    
    # The text strings 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"]
    
    embeddings=[]
    #Generate vector embeddings for the input texts
    for text in texts:
            body = json.dumps({
                "inputText": text
            })    
            # Call Bedrock's embedding API
            response = bedrock.invoke_model(
            modelId='amazon.titan-embed-text-v2:0',  # Titan embedding model 
            body=body)   
            # Parse response
            response_body = json.loads(response['body'].read())
            embedding = response_body['embedding']
            embeddings.append(embedding)
    
    # Print results
    for i, (text, embedding) in enumerate(zip(texts, embeddings)):
        print(f"Text {i+1}: {text}")
        print(f"Embedding dimension: {len(embedding)}")
        print(f"First 5 elements: {embedding[:5]}")
        print()
    
    
  2. 実行します

    % python bedrock_embeddings.py
    Text 1: Star Wars: A farm boy joins rebels to fight an evil empire in space
    Embedding dimension: 1024
    First 5 elements: [-0.024966709315776825, 0.03783351927995682, -0.026106879115104675, 0.0013980172807350755, 0.04545948654413223]
    
    Text 2: Jurassic Park: Scientists create dinosaurs in a theme park that goes wrong
    Embedding dimension: 1024
    First 5 elements: [-0.03530469909310341, 0.05504326894879341, 0.016251258552074432, -0.000269032025244087, 0.015589597634971142]
    
    Text 3: Finding Nemo: A father fish searches the ocean to find his lost son
    Embedding dimension: 1024
    First 5 elements: [-0.06587030738592148, 0.07032894343137741, 0.047515518963336945, -0.03197236359119415, -0.017177045345306396]
    
    % 
    

S3 Vectorsに登録

  1. 上記で作成したコードに下記を追加します。なおバケット名とインデックス名は作成したものに置き換えてください

    bucket_name = "your-bucket-name"
    index_name = "your-index-name"
    
    # Insert vector embedding
    s3vectors.put_vectors( vectorBucketName=bucket_name,
      indexName=index_name,
      vectors=[
    {"key": "v1", "data": {"float32": embeddings[0]}, "metadata": {"id": "key1", "source_text": texts[0], "genre":"scifi"}},
    {"key": "v2", "data": {"float32": embeddings[1]}, "metadata": {"id": "key2", "source_text": texts[1], "genre":"scifi"}},
    {"key": "v3", "data": {"float32": embeddings[2]}, "metadata": {"id": "key3", "source_text":  texts[2], "genre":"family"}}
    ],
    )
    
    #Create an embedding for your query input text
    # The text to convert to an embedding.
    input_text = "List the movies about adventures in space"
    
    # Create the JSON request for the model.
    request = json.dumps({"inputText": input_text})
    
    # Invoke the model with the request and the model ID, e.g., Titan Text Embeddings V2. 
    response = bedrock.invoke_model(modelId="amazon.titan-embed-text-v2:0", body=request)
    
    # Decode the model's native response body.
    model_response = json.loads(response["body"].read())
    
    # Extract and print the generated embedding and the input text token count.
    embedding = model_response["embedding"]
    
    # Performa a similarity query. You can also optionally use a filter in your query
    query = s3vectors.query_vectors( vectorBucketName=bucket_name,
      indexName=index_name,
      queryVector={"float32":embedding},
      topK=3, 
      filter={"genre":"scifi"},
      returnDistance=True,
      returnMetadata=True
      )
    results = query["vectors"]
    print(results)
    
    
    • s3vectors.query_vectors
      • queryVector={"float32": embedding}:float32型の配列として指定
      • topK=3: 上位3件の類似ベクトルを返す
      • filter={"genre":"scifi"}:メタデータでジャンルが"scifi"のものだけを対象にする
      • returnDistance=True: 距離(類似度スコア)を返す
      • returnMetadata=True: メタデータも返す
  2. 実行します。genreがscifiのものが返されました

    % python bedrock_embeddings.py
    Text 1: Star Wars: A farm boy joins rebels to fight an evil empire in space
    Embedding dimension: 1024
    First 5 elements: [-0.024966709315776825, 0.03783351927995682, -0.026106879115104675, 0.0013980172807350755, 0.04545948654413223]
    
    Text 2: Jurassic Park: Scientists create dinosaurs in a theme park that goes wrong
    Embedding dimension: 1024
    First 5 elements: [-0.03530469909310341, 0.05504326894879341, 0.016251258552074432, -0.000269032025244087, 0.015589597634971142]
    
    Text 3: Finding Nemo: A father fish searches the ocean to find his lost son
    Embedding dimension: 1024
    First 5 elements: [-0.06587030738592148, 0.07032894343137741, 0.047515518963336945, -0.03197236359119415, -0.017177045345306396]
    
    [{'key': 'v1', 'metadata': {'id': 'key1', 'genre': 'scifi', 'source_text': 'Star Wars: A farm boy joins rebels to fight an evil empire in space'}, 'distance': 0.795756459236145}, {'key': 'v2', 'metadata': {'source_text': 'Jurassic Park: Scientists create dinosaurs in a theme park that goes wrong', 'id': 'key2', 'genre': 'scifi'}, 'distance': 0.922179102897644}]
    % 
    

考察

今回、S3 Vectorsを試してみました。次回はAmazon Bedrock knowledge baseとの統合を試してみます。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?