この記事で伝えたいこと(ポイント)
- Amazon S3 Vectorsで扱うベクトルとは何かについて説明しているよ
- ベクターストア、Amazon S3 Vectorsがあると何が嬉しいか説明しているよ
- AWS SDKでAmazon S3 Vectorsを検証しているよ
はじめに
この記事では「この前リリースされた機能って実際に動かすとどんな感じなんだろう」とか「もしかしたら内容次第では使えるかも??」などAWSサービスの中でも特定の機能にフォーカスして検証していく記事です。主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)
誤りなどがあれば書き直していく予定です。
今回はAWS Summit NYCでも紹介があったAmazon S3 Vectors(以下、本文ではS3 Vectors)を検証します。
参考:ベクトルの保存とクエリをネイティブにサポートする最初のクラウドオブジェクトストレージ、Amazon S3 Vectors (プレビュー版) を発表
参考:ニューヨークで開催される 2025 年の AWS Summit に関する主要なお知らせ
参考:Introducing Amazon S3 Vectors: First cloud storage with native vector support at scale (preview)
Amazon S3 Vectorsとは
S3 Vectorsは簡単に説明するとAmazon S3にベクトルデータを保存するための新しい機能です。
公式サイトでは以下のように説明されています。
※翻訳した内容です
Amazon S3 Vectorsは、ベクトルを保存およびクエリするためのネイティブサポートを備えた最初のクラウドオブジェクトストアであり、AIエージェント、AI推論、およびAmazon S3に保存されたコンテンツのセマンティック検索のための目的に応じたコスト最適化されたベクトルストレージを提供します。アップロード、保存、およびクエリのコストを最大90%削減することで、S3 Vectorsは大規模なベクトルデータセットを作成および使用することをコスト効果的にし、AIエージェントのメモリとコンテキスト、およびS3データのセマンティック検索結果を改善します。Amazon S3と同じ弾力性、スケール、および耐久性を提供するように設計されており、数十億のベクトルを保存し、サブ秒クエリパフォーマンスでデータを検索できます。大規模なベクトルインデックスを構築および維持する必要があるアプリケーションに最適であり、大量の情報を整理および検索できます。
参考:What is S3 Vectors? - AWS公式サイト
ベクトルを保存?大規模なベクトルインデックスを構築?コンテンツのセマンティック検索のための目的に応じた...なんだって?
よくわからないですね。1つずつ見ていきましょう。
ベクトル(ベクター)とは
S3 Vectorsを知るためには、ベクトルとは何かを理解する必要があります。
まず、ベクトルという言葉を聞いて数学や物理学に理解のある人は矢印を思い浮かべるかもしれません。
ベクトルは大きさと方向を持つ量でたとえば、物理学では力や速度を表すのに使われます。
地球に住むすべての人類は重力という力を受けていますが、これもベクトルで表現できます。
なお、向きを持たない量はスカラーと呼ばれ、たとえば温度や質量などが該当します。
ちなみにプログラミング言語にScalaというJVM言語がありますが、これはイタリア語の「階段」が語源であるため、ベクトルとは関係ありません。
そして、AIや機械学習の世界ではデータを数値のリストとして表現することが一般的でこれを「ベクトル」と呼びます。
たとえば
- 画像をベクトル化すると、画像の特徴を数値で表現
- テキストをベクトル化すると、単語や文の意味を数値で表現
といった具合です。このベクトルを保存するためのストレージ(ベクターストアあるいはベクターデータベース)がS3 Vectorsです。
余談:次元数ってなんぞ
ベクトルを扱っていると次元数という言葉に遭遇します。次元数というのは要するに「表現の粒度」のことだと考えていただければと思います。
次元数(機械学習の分野では特徴量)が多いほど表現の幅が広がりますが、「次元の呪い」という難問にぶつかります。これは主成分分析(PCA)や特徴量選択によって改善が期待できます。
次元数、生成AIに入力されたデータから抽出された特徴量はより抽象化されたベクトルとして表現されます。この抽象化されたベクトルが存在する空間を「潜在空間」と呼び、そのベクトルを「潜在表現」と呼びます。
ベクターストア(ベクターデータベース)とは
ベクターストアは、ベクトルデータを効率的に保存、検索、管理するためのデータベースです。
ベクターデータベースと表現される場合もありますが、基本的には同じ意味です。
ただし、ベクターデータベースと表現した場合はデータベースサービスであることを強調する場合が多いです。
※たとえば、元はデータベースサービスとして提供していたが、ベクトル保存もできるようになった場合などはベクターデータベースと表現されることが多いです。
ちなみにAWSにおいて、ベクターデータベースとして提供されているサービスがいくつかあります。
- Amazon Aurora for PostgreSQLとAmazon RDS for PostgreSQL
- pgvectorを使ってベクトルデータを保存できる
- Amazon Neptune ML
- GraphRAGが実現できる
- Amazon MemoryDB
- MemoryDBベースのベクターデータベース
- Amazon DocumentDB (MongoDB 互換)
- Amazon SageMaker Canvasと組みわせてノーコード機械学習が可能
ベクターデータベースとは ベクターデータベースの説明 - AWS
で、S3にベクトルデータが入ると何が嬉しいの
S3 Vectorsが「ベクトルデータを保存できるベクターストアの機能」であるということがわかったところでS3 Vectorsを使うと何が嬉しいのでしょうか。
ひとことで言うと「オブジェクトストレージベースでベクトル検索ができるようになる」というところです。
具体的には以下のとおりです。
- ベクトル検索用のDBが必要であり、オブジェクトストレージにあるデータをお手軽にRAGできなかった
- Knowledge base for Amazon BedrockとOpenSearchを組み合わせる方法がありますが、コストは比較的に高め
- RDBやNoSQL系のマネージドサービスを使う必要がある
- ちょっとしたベクトル検索をするためにRDBやNoSQL系のマネージドサービスを使うのはオーバースペック※
- オブジェクトストレージとAWS SDKでベクトル検索ができるようになる
※ちょっとしたベクトル検索ではPineconeやFAISSなどのベクターデータベースを使うこともあります。Pineconeに至ってはAWSで利用できるためおすすめです。
前提条件(利用サービスとツール)
今回はS3 Vectorsを使って、ベクトルデータを検索する基本的なハンズオンを行います。
なお、今回はAWS SDK for Python (Boto3)を使って簡単に実装していきますが
あくまでも検証のためなので、実際のアプリケーションでは別の構成を検討することをおすすめします。
なお、S3 Vectorsはコンソールでは実行できない操作にはAWS CLIを利用します。以上を踏まえて利用サービスとツールは以下のとおりです。
利用サービス
- Amazon S3 Vectors
- Amazon Bedrock
- Titan Text Embeddings V2を利用
利用ツール
- AWS CLI
- aws-cli/2.27.63 Python/3.13.5 Darwin/24.5.0 source/arm64
- AWS SDK for Python
- version 1.40.0
ハンズオン
S3 Vectorsのベクターバケットを作成する
まずはデフォルトリージョンをS3 Vecotorsに対応しているリージョンに変更します。
export AWS_DEFAULT_REGION=us-west-2
バケット名にアカウントIDを含めるため、AWSアカウントIDを取得します。
export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query "Account" --output text` && echo $AWS_ACCOUNT_ID
ベクターバケットを作成します。このベクターバケットにベクトルを保存します。
aws s3vectors create-vector-bucket --vector-bucket-name my-vector-${AWS_ACCOUNT_ID}
ベクターバケット名を環境変数に保存します。この環境変数を使ってベクターバケットを操作します。
export S3_VECTOR_BUCKET_NAME=my-vector-${AWS_ACCOUNT_ID}
データをベクターバケットに保存する
実際にデータを保存します。AWS CLIで実行することもできますが、ここではあえてboto3を使ってやってみます。以下のコードを実行します。
実行結果
Index already exists or another error occurred.
Error: An error occurred (ConflictException) when calling the CreateIndex operation: An index with the specified name already exists
Creating embedding for sample text...
Uploading embeddings to S3 Vector index...
Vectors uploaded successfully.
※すでにインデックスを作成している場合はConflictExceptionが発生します。
クエリを実行する
次に格納したベクトルデータを検索します。以下のコードを実行します。
実行結果
Query S3 Vector index...
Querying
Star Wars: A farm boy joins rebels to fight an evil empire in space
Done.
クエリ結果はStar Wars: A farm boy joins rebels to fight an evil empire in spaceです。
実行結果をよく見てみる
インデックスには以下のようなデータをエンベディングして格納しています。
※お馴染みの映画タイトルです。
上記のようなデータに対してList the movies about adventures in spaceという質問を投げています。技術的には類似度の高いものは何かという処理を実行しており、この中で問いに近い文章はStar Warsということになります。
まとめ
以上のようにS3さえあれば、ベクトル検索のデータが準備できるというのが今回新しく実装された新機能です。また、AWS SDKで実行できるようになったのはとても大きいと思います。
筆者が確認したタイミングではAWS LambdaにインストールされているAWS SDKのバージョンは古かったため、S3 Vectorsが実行できなかったですが、アップデートされたら東京リージョンで試してみたいです。※この記事執筆時点ではS3 Vectorsが東京リージョンに来ていないです
おまけ
今回、デバッグ等で役に立ったコマンドを書いていきます。
コマンドTips
ベクターバケット名のみを取得します。
aws s3vectors list-vector-buckets --query "vectorBuckets[0].vectorBucketName" --output text
Bedrockで利用できるモデルIDを表示できます。
aws bedrock list-foundation-models
モデルIDのみを表示する場合は以下のとおりです。
aws bedrock list-foundation-models --query "modelSummaries[].modelId"
ベクターバケットを削除する。AWS CLIのコマンドです。なお、先にインデックスを削除しないことには削除できないのでインデックスを削除してください。インデックスの削除はマネジメントコンソールでできません。
aws s3vectors delete-vector-bucket --vector-bucket-name my-vector-${AWS_ACCOUNT_ID}