Moteurs de recherche
L'approche traditionnelle pour la génération de candidats utilisant la recherche k-NN (voisins les plus proches) est précise mais très lente, en particulier pour les systèmes à grande échelle où une latence très faible est requise.
La recherche ANN (approximativement voisin le plus proche) utilise des outils qui restructurent les index plus efficacement et réduisent la dimensionnalité des vecteurs interrogeables. L'utilisation de cette approche est un compromis entre précision et faible latence. En tirant parti d'ANN avec k-NN, les moteurs de recherche peuvent approcher les voisins les plus proches de documents de requête spécifiques et extraire les candidats pertinents avec une latence très faible, améliorant ainsi la latence de recherche pour les jeux de données volumineux. OpenSearch 2.11 prend en charge les moteurs de recherche NMSLIB, FAISS et LUCENE, qui implémentent tous ANN. Pour plus d'informations, voir Recherche k-NN avec filtres.
Moteur Lucene
Le filtre Lucene K-NN utilise le graphique HNSW dans la mise en oeuvre.
L'exemple suivant montre comment créer un index à l'aide du moteur 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
}
}
}
}
}
}
Pour utiliser un pipeline d'ingestion sur l'index, ajoutez le pipeline dans l'appel d'API, en vous assurant que le modèle déployé sur le pipeline d'ingestion a la même dimensionnalité du vecteur KNN spécifié dans l'appel d'API, comme suit :
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
}
}
}
}
}
}
Moteur Faiss
Pour le moteur Faiss, vous pouvez utiliser l'algorithme HNSW ou l'algorithme IVF pour implémenter le filtre ANN. Voir Mise en oeuvre du filtre k-NN de Faiss pour plus de détails sur les paramètres de configuration de Faiss.
Les exemples suivants montrent comment créer un index à l'aide du moteur Faiss.
Sans pipeline d'ingestion
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"
}
}
}
}
}
Avec un pipeline d'ingestion
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"
}
}
}
}
}
Moteur NMSLIB
L'exemple suivant montre comment créer un index à l'aide du moteur 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"
}
}
}
}
Les espaces
Chacun des moteurs pris en charge utilise une certaine heuristique pour comparer l'intégration de documents et récupérer les documents les plus pertinents en mesurant la similarité. Vous avez le choix entre plusieurs mesures objectives à utiliser. Les mesures que vous choisissez dépendent du cas d'utilisation, du modèle et des données personnalisés. Pour plus d'informations, notamment un tableau présentant les options disponibles, voir Espaces.