Amazon Web Services ブログ

Amazon S3 Vectors がメタデータの pre-filtering に対応し、フィルター付き検索の再現率が向上

本記事は 2026 年 9 月 30 日 に公開された「Amazon S3 Vectors now supports metadata pre-filtering for higher recall on filtered searches」を翻訳したものです。

2026 年 10 月 1 日より、Amazon S3 Vectors でメタデータの pre-filtering の提供を開始しました。類似性検索の前にメタデータフィルターを評価することで、フィルター付きクエリの recall(以下、再現率)が向上します。テナント、カテゴリ、ステータス、時刻などの属性でフィルタリングできるほか、pre-filtering ではパス、URL、階層型キーに使える前方一致用の演算子 $startsWith も追加されています。各ベクトルには最大 2 KB のフィルタリング可能なメタデータを持たせることができ、1 回のクエリで最大 100 個のフィルター制約を指定できます。追加料金は不要で、データの再取り込みやクエリの変更も必要ありません。

インデックス全体を検索するアプリケーションはほとんどありません。たいていは特定のユーザー、アカウント、カテゴリに属する一部だけを検索し、検索範囲をメタデータフィルターで指定します。セマンティック検索、検索拡張生成 (RAG)、エージェント型アプリケーションのいずれも、フィルター付きクエリに求めるものは同じです。つまり、フィルターに一致するベクトルを対象に類似性検索を行い、その中から最も近いものを返すことです。pre-filtering を使うと、フィルター付きクエリでインデックス内の関連するデータをより多く取得でき、フィルター付き検索の再現率が高まります。

一般的なユースケース
pre-filtering は、関連性が高く、かつ範囲が正しく絞り込まれた結果が必要なあらゆる場面で役立ちます。

  • 法務およびプロフェッショナルサービス: 法律事務所や電子情報開示 (e-discovery) プラットフォームでは、単一のクライアントに限定して文書を検索し、さらに $startsWith を使って案件番号、フォルダパス、文書 ID のプレフィックスで絞り込めます。単一のクライアントの文書は事務所全体のアーカイブのごく一部にすぎず、このように絞り込みの強いフィルターでこそ、pre-filtering による再現率の改善効果が最も大きくなります。
  • 金融サービス: 投資リサーチプラットフォームでは、アナリストのメモ、提出書類、決算説明会の書き起こしを、発行体、文書の種類、公開日で絞り込んで検索できます。
  • メディアおよびエンターテイメント: ストリーミングサービスでは、セマンティック検索の前にコンテンツのレーティングと地域ごとのライセンスでフィルタリングし、特定の地域でライセンスされた G および PG 指定のコンテンツに限定して類似タイトルを探せます。
  • エージェント型アプリケーション: ユーザーのセッション内で動作するエージェントは、所有者、文書セット、タイムスタンプなどのフィールドでフィルタリングし、目の前のタスクに関係する資料を検索対象にできます。再現率が高まれば、エージェントに届く関連資料が増え、タスクの信頼性が向上します。

pre-filtering の仕組み
S3 Vectors インデックス内の各ベクトルには、アプリケーションで定義したメタデータを持たせることができ、クエリではそのフィールドでフィルタリングできます。

すべてのベクトルインデックスにはインデックスモードがあります。インデックスモードが ENHANCED の場合、S3 Vectors はまずフィルターを解決し、一致したベクトルだけを検索します。CLASSIC の場合は、ベクトル検索とフィルター評価を並行して実行し、検索しながら各候補ベクトルがフィルターに一致するかを検証します。既存のインデックスは、更新するまで CLASSIC のままです。

800 万件のチケットを持つサポートナレッジベースで、エージェントが特定の顧客の履歴から繰り返し発生するエラーを検索する場合を考えてみましょう。その顧客のチケットが 400 件であれば、先に customer_id を解決することで、400 件すべてを対象に類似性検索が実行され、エージェントはその顧客の過去の発生事例を確認できます。インデックスの更新前は、同じクエリでも 800 万件全体から候補を抽出していたため、結果セットに含まれるその顧客の該当チケットは少なくなっていました。

絞り込みの強いフィルターでは、CLASSIC インデックスで同じクエリを実行した場合と比べて、pre-filtering で取得できる一致ベクトルが最大 5 倍に増えます。

