Reading Time: 6 minutes

Nella versione di ElasticSearch 8.0 sono state introdotte diverse novità che vanno a migliorare la soluzione per velocità, scalabilità e semplicità e ottimizzazione nella ricerca soprattutto per il NLP.
Nello specifico sono state introdotte:

  • Compatibilità API REST alle versione precedenti di Elastic
  • Funzioni di sicurezza configurate di default per l’autenticazione, l’autorizzazione e la crittografia di rete (TLS)
  • Potenziamento della protezione degli indici di sistema
  • Risparmio di archiviazione per i campi keyword, match_only_text e text con una riduzione del 14,4% sulla dimensione dell’indice e del 3,5% come impronta sul disco.
  • Indicizzazione più rapida dei campi
  • Nuova API di ricerca kNN che permette di sfruttare la metrica di similarità per eseguire query sul linguaggio naturale con una accuracy più elevata e una latenza ridotta.
  • Supporto dei modelli PyTorch per l’elaborazione del linguaggio naturale (NLP).

In questo breve estratto ci concentreremo nello scoprire le nuove funzionalità relative alla gestione, l’arricchimento del linguaggio naturale e quali sono i possibili utilizzi.

Per cominciare l’API di ricerca kNN esegue una ricerca k-nearest neighbor (kNN) sul campo dense_vector. Data una query, trova i k vettori più vicini e restituisce quei documenti come risultati di ricerca.
Elasticsearch utilizza l’ algoritmo HNSW per supportare una ricerca kNN efficiente.
Come la maggior parte degli algoritmi kNN, HNSW è un metodo approssimativo che sacrifica l’accuratezza dei risultati per una migliore velocità di ricerca. Ciò significa che i risultati restituiti non sono sempre i veri k vicini più prossimi.

kNN esempio di classificazione per distanza

Ma come funziona l’algoritmo HNSW e perché riesce a velocizzare i risultati di una ricerca?

HNSW è un algoritmo ANN che si inserisce nella categoria dei grafici. Si tratta di un grafo di prossimità, in cui due vertici sono collegati in base alla loro prossimità (i vertici più vicini sono collegati)  spesso definito in distanza euclidea.
C’è un significativo salto di complessità da un grafico di “prossimità” a un grafico di “Hierarchical Navigable Small World”.

La ricerca vettoriale utilizzando i grafici Navigable Small World (NSW) è stata introdotta nel corso degli ultimi anni. L’idea è che, se prendiamo un grafo di prossimità ma lo costruiamo in modo da avere collegamenti sia a lungo che a corto raggio, i tempi di ricerca si riducono alla complessità (poli/)logaritmica.

Ogni vertice nel grafico si collega a molti altri vertici. Chiamiamo questi vertici connessi “amici” e ogni vertice mantiene “una lista di amici”, creando il nostro grafico.

Quando si cerca un grafico NSW, si inizia da un punto di ingresso predefinito. Questo punto di ingresso si collega a diversi vertici vicini. Identifichiamo quale di questi vertici è il più vicino al nostro vettore di query e ci spostiamo lì.

Ripetiamo il processo di ricerca greedy di spostamento da un vertice all’altro identificando quelli più vicini in ciascuna lista di amici. Alla fine, non troveremo vertici più vicini del nostro attuale: questo è un minimo locale e funge da nostra condizione di arresto.

L’introduzione di questo algoritmo al fianco del kNN permette di scalare con più facilità sui indici di grandi dimensioni.

La nuova funzionalità introdotta da Elastic 8 che sfrutta la Vector Similarity presenta nuove implementazioni, come:

  • Migliore Ranking in base alla semantica
  • Possibilità di fare querying su dati non strutturati di tipo testuale
  • Image search
  • Ranking di dati strutturati su un vettore di più grande dimensione

La Vector Similarity permette di trasformare il testo in formato vettoriale. Questo tipo di testo vettorizzato permette di fare un ranking più preciso, non solo sulla frequenza della parola ma anche sul significato, e quindi aggregarlo ai singoli termini all’interno dei nostri file.
Utilizzando modelli di deep learning sul testo è possibile associare le immagini relative alle parole che stiamo cercando.

In breve la Vector Similarity permette di trovare similitudini all’interno di dati non strutturati, come quelli testuali.

Oltre a riuscire a manipolare in modo migliore il testo e i dati non strutturati, con l’introduzione al supporto di modelli che sfruttano PyTorch, è possibile arricchirlo con diversi task di NLP e rendere a tutti gli effetti il testo una nuova sorgente da cui poter estrarre informazioni in modo avanzato.
L’elaborazione del Natural Language Processing si riferisce al modo in cui possiamo utilizzare il software per comprendere il linguaggio naturale.

Classicamente il NLP veniva eseguita utilizzando regole linguistiche, dizionari, espressioni regolari e apprendimento automatico per attività specifiche come la categorizzazione automatica o il riepilogo del testo.

Negli ultimi anni, tuttavia, le tecniche di deep learning hanno preso il sopravvento su gran parte del panorama del NLP. Il deep learning sfrutta la disponibilità di set di dati su larga scala, calcoli economici e tecniche per l’apprendimento su larga scala con un minore coinvolgimento umano. I modelli linguistici pre-addestrati che utilizzano questa architettura hanno avuto particolare successo.
Ad esempio, BERT è un modello linguistico pre-addestrato che è stato rilasciato da Google nel 2018. Da allora, è diventato l’ispirazione per la maggior parte delle moderne tecniche di NLP di oggi. Le funzionalità di machine learning di Elastic Stack sono strutturate attorno ai modelli BERT e Transformer. Queste funzionalità supportano lo schema di tokenizzazione di BERT (chiamato WordPiece) e modelli  conformi all’interfaccia del modello BERT standard.

Per incorporare modelli e fare previsioni, Elasticsearch utilizza libtorch, che è una libreria nativa sottostante PyTorch. I modelli addestrati devono trovarsi in una rappresentazione TorchScript per l’uso con le funzionalità di machine learning di Elastic Stack.

Come nei casi di classificazione e regressione, dopo aver distribuito un modello al tuo cluster, è possibile utilizzarlo per fare previsioni (note anche come inferenza ) rispetto ai dati in entrata. È possibile eseguire le seguenti operazioni NLP come:

  • Fill mask
  • Name Entity Recognition
  • Language identification (default con il cluster di ML in Elastic8)
  • Text-classification (ex.Sentiment Analysis)
  • Zero-shot classification (si può definire le nostre label e quindi eseguire il classificatore per assegnare una probabilità a ciascuna label)

Queste operazioni sono facilmente implementabili utilizzando Eland, un client Python Elasticsearch per esplorare e analizzare i dati in Elasticsearch con un’API compatibile con Pandas,  e i modelli pre-trained che sono a disposizione sulla piattaforma HuggingFace.

Andiamo adesso ad approfondire le novità per NLP di Elastic 8.0 in questo video.