検索エンジン

k-NN検索(近傍近傍近傍近傍近傍近傍近傍近傍検索)を使用した候補生成の従来のアプローチは正確であるが、特に待機時間が非常に短い大規模なシステムでは非常に遅い。

ANN(近接近傍)検索では、インデックスをより効率的に再構築し、検索可能なベクトルの寸法を小さくするツールを使用します。このアプローチを使用することは、精度と低レイテンシのトレードオフです。k-NNでANNを活用することで、検索エンジンは、特定のクエリ文書の最も近い隣人を概算し、非常に低いレイテンシで関連候補を取得できるため、大規模なデータセットの検索レイテンシが向上します。OpenSearch 2.11は、すべてANNを実装するNMSLIB、FAISSおよびLUCENE検索エンジンをサポートしています。詳細は、フィルタを使用したk-NN検索を参照してください。

Luceneエンジン

Lucene K-NN filterは、実装で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"
            }
        }
    }
}

空白

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