使用を開始する
始める前に、IAM ポリシーで新しいアクションへのアクセス許可が付与されていることを確認してください。

使用を開始するまでの手順は 3 つです。以下のウォークスルーでは、小規模な商品カタログのインデックスを作成し、絞り込みの強いフィルターでクエリを実行します。マルチテナント RAG ストアや、単一のクライアントに限定した文書検索でも同じパターンを使えます。

まず、ベクトルインデックスを作成します。

aws s3vectors create-index \ 
  --index-name product-catalog \ 
  --vector-bucket-name my-vector-bucket \ 
  --dimension 1536 \ 
  --distance-metric cosine

dimension は埋め込みモデルの出力サイズと一致させる必要があり、distance-metric はモデルのトレーニング方法に合わせて指定します (テキスト埋め込みでは cosine が一般的です)。次に、PutVectors API でベクトルを書き込み、各ベクトルに最大 2 KB のフィルタリング可能なメタデータを付与します。

aws s3vectors put-vectors \
  --index-name product-catalog \
  --vector-bucket-name my-vector-bucket \
  --vectors '[{
    "key": "doc-001",
    "data": {"float32": [0.1, 0.2, 0.3, ...]},
    "metadata": {
      "tenant_id": "t-10428",
      "category": "legal",
      "created_date": "2026-03-15",
      "active": true
    }
  }]'

各ベクトルには、アプリケーションでフィルタリングに使う属性を持たせます。この例では、tenant_id で結果を単一の顧客に限定し、category で文書の種類を絞り込みます。created_date には文書の作成日を記録し、active はブール値のフラグです。デフォルトではすべてのメタデータフィールドがフィルタリング可能なため、事前にスキーマを宣言しなくても任意のフィールドでクエリを実行できます。

最後に、QueryVectors API でフィルター付きの類似度クエリを実行します。フィルターは簡潔な JSON 構文で記述します。キーと値のペアをそのまま書くと等価一致となり、$and、$or、$gt などの演算子で条件を組み合わせたり絞り込んだりできます。--return-metadata を指定すると、クエリ結果に各ベクトルのメタデータが含まれます。

aws s3vectors query-vectors \
  --index-name product-catalog \
  --vector-bucket-name my-vector-bucket \
  --query-vector '{"float32": [0.1, 0.2, 0.3, ...]}' \
  --top-k 50 \
  --return-metadata \
  --filter '{"$and": [
    {"tenant_id": "t-10428"},
    {"category": "legal"},
    {"active": true}
  ]}'

3 つのフィルター条件 (tenant_id、category、active) すべてに一致するベクトルは doc-001 だけなので、結果には doc-001 が返されます。

{
  "vectors": [
    {
      "distance": 0.9717477560043335,
      "key": "doc-001",
      "metadata": {
        "tenant_id": "t-10428",
        "category": "legal",
        "created_date": "2026-03-15",
        "active": true
      }
    }
  ],
  "distanceMetric": "cosine"
}

S3 Vectors はまず、3 つのフィルター条件すべてに一致するベクトルに検索範囲を絞り込み、その中から類似度の高い上位 50 件のベクトルを返します。フィルターが検索の前に適用されるため、結果はフィルターに一致するすべてのベクトルの中から抽出されます。

$startsWith による前方一致
pre-filtering では、パス、URL、階層型キーでのフィルタリングに使える前方一致用の演算子が追加されました。案件とフォルダの構造を文書 ID に組み込んでいる文書ストアであれば、1 つの条件で検索範囲をサブツリーに限定できます。

--filter '{"$startsWith": {"document_id": "matter-4417/exhibits/"}}'

$startsWith は、既存の演算子 (等価、数値範囲、集合への所属、存在チェック、$and と $or によるブール論理) に加わる新しい演算子です。

既存のインデックスで pre-filtering を有効にする
既存のインデックスで pre-filtering を有効にするには、UpdateIndexMode を呼び出します。

aws s3vectors update-index-mode \
  --vector-bucket-name my-vector-bucket \
  --index-name product-catalog \
  --index-mode ENHANCED

pre-filtering はその場で有効になります。既存のベクトルを再取り込みする必要はなく、クエリを変更する必要もありません。新しいフィルター演算子もすぐに利用できます。

