検索エンジン

k-NN検索 (k近傍法)を使用した従来の候補生成アプローチは、特に非常に低いレイテンシが求められる大規模システムにとっては、正確ですがきわめて低速です。

ANN (近似最近傍)検索では、索引をより効率的に再作成して検索可能なベクトルの次元を減らすツールが使用されます。このアプローチを使用する場合、正確さと引き換えに低レイテンシを取ることになります。ANNをk-NNとともに利用することで、検索エンジンは、特定の問合せドキュメントの最近傍を概算して、関連する候補を非常に低いレイテンシで取得できるため、大規模なデータセットの検索レイテンシが向上します。OpenSearch 2.11はNMSLIB、FAISS、LUCENEの各検索エンジンをサポートしており、これらすべてがANNを実装しています。詳細は、フィルタを使用したk-NN検索を参照してください。

Luceneエンジン

Lucene K-NNフィルタは、実装でHNSWグラフを使用します。

次の例は、Luceneエンジンを使用した索引の作成を示しています:

PUT /test-index
{
  "settings": {
    "index": {
      "knn": true,
      "knn.algo_param.ef_search": 100,
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  },
  "mappings": {
    "properties": {
      "location": {
        "type": "knn_vector",
        "dimension": 2,
        "method": {
          "name": "hnsw",
          "space_type": "l2",
          "engine": "lucene",
          "parameters": {
            "ef_construction": 100,
            "m": 16
          }
        }
      }
    }
  }
}

取込みパイプラインを索引で使用するには、次のように、APIコールにパイプラインを追加し、取込みパイプラインにデプロイされたモデルの次元が、APIコールで指定されたKNNベクトルの次元と同一になるようにします:

PUT /test-lucene-index
{
  "settings": {
    "default_pipeline": "test-nlp-pipeline",
    "index": {
      "knn": true,
      "knn.algo_param.ef_search": 100,
      "number_of_shards": 1,
      "number_of_replicas": 0
    }
  },
  "mappings": {
    "properties": {
      "location": {
        "type": "knn_vector",
        "dimension": 2,
        "method": {
          "name": "hnsw",
          "space_type": "l2",
          "engine": "lucene",
          "parameters": {
            "ef_construction": 100,
            "m": 16
          }
        }
      }
    }
  }
}

Faissエンジン

Faissエンジンの場合、HNSWアルゴリズムまたはIVFアルゴリズムを使用してANNフィルタを実装できます。Faiss構成パラメータの詳細は、Faiss k-NNフィルタの実装を参照してください。

次の例は、Faissエンジンを使用して索引を作成する方法を示しています。

取込みパイプなし

PUT /test-faiss-index
{
  "settings": {
    "index": {
      "knn": true
    }
  },
  "mappings": {
    "properties": {
      "item_vector": {
        "type": "knn_vector",
        "dimension": 3,
        "method": {
          "name": "hnsw",
          "space_type": "l2",
          "engine": "faiss"
        }
      }
    }
  }
}

取込みパイプラインを使用

PUT /test-faiss-index
{
  "settings": {
    "index": {
      "knn": true
    },
   "default_pipeline": "test-nlp-pipeline"
  },
  "mappings": {
    "properties": {
      "item_vector": {
        "type": "knn_vector",
        "dimension": 3,
        "method": {
          "name": "hnsw",
          "space_type": "l2",
          "engine": "faiss"
        }
      }
    }
  }
}

NMSLIBエンジン

次の例は、nmslibエンジンを使用して索引を作成する方法を示しています:

PUT /nmslib-index
{
    "settings": {
        "index.knn": true,
        "default_pipeline": "test-nlp-pipeline"
    },
    "mappings": {
        "properties": {
            "passage_embedding": {
                "type": "knn_vector",
                "dimension": 1024,
                "method": {
                    "name":"hnsw",
                    "engine":"nmslib",
                    "space_type": "cosinesimil"
                }
            },
            "passage_text": {
                "type": "text"
            }
        }
    }
}

スペース

サポートされている各エンジンは、ヒューリスティックを使用して、ドキュメントの埋め込みを比較し、類似度を測定することで最も関連性の高いドキュメントを取得します。いくつかの目標メトリックの中から使用するものを選択できます。選択するメトリックは、カスタム・ユース・ケース、モデルおよびデータによって異なります。選択可能なオプションを示す表などの詳細は、スペースを参照してください。