Motori di ricerca
L'approccio tradizionale per la generazione di candidati che utilizza la ricerca k-NN (vicini k-più vicini) è accurato ma molto lento, soprattutto per i sistemi su larga scala in cui è richiesta una latenza molto bassa.
La ricerca ANN (approssimativamente vicina) utilizza strumenti che ristrutturano gli indici in modo più efficiente e riducono la dimensionalità dei vettori ricercabili. L'utilizzo di questo approccio è un compromesso tra accuratezza e bassa latenza. Sfruttando ANN con k-NN, i motori di ricerca possono approssimare i vicini più vicini di documenti di query specifici e recuperare i candidati pertinenti con latenza molto bassa, migliorando la latenza di ricerca per set di dati di grandi dimensioni. OpenSearch 2.11 supporta i motori di ricerca NMSLIB, FAISS e LUCENE, che tutti implementano ANN. Per ulteriori informazioni, vedere Ricerca k-NN con filtri.
Lucene Engine
Il filtro Lucene K-NN utilizza il grafico HNSW nell'implementazione.
L'esempio seguente mostra la creazione di un indice utilizzando il motore 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
}
}
}
}
}
}
Per utilizzare una pipeline di inclusione nell'indice, aggiungere la pipeline nella chiamata API, assicurandosi che il modello distribuito nella pipeline di inclusione abbia la stessa dimensionalità del vettore KNN specificata nella chiamata API, come indicato di seguito.
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
}
}
}
}
}
}
Motore Faiss
Per il motore Faiss, è possibile utilizzare l'algoritmo HNSW o l'algoritmo IVF per implementare il filtro ANN. Per informazioni dettagliate sui parametri di configurazione Faiss, vedere Implementazione del filtro FedK-NN.
Gli esempi riportati di seguito mostrano come creare un indice utilizzando il motore Faiss.
Senza una pipeline di ingestione
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"
}
}
}
}
}
Con una pipeline di ingestione
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"
}
}
}
}
}
Motore NMSLIB
L'esempio riportato di seguito mostra come creare un indice utilizzando il motore 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"
}
}
}
}
Spazi
Ciascuno dei motori supportati utilizza una certa euristica per confrontare l'incorporamento dei documenti e recuperare i documenti più rilevanti misurando la somiglianza. È possibile scegliere diversi parametri obiettivo da utilizzare. Le metriche scelte dipendono dal caso d'uso, dal modello e dai dati personalizzati. Per ulteriori informazioni, inclusa una tabella che mostra le opzioni disponibili tra cui scegliere, vedere Aree.