同じインデックスと同じクエリで違いを見てみましょう。更新前は、1 つのテナントに限定したクエリで、要求した 10 件の結果のうち 2 件しか返されません。

aws s3vectors query-vectors \
  --vector-bucket-name my-vector-bucket \
  --index-name product-catalog \
  --query-vector '{"float32": [0.1, 0.2, 0.3, ...]}' \
  --top-k 10 \
  --return-metadata \
  --filter '{"tenant_id": "t-10428"}'
{
  "vectors": [
    { "key": "doc-114", "distance": 0.41 },
    { "key": "doc-322", "distance": 0.55 }
  ],
  "distanceMetric": "cosine"
}

更新後は、同じクエリでそのテナントの文書全体から抽出された、要求どおりの件数の結果が返されます。

{
  "vectors": [
    { "key": "doc-018", "distance": 0.09 },
    { "key": "doc-207", "distance": 0.13 },
    { "key": "doc-114", "distance": 0.41 },
    ... 7 more
  ],
  "distanceMetric": "cosine"
}

複数のインデックスへの展開
インデックスで pre-filtering の動作を検証したら、ベクトルバケットのデフォルトのインデックスモードを設定しましょう。設定後に作成するインデックスは、個別に呼び出しを追加しなくても ENHANCED を使用します。

aws s3vectors put-vector-bucket-default-index-mode \
  --vector-bucket-name my-vector-bucket \
  --default-index-mode ENHANCED

残りの既存インデックスを移行するには、インデックスを一覧表示して各インデックスモードを確認し、まだ CLASSIC を使用しているものに対して UpdateIndexMode を呼び出します。

aws s3vectors list-indexes \
  --vector-bucket-name my-vector-bucket

aws s3vectors get-index \
  --vector-bucket-name my-vector-bucket \
  --index-name product-catalog

知っておくべきこと 

  • 2026 年 9 月 30 日以降に作成したベクトルバケットでは、インデックスはインデックスモード ENHANCED を使用します。それより前から存在するバケットでは、バケットのデフォルトを設定するまでインデックスは CLASSIC を使用します。同日以降にそれらのバケットで作成したインデックスも同様です。
  • 1 回のクエリで指定できるフィルター制約は最大 100 個で、フィルターが評価する値ごとにカウントされます。上限を超える場合でも、たいていはフィルターを集約して対応できます。たとえば、訴訟案件を列挙する 300 個の値の $in を、単一の caseId フィールドに置き換えます。あるいは、クエリを小さく分割して並行実行し、結果を距離に基づいてマージする方法もあります。

今すぐご利用いただけます
メタデータの pre-filtering は、Amazon S3 Vectors が利用可能なすべての商用 AWS リージョンと AWS 中国リージョンで、追加料金なしでご利用いただけます。ストレージ、PUT リクエスト、クエリには S3 Vectors の標準料金が適用されます。料金の詳細については、Amazon S3 の料金ページをご覧ください。利用可能なリージョンについては、Amazon S3 Vectors のリージョンとクォータをご覧ください。

RAG アプリケーションを 1 つのテナントに限定する場合も、エージェントの検索を 1 人のユーザーの文書に限定する場合も、カタログ検索をライセンス期間で絞り込む場合も、pre-filtering を使えば再現率を犠牲にすることなくフィルターを適用できます。詳細と使用開始の方法については、Amazon S3 Vectors のドキュメントをご覧ください。フィードバックは AWS re:Post for S3 または通常の AWS サポートの窓口までお寄せください。

— Daniel Abib

著者について

Daniel Abib

Daniel Abib

AWS のシニアスペシャリストソリューションアーキテクトで、生成 AI と Amazon Bedrock を専門とし、サーバーレスにも情熱を注いでいます。スタートアップや大企業が AI を活用したアプリケーションを構築し、クラウドネイティブなアーキテクチャでモダナイズするのを支援しています。アイアンマンを 3 度完走し、re:Invent で 4 度登壇した経験を持ち、同じ粘り強さでクラウドソリューションの構築に取り組んでいます。


この記事は Kiro が翻訳を担当し、Solutions Architect の Yui Numazawa がレビューしました。