Amazon S3 Vectorsがリリースされたので、気になるところを調べてみた
Amazon S3 Vectorsの新機能を徹底調査。ベクトルデータを簡単・安価に保存・検索できる仕組みの基本API、OpenSearchとの連携、次元数対応など、実装に役立つポイントを解説。
目次
急に来ましたね。念願の廉価でベクトルストアを構築できるやつが。
基本的な部分は元記事で詳細に紹介されていますので、翻訳ツールを使うなりそのまま生成AIに突っ込むなりで読むと良さそうです。
気になったところを AWS Document MCP で調べてみた
で、こういうのが出ると色々と気になる部分が出てくるわけですが、せっかくなので AWS が公開しているドキュメント検索 MCP を使って調査してみました。
https://awslabs.github.io/mcp/servers/aws-documentation-mcp-server
これがあれば OpenSearch いらなくなる?
「ベクターストアを持ちたい」という点に絞れば「yes」っぽいです。 S3 Vectors にはベクトルの追加や類似検索のクエリの API が提供されています。
# S3 Vectors クライアントの作成
s3vectors_client = boto3.client('s3vectors', region_name='us-west-2')
# ベクトルの挿入
s3vectors.put_vectors(
vectorBucketName="channy-vector-bucket",
indexName="channy-vector-index",
vectors=[
{
"key": "v1",
"data": {"float32": embeddings[0]},
"metadata": {"id": "key1", "source_text": texts[0], "genre":"scifi"}
},
# 他のベクトルも同様に挿入...
]
)
# 類似性検索クエリ
query = s3vectors.query_vectors(
vectorBucketName="channy-vector-bucket",
indexName="channy-vector-index",
queryVector={"float32": embedding},
topK=3,
filter={"genre":"scifi"},
returnDistance=True,
returnMetadata=True
)
ただ、OpenSearchの持つ全文検索機能はもちろんありません。そのため、検索精度などを求めていくと、いずれ OpenSearch への移行なども検討する必要が出るのではないかと思われます。
「最大10,000のベクトルインデックス」とのことなので、コンテンツ量が多い場合はマルチベクターストアにするか、OpenSearchを使うことになりそうですね。
OpenSearch へ移行できるの?
「どこかで移行が必要になるかも」となると、「じゃあどうやって移行するの?」となりますよね。そこについてもAWSサービス間の移行ならではの手軽さがありました。
S3 Vectors には「Export to OpenSearch」機能があり、Point in timeで移行ができる様子です。
ディメンジョン(次元数)は?
Cohere / OpenAI / Amazon Titanなどでベクトルの次元数が異なることがありますが、そこも対応できそうです。作成時に次元数を指定できますので、利用予定のモデルに合わせた設定にしましょう。ただ、後から変更はできないので、次元数の異なるモデルへの移行などはインデックスなどを全部作り直すことになりそうです。
サポートしているクエリ方法は?
Cosine(コサイン類似度)
Euclidean(ユークリッド距離)
の2つに対応しています。
どんなAPIがある?
基本的なオペレーションは一通り揃っていそうです。
- CreateVectorBucket – ベクトルバケットの作成
- CreateIndex – ベクトルインデックスの作成
- PutVectors – ベクトルの挿入
- QueryVectors – ベクトル検索
- GetVectors – ベクトル取得
- DeleteVectors – ベクトル削除
- ListVectors – ベクトル一覧取得
IAM ロールはどう設定する?
この辺りはAWS MCPさまさまですね。かなりいろんな権限がある様子です。
https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-vectors-iam-policies.html
Lambdaからアクセスする場合だと、こんな感じになるみたいです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowApplicationVectorAccess",
"Effect": "Allow",
"Action": [
"s3vectors:QueryVectors",
"s3vectors:GetVectors",
"s3vectors:PutVectors",
"s3vectors:ListVectors"
],
"Resource": [
"arn:aws:s3vectors:aws-region:123456789012:bucket/your-vector-bucket/index/your-index-name"
]
},
{
"Sid": "AllowGetIndex",
"Effect": "Allow",
"Action": "s3vectors:GetIndex",
"Resource": "arn:aws:s3vectors:aws-region:123456789012:bucket/your-vector-bucket/index/*"
},
{
"Sid": "AllowIndexInspection",
"Effect": "Allow",
"Action": "s3vectors:ListIndexes",
"Resource": "arn:aws:s3vectors:aws-region:123456789012:bucket/your-vector-bucket"
}
]
}
ベクトルバケット操作
s3vectors:CreateVectorBucket – 新しいベクトルバケットを作成
s3vectors:GetVectorBucket – ベクトルバケットの属性と設定を取得
s3vectors:DeleteVectorBucket – 空のベクトルバケットを削除
s3vectors:ListVectorBuckets – アカウント内のすべてのベクトルバケットを一覧表示
インデックス操作
s3vectors:CreateIndex – 新しいベクトルインデックスを作成
s3vectors:GetIndex – ベクトルインデックスの属性と設定を取得
s3vectors:DeleteIndex – ベクトルインデックスとその内容を削除
s3vectors:ListIndexes – ベクトルバケット内のすべてのインデックスを一覧表示
ベクトルデータ操作
s3vectors:PutVectors – インデックスにベクトルを追加または更新
s3vectors:GetVectors – ベクトルキーによる特定のベクトルとメタデータを取得
s3vectors:DeleteVectors – インデックスから特定のベクトルを削除
s3vectors:ListVectors – インデックス内のベクトルキーを一覧表示
s3vectors:QueryVectors – インデックスに対してベクトル類似性クエリを実行
ポリシー管理
s3vectors:PutVectorBucketPolicy – ベクトルバケットにリソースベースポリシーを適用
s3vectors:GetVectorBucketPolicy – ベクトルバケットのリソースベースポリシーを取得
s3vectors:DeleteVectorBucketPolicy – ベクトルバケットからリソースベースポリシーを削除
スモールスタートはS3 Vectorsから、になりそうな予感
個人的に気になった部分をざっくり調べてみました。元記事にも書いてある部分がいくつかありますが、こうやって自分なりに整理することも大事かと思うため、重複についてはご容赦ください。
FAISSをS3に配置したり、無料のベクターストアSaaSを一時的に接続するのではなく、AWSで廉価にまとめれるのはありがたいですね。そしてOpenSearchへの移行までロードマップに入れれるのも有り難そうです。