S3がベクトルDBになった?S3 VectorsでRAGコストを90%削減

S3がベクトルDBになった?S3 VectorsでRAGコストを90%削減

最終更新日:2025年12月06日公開日:2025年12月06日
益子 竜与志
writer:益子 竜与志
XThreads

RAGシステムの運用でPineconeやOpenSearchの月額費用が気になっている方、朗報です。Amazon S3 Vectorsが一般提供開始となり、S3バケットに直接ベクトルを保存・検索できるようになりました。しかも専用ベクトルDBと比較して最大90%のコスト削減。今回は実際の実装方法と料金体系を詳しく見ていきます。

S3がベクトルデータベースになるとは

従来のRAGアーキテクチャでは、S3にソースドキュメントを保存して、別途PineconeやOpenSearchなどのベクトルデータベースにインデックスを作る、という二重構成が一般的でした。

Amazon S3 Vectorsは、この構成を根本から変えるものです。S3バケット自体がベクトルデータベースとして機能し、保存・インデックス・検索がすべてS3内で完結します。

技術的には「Vector Bucket」という新しいバケットタイプを使用し、その中に「Vector Index」を作成して「Vectors」を格納する階層構造になっています。

GA版で大幅にスケールアップ

S3 Vectors スケール比較

2025年12月2日のGA版では、プレビュー版から大幅に制限が緩和されました。

  • 1インデックスあたり最大20億ベクトル
  • 1バケットあたり最大10,000インデックス
  • 次元数は1〜4,096(Titan、OpenAI、Cohereなど主要モデルに対応)
  • 書き込みスループット最大1,000 TPS
  • Top-K制限は100件(プレビュー時の30件から増加)

20億ベクトルは、ほとんどのエンタープライズユースケースで十分な容量です。しかも10,000インデックスまで作れるので、マルチテナントRAG(顧客ごとにインデックスを分離)にも対応できます。

実際に使ってみる

boto3を使った実装はこんな感じです。

import boto3

client = boto3.client('s3vectors')

# ベクトルを登録
response = client.put_vectors(
    vectorBucketName='my-rag-bucket',
    indexName='knowledge-base-v1',
    vectors=[
        {
            'id': 'doc-001-chunk-01',
            'vector': {'float32': [0.12, -0.45, 0.88, ...]},  # 最大4096次元
            'metadata': {
                'source': 'manual.pdf',       # フィルタリング用(最大2KB)
                'category': 'technical',
                'raw_text': 'S3 Vectorsは...' # 非フィルタリング用(最大38KB)
            }
        }
    ]
)

ポイントはmetadataの使い方。フィルタリングに使うフィールド(2KB制限)とは別に、非フィルタリング用フィールド(38KB制限)があるので、チャンク本文をそのままメタデータに入れられます。

これにより、検索結果を表示するときに「S3からテキストファイルを別途取得する」というオーバーヘッドを削減できます。

検索もシンプル

セマンティック検索のコードも直感的です。

response = client.query_vectors(
    vectorBucketName='my-rag-bucket',
    indexName='knowledge-base-v1',
    queryVector={'float32': [0.15, -0.41, ...]},
    topK=10,
    returnMetadata=True,  # RAGでは必須
    filter={
        'and': [
            {'equals': {'key': 'category', 'value': 'technical'}},
            {'greaterThan': {'key': 'year', 'value': 2024}}
        ]
    }
)

# RAGのコンテキスト生成
context = [v['metadata']['raw_text'] for v in response['vectors']]

フィルタリング構文はMongoDBライクで、equalsnotEqualsgreaterThanlessThanandorinなどの演算子が使えます。

料金体系が革新的

ここが一番のポイント。

  • ストレージ:$0.06/GB/月
  • 書き込み(インジェスト):$0.20/GB
  • クエリ(ベース):$2.50/100万クエリ
  • クエリ(処理):$0.004〜0.002/TB(スキャン量による)

従来のベクトルDBは「インデックスをメモリに保持するためのプロビジョニングコスト」が24時間発生していました。S3 Vectorsはこれがゼロ。

「データ量は膨大だけど、常に全部が検索されるわけではない」というRAGシステムでは、この違いが効いてきます。月額数千ドルかかっていたコストが、数百ドル以下になることも珍しくありません。

レイテンシは許容範囲

超低レイテンシ(ミリ秒単位)よりもスループットとコスト効率に最適化されていますが、実用上は問題ないレベルです。

  • Hot/Warmクエリ:100ms以下
  • Cold/Infrequentクエリ:1秒未満

リアルタイム金融取引(10ms以下が必要)には向きませんが、チャットボット、社内検索、エージェントワークフローには十分。100msなら人間は「速い」と感じるレベルです。

Bedrock Knowledge Basesとの統合

AWSらしいところですが、Bedrock Knowledge Basesのバックエンドとしてネイティブ統合されています。

コンソールで「Vector store」としてS3 Vectorsを選択するだけで、チャンキング、エンベディング生成、インデックス登録のパイプラインが自動化されます。自前でPutVectorsを書く必要すらない。

フルマネージドなRAGパイプラインを最小コストで構築したいなら、この組み合わせがベストプラクティスになりそうです。

どんな場面で使うべきか

S3 Vectorsが最適なケース:

  • エンタープライズナレッジベース(社内文書全量を検索、利用頻度は業務時間のみ)
  • ログ/履歴分析エージェント(過去の膨大なログから類似事象を検索)
  • コスト重視のRAG(PineconeやOpenSearchの固定費を削減したい)

避けるべきケース:

  • ミリ秒レベルのSLAが必要なECレコメンデーション
  • 1秒間に数万件の更新が発生するストリーム処理

後者のケースでは、MemoryDB for Redisなどのインメモリベクトルストアを検討すべきでしょう。

実装上のTips

メタデータの40KB制限を最大限活用することをおすすめします。チャンク本文をここに格納すれば、検索結果表示時のS3 GetObjectコールが不要になり、レイテンシとコストの両方を削減できます。

また、書き込みに対してStrong Consistency(強い整合性)が保証されているので、PutVectors直後にQueryVectorsで検索できます。リアルタイム性が求められるユースケースでも安心です。

まとめ

  • S3 VectorsによりS3バケット自体がベクトルDBとして機能
  • GA版で20億ベクトル/インデックス、10,000インデックス/バケットに対応
  • ストレージとクエリの分離課金で、最大90%のコスト削減が可能
  • Bedrock Knowledge Basesとネイティブ統合でフルマネージドRAGが簡単に
  • 100ms以下のレイテンシで対話型AIにも十分対応

参考リンク

Careerバナーconsultingバナー