View a markdown version of this page

ベクトル検索コレクションの使用 - Amazon OpenSearch Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ベクトル検索コレクションの使用

OpenSearch Serverless のベクトル検索コレクションタイプを使用すると、スケーラブルで高性能な類似度検索を実行できます。基盤となるベクトルデータベースインフラストラクチャを管理することなく、最新の機械学習 (ML) 拡張検索エクスペリエンスと生成人工知能 (AI) アプリケーションを構築できます。

ベクトル検索コレクションのユースケースには、画像検索、ドキュメント検索、音楽検索、製品のレコメンデーション、動画検索、位置ベースの検索、不正検出、異常検出などがあります。

OpenSearch Serverless のベクトルエンジンは、OpenSearch の k 最近傍 (k-NN) 検索機能を使用します。サーバーレス環境のシンプルさで同じ機能を利用できます。エンジンは k-NN プラグイン API をサポートしています。これらのオペレーションでは、全文検索、高度なフィルタリング、集計、地理空間クエリ、ネストされたクエリを使用して、データの取得を高速化し、検索結果を強化できます。

ベクトルエンジンは、ユークリッド距離、コサイン類似度、ドット積などの距離メトリクスを提供し、16,000 次元に対応できます。数値、ブール値、日付、キーワード、ジオポイントなどのさまざまなデータ型を持つフィールドを保存できます。また、保存されたベクトルにさらにコンテキストを追加するための説明情報用のテキストを含むフィールドを保存することもできます。データ型を同一場所に配置することで、複雑さが軽減され、保守性が向上するとともに、データの重複、バージョン互換性の問題、ライセンスの問題を回避できます。

NextGen ベクトル検索コレクション

NextGen ベクトル検索は、ワークロードに基づいてオンデマンドでスケールし、コストとパフォーマンスのバランスを最適化します。アクティブな検索リクエストを処理するために必要なデータブロックのみがメモリにロードされ、ワーカーは必要なメモリと CPU リソースに基づいて動的にスケーリングされます。コレクションが進行中のリクエストなしでアイドル状態の場合、インデックス作成と検索の両方が 0 にスケールされるため、追加のコスト削減が可能になります。デフォルトでは、NextGen には、コストとレイテンシーを削減しながらリコールを改善する最適化が組み込まれています。

  • カスタムドキュメント ID – カスタムドキュメント IDsは NextGen コレクションでサポートされているため、ユーザーはユーザーが指定した IDs。

  • 32x 圧縮インデックス – すべてのインデックスは、デフォルトで高度な 32x 圧縮手法で作成されます。デフォルトの圧縮レベルを上書きし、サポートされている圧縮レベルとして 1x、2x、8x、16x、または 32x (デフォルト) を選択できます。

  • インデックス構築アクセラレーション – GPU アクセラレーションは、大規模ベクトルインデックスをより迅速かつ効率的に構築できるようにデフォルトで有効になっています。これにより、データをベクトルインデックスにインデックス化するために必要な時間が短縮され、高スループットのインデックス作成エクスペリエンスとコスト削減が実現します。GPU リソースは、インデックス構築オペレーション中に必要な場合にのみプロビジョニングされます。設定 を使用して、GPU の使用状況をインデックスごとに制御できますindex.knn.remote_index_build.enabled。詳細については、「ベクトルインデックス作成の GPU アクセラレーション」を参照してください。

  • 簡易 API – NextGen ベクトル検索コレクションでは、インデックスマッピングに engine および modeパラメータは必要ありません。システムは最適な設定を内部で自動的に決定し、インデックス作成の複雑さを軽減します。

  • 最適化検索レスポンス – デフォルトでは、NextGen ベクトルコレクションの検索レスポンスは、結果から元のベクトルを除外します。これにより、エンドツーエンドの検索レイテンシーとレスポンスペイロードのサイズが削減されます。検索レスポンスにベクトルを含めるには、「」を参照してくださいベクトルを含む完全なドキュメントを取得する

  • NextGen ベクトルコレクションでは、read-after-writeレイテンシー (refresh_interval) は 10 秒です。

ベクトル検索コレクションの開始方法

このチュートリアルでは、次のステップを実行して、ベクトル埋め込みをリアルタイムで保存、検索、取得します。

ステップ 1: アクセス許可を設定する

このチュートリアルを完了するには (および OpenSearch Serverless を一般的に使用するには)、正しい AWS Identity and Access Management (IAM) アクセス許可が必要です。このチュートリアルでは、コレクションを作成し、データをアップロードして検索を行い、最後にそのコレクションを削除します。

ユーザーまたはロールには、以下の最低限の許可を含む ID ベースのポリシーが、アタッチされている必要があります。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Action": [ "aoss:CreateCollection", "aoss:ListCollections", "aoss:BatchGetCollection", "aoss:DeleteCollection", "aoss:CreateAccessPolicy", "aoss:ListAccessPolicies", "aoss:UpdateAccessPolicy", "aoss:CreateSecurityPolicy", "iam:ListUsers", "iam:ListRoles" ], "Effect": "Allow", "Resource": "*" } ] }

OpenSearch Serverless での IAM アクセス許可の詳細については、「Amazon OpenSearch Serverless 向けの アイデンティティとアクセス管理」を参照してください。

ステップ 2: コレクションを作成する

新しいコレクションを作成するには、暗号化、ネットワーク、データアクセスポリシーを自動的に設定する統合コレクション作成フロー (NextGen Express Create) に従います。手順については、「NextGen コレクションを作成する (Express Create)」を参照してください。

このチュートリアルの残りの部分では、サンプルコレクションの名前は housingで、NextGen ベクトル検索コレクションです。

注記

代わりに Classic ベクトルコレクションを作成する場合は、 Classic コレクションに固有の手順Classic ベクトルコレクションの使用については、「」を参照してください。

ステップ 3: データをアップロードして検索する

インデックスとは、ベクトル埋め込みやその他のフィールドを保存、検索、取得する方法を提供する共通のデータスキーマを持ったドキュメントのコレクションです。OpenSearch Dashboards の 開発ツールコンソールや、Postman または awscurl のような HTTP ツールを使用して、OpenSearch Serverless コレクションのインデックスを作成し、データをアップロードできます。このチュートリアルでは、開発ツールを使用します。Python SDK を使用したプログラムによるアクセスについては、「」を参照してくださいAmazon OpenSearch Serverless コレクションへのデータの取り込み

住宅コレクション内のデータのインデックス作成と検索を行うには
  1. 新しいコレクションのインデックスを作成するには、開発ツールコンソールで次のリクエストを送信します。デフォルトでは、ユークリッド距離と 32 倍圧縮のインデックスが作成されます。

    PUT housing-index { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "space_type": "l2" }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. 別の圧縮レベルを使用するには、フィールドマッピングcompression_levelで を設定します。次の例では、 を 1x compression_levelに設定してインデックスを作成します。

    PUT housing-index-1x { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "compression_level": "1x", "space_type": "l2" }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }

    サポートされている圧縮レベルは、1x、2x、8x、16x、32x です。

  3. ドキュメントを にインデックスを作成するにはhousing-index、システム生成 ID (POST) またはユーザー提供 ID (PUT) を使用できます。

    # System-generated document ID POST housing-index/_doc { "housing-vector": [10, 20, 30], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" } # User-provided document ID PUT housing-index/_doc/100 { "housing-vector": [10, 20, 30], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  4. インデックス内のプロパティに似たプロパティを検索するには、次のクエリを送信します。デフォルトでは、検索レスポンスは元のベクトルを から除外_sourceして、レイテンシーとペイロードサイズを減らします。

    GET housing-index/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [10, 20, 30], "k": 2 } } } }

    レスポンスは、 housing-vector フィールドを から除外します_source

    { "took": 10, "timed_out": false, "_shards": { "total": 0, "successful": 0, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "housing-index", "_id": "100", "_score": 1, "_source": { "price": "2800", "location": "47.71, 122.00", "title": "2 bedroom in downtown Seattle" } } ] } }

ベクトルを含む完全なドキュメントを取得する

デフォルトの動作を上書きするには、検索リクエストtrue_source を に設定します。の includes/excludes オプションを使用して_source、特定のフィールドを取得することもできます。

GET housing-index/_search { "size": 5, "_source": true, "query": { "knn": { "housing-vector": { "vector": [10, 20, 30], "k": 2 } } } }

レスポンスに の housing-vectorフィールドが含まれるようになりました_source

{ "took": 10, "timed_out": false, "_shards": { "total": 0, "successful": 0, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "housing-index", "_id": "100", "_score": 1, "_source": { "housing-vector": [10, 20, 30], "price": "2800", "location": "47.71, 122.00", "title": "2 bedroom in downtown Seattle" } } ] } }

ステップ 4: コレクションを削除する

住宅コレクションはテスト用であるため、実験が終了したら削除してください。

OpenSearch Serverless コレクションを削除するには
  1. Amazon OpenSearch Service コンソールを開きます。

  2. 左側のナビゲーションペインで、コレクションを選択し、住宅コレクションを選択します。

  3. [削除] を選択し、削除を確定します。

フィルタリングされた検索

フィルターを使用して、セマンティック検索の結果を絞り込むことができます。インデックスを作成し、ドキュメントに対してフィルター検索を実行するには、前のチュートリアルの「データをアップロードおよび検索する」を次の手順に置き換えます。他のステップは同じです。フィルターの詳細については、「フィルターを使用した k-NN 検索」を参照してください。

住宅コレクション内のデータのインデックス作成と検索を行うには
  1. コレクション用に単一のインデックスを作成するには、開発ツールコンソールで次のリクエストを送信します。

    PUT housing-index-filtered { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "space_type": "l2", "method": { "name": "hnsw" } }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. 1 つのドキュメントを housing-index-filtered にインデックスするために、次のリクエストを送信します。

    POST housing-index-filtered/_doc { "housing-vector": [ 10, 20, 30 ], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  3. 地理的位置から指定された距離内にある、指定された価格未満のシアトルのアパートのデータを検索するには、次のリクエストを送信します。

    GET housing-index-filtered/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [ 0.1, 0.2, 0.3 ], "k": 5, "filter": { "bool": { "must": [ { "query_string": { "query": "Find me 2 bedroom apartment in Seattle under $3000 ", "fields": [ "title" ] } }, { "range": { "price": { "lte": 3000 } } }, { "geo_distance": { "distance": "100miles", "location": { "lat": 48, "lon": 121 } } } ] } } } } } }

制限事項

  • 放射検索は、32 倍圧縮を使用する NextGen ベクトルインデックスではサポートされていません。

Classic ベクトルコレクションの使用

クラシックベクトルコレクションは、OpenSearch Serverless ベクトル検索の元の世代です。既存の Classic ベクトルコレクションがある場合は、このセクションの手順を使用します。新しいコレクションについては、NextGen をお勧めします。NextGen ベクトルコレクションを作成するにはコレクションの作成、「」を参照してください。

注記
  • Amazon OpenSearch Serverless Classic コレクションは、32 ビット浮動ベクトルと 16 ビットベクトル間の変換を実行する Faiss 16 ビットスカラー量子化をサポートしています。詳細については、「Faiss 16-bit scalar quantization」を参照してください。バイナリベクトルを使用してメモリコストを削減することもできます。詳細については、「Binary vectors」を参照してください。

  • Amazon OpenSearch Serverless Classic コレクションはディスクベースのベクトル検索をサポートしているため、メモリの少ない環境でのベクトルワークロードの運用コストを大幅に削減できます。詳細については、「Disk-based vector search」を参照してください。

次の例は、デフォルトでnmslibエンジンを使用し、検索レスポンスに元のベクトルを含む Classic ベクトルコレクションに適用されます。

Classic 住宅コレクションのデータのインデックス作成と検索を行うには
  1. Classic コレクションのインデックスを作成するには、開発ツールコンソールで次のリクエストを送信します。デフォルトでは、エンジンnmslibとユークリッド距離を持つインデックスが作成されます。

    PUT housing-index { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3 }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. 1 つのドキュメントを housing-index にインデックスするために、次のリクエストを送信します。

    POST housing-index/_doc { "housing-vector": [ 10, 20, 30 ], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  3. インデックス内のプロパティに類似したプロパティを検索するには、次のクエリを送信します。

    GET housing-index/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [ 10, 20, 30 ], "k": 5 } } } }

インデックスを作成し、フィルタリングされた検索を実行するには、次の例を使用します。フィルターの詳細については、「フィルターを使用した k-NN 検索」を参照してください。

Classic 住宅コレクションに対してフィルタリングされた検索をインデックス化して実行するには
  1. コレクション用に単一のインデックスを作成するには、開発ツールコンソールで次のリクエストを送信します。

    PUT housing-index-filtered { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "method": { "engine": "faiss", "name": "hnsw" } }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. 1 つのドキュメントを housing-index-filtered にインデックスするために、次のリクエストを送信します。

    POST housing-index-filtered/_doc { "housing-vector": [ 10, 20, 30 ], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  3. 地理的位置から指定された距離内にある、指定された価格未満のシアトルのアパートのデータを検索するには、次のリクエストを送信します。

    GET housing-index-filtered/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [ 0.1, 0.2, 0.3 ], "k": 5, "filter": { "bool": { "must": [ { "query_string": { "query": "Find me 2 bedroom apartment in Seattle under $3000 ", "fields": [ "title" ] } }, { "range": { "price": { "lte": 3000 } } }, { "geo_distance": { "distance": "100miles", "location": { "lat": 48, "lon": 121 } } } ] } } } } } }

クラシックベクトルコレクションには以下の制限があります。

  • ベクトル検索コレクションは、Apache Lucene ANN エンジンをサポートしていません。

  • ベクトル検索コレクションは、Faiss を使用した HNSW アルゴリズムのみをサポートします。IVF または IVFQ はサポートされていません。

  • ベクトル検索コレクションは、ウォームアップ、統計、モデルトレーニング API をサポートしていません。

  • ベクトル検索コレクションは、インラインスクリプトまたはストアドスクリプトをサポートしていません。

  • インデックスカウント情報は、ベクトル検索コレクションの AWS マネジメントコンソール では使用できません。

  • ベクトル検索コレクションのインデックスの更新間隔は 60 秒です。

数十億規模のワークロード

クラシックベクトル検索コレクションは、数十億のベクトルを持つワークロードをサポートします。自動スケーリングがこれを行うため、スケーリングの目的でインデックスを再作成する必要はありません。ディメンションの数が多い数百万 (またはそれ以上) のベクトルがあり、200 を超える OCUs が必要な場合は、 AWS サポートに連絡して、アカウントの OpenSearch Compute Units (OCUs) の最大数を増やしてください。

次の手順

ベクトル検索コレクションとインデックスデータを作成する方法がわかったので、次の演習を試すことができます。

  • OpenSearch Python クライアントを使用して、ベクトル検索コレクションを操作します。GitHub でこのチュートリアルを参照してください。

  • OpenSearch Java クライアントを使用して、ベクトル検索コレクションを操作します。GitHub でこのチュートリアルを参照してください。

  • OpenSearch をベクトルストアとして使用するように LangChain を設定します。LangChain は、言語モデルを利用してアプリケーションを開発するためのオープンソースフレームワークです。詳細については、LangChain ドキュメントを参照してください。