Un’immersione profonda in Qdrant, il database vettoriale basato su Rust

Un'immersione avvincente in Qdrant, il database vettoriale basato su Rust

Introduzione

I database vettoriali sono diventati il punto di riferimento per l’archiviazione e l’indicizzazione delle rappresentazioni di dati strutturati e non strutturati. Queste rappresentazioni sono le rappresentazioni vettoriali generate dai modelli di embedding. I negozi di vettori sono diventati una parte integrante dello sviluppo di app con modelli di deep learning, in particolare i modelli di linguaggio di grandi dimensioni. Nel paesaggio sempre in evoluzione dei negozi di vettori, Qdrant è uno dei database vettoriali introdotti di recente e ricco di funzionalità. Approfondiamo e scopriamone di più.

Obiettivi di apprendimento

  • Rendere familiari i termini di Qdrant per comprenderlo meglio
  • Esplorare Qdrant Cloud e creare i cluster
  • Imparare a creare embedding dei nostri documenti e archiviarli nelle collezioni di Qdrant
  • Esplorare il funzionamento delle interrogazioni in Qdrant
  • Sperimentare con i filtri in Qdrant per verificare come funzionano

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Cos’è un Embedding?

Gli embedding vettoriali sono un modo per esprimere i dati in forma numerica, cioè come numeri in uno spazio n-dimensionale o come vettore numerico, indipendentemente dal tipo di dati, come testo, foto, audio, video, ecc. Gli embedding ci permettono di raggruppare dati correlati in questo modo. Determinati input possono essere trasformati in vettori utilizzando certi modelli. Un modello di embedding ben noto creato da Google che traduce le parole in vettori (i vettori sono punti con n dimensioni) si chiama Word2Vec. Ogni modello di linguaggio di grandi dimensioni ha un modello di embedding che genera un embedding per l LLM.

A cosa servono gli Embedding?

Uno dei vantaggi di tradurre le parole in vettori è che permettono il confronto. Quando vengono fornite due parole come input numerico o embedding vettoriali, un computer può confrontarle anche se non può confrontarle direttamente. È possibile raggruppare insieme parole con embedding comparabili. Perché sono correlate tra loro, i termini Re, Regina, Principe e Principessa appariranno in un cluster.

In questo senso, gli embedding ci aiutano a individuare parole correlate a un termine dato. Ciò può essere utilizzato nelle frasi, dove inseriamo una frase e i dati forniti restituiscono frasi correlate. Questo serve come base per numerose applicazioni, tra cui chatbot, similarità delle frasi, rilevamento delle anomalie e ricerca semantica. I chatbot che sviluppiamo per rispondere a domande basate su un PDF o un documento utilizzano questa nozione di embedding. Questo metodo è utilizzato da tutti i modelli di linguaggio di grandi dimensioni per ottenere contenuti simili collegati alle domande che vengono loro fornite.

Cos’è un Database Vettoriale?

Come discusso, gli embedding sono rappresentazioni di qualsiasi tipo di dati, di solito quelli non strutturati, nel formato numerico in uno spazio n-dimensionale. Ora, dove li archiviamo? I tradizionali sistemi di gestione di database relazionali (RDBMS) non possono essere utilizzati per archiviare questi embedding vettoriali. Ecco dove entrano in gioco gli store vettoriali / database vettoriali. I database vettoriali sono progettati per archiviare e recuperare embedding vettoriali in modo efficiente. Ci sono molti store vettoriali disponibili, che differiscono per i modelli di embedding che supportano e il tipo di algoritmo di ricerca che utilizzano per ottenere vettori simili.

Cos’è Qdrant?

Qdrant è il nuovo motore di ricerca di similarità vettoriale e un database vettoriale, che fornisce un servizio pronto per la produzione costruito in Rust, il linguaggio noto per la sua sicurezza. Qdrant offre un’API user-friendly progettata per archiviare, cercare e gestire punti ad alta dimensionalità (i punti sono solo embedding vettoriali) arricchiti con metadati chiamati payload. Questi payload diventano informazioni preziose, migliorando la precisione della ricerca e fornendo dati interessanti agli utenti. Se sei familiare con altri database vettoriali come Chroma, il payload è simile ai metadati e contiene informazioni sui vettori.

Essendo scritto in Rust, Qdrant è uno store vettoriale veloce e affidabile anche con carichi pesanti. Ciò che differenzia Qdrant dagli altri database è il numero di API client che fornisce. Attualmente Qdrant supporta Python, TypeSciprt/JavaScript, Rust e Go. Viene fornito con un HSNW (Hierarchical Navigable Small World Graph) per l’indicizzazione vettoriale e offre molte metriche di distanza come cosine, dot ed euclidea. Viene fornito con un’API di raccomandazione preconfigurata.

Conoscere la terminologia di Qdrant

Per iniziare senza intoppi con Qdrant, è una buona pratica familiarizzare con la terminologia/principali componenti utilizzate nel database vettoriale di Qdrant.

Collezioni

Le collezioni sono insiemi nomeati di punti, in cui ogni punto contiene un vettore e un ID opzionale e un payload. I vettori nella stessa collezione devono condividere la stessa dimensionalità e devono essere valutati con una metrica singola scelta.

Metriche di distanza

Essenziali per misurare quanto sono vicini i vettori gli uni agli altri, le metriche di distanza vengono selezionate durante la creazione di una collezione. Qdrant fornisce le seguenti metriche di distanza: Dot, Cosine e Euclidea.

Punti

L’entità fondamentale all’interno di Qdrant, i punti sono composti da un embedding vettoriale, un ID opzionale e un payload associato, doveID: un identificatore univoco per ogni embedding vettorialevettore: una rappresentazione ad alta dimensionalità dei dati, che può essere strutturata o in formati non strutturati come immagini, testo, documenti, PDF, video, audio, ecc.payload: un oggetto JSON opzionale che contiene dati associati a un vettore. Questo può essere considerato simile a un metadato e possiamo usare questo per filtrare il processo di ricerca

Archiviazione

Qdrant offre due opzioni di archiviazione:

  • Archiviazione in memoria: memorizza tutti i vettori nella RAM, ottimizzando la velocità riducendo l’accesso al disco per le attività di persistenza.
  • Archiviazione Memmap: crea uno spazio di indirizzamento virtuale collegato a un file su disco, bilanciando velocità e requisiti di persistenza.

Questi sono i concetti principali di cui dobbiamo essere consapevoli per iniziare rapidamente con Qdrant

Qdrant Cloud: creazione del nostro primo cluster

Qdrant offre un servizio cloud scalabile per l’archiviazione e la gestione di vettori. Fornisce persino un cluster gratuito di 1 GB a tempo indeterminato senza informazioni sulla carta di credito. In questa sezione, passeremo attraverso il processo di creazione di un account con Qdrant Cloud e la creazione del nostro primo cluster.

Andando al sito web di Qdrant, vedremo una pagina di atterraggio come quella sopra. Possiamo registrarsi su Qdrant con un account Google o con un account GitHub.

Dopo aver effettuato l’accesso, ci verrà presentata l’interfaccia utente mostrata sopra. Per creare un cluster, andare alla barra di sinistra e fare clic su “Clusters” sotto la dashboard. Poiché abbiamo appena effettuato l’accesso, non abbiamo ancora cluster. Fare clic su “Crea Cluster” per creare un nuovo cluster.

Ora possiamo fornire un nome per il nostro cluster. Assicurarsi di avere tutte le configurazioni impostate alla posizione di partenza, poiché questo ci offre un cluster gratuito. Possiamo scegliere uno dei fornitori mostrati sopra e scegliere una delle regioni associate ad esso.

Verificare la configurazione attuale

Possiamo vedere a sinistra la configurazione attuale, cioè 0,5 vCPU, 1GB di RAM e 4GB di archiviazione su disco. Fare clic su “Crea” per creare il nostro cluster.

Per accedere al nostro cluster appena creato, abbiamo bisogno di una chiave API. Per creare una nuova chiave API, andare al “Controllo accesso dati” sotto la dashboard. Fare clic su “Crea” per creare una nuova chiave API.

Come mostrato sopra, ci verrà presentato un menu a tendina in cui selezioniamo per quale Cluster abbiamo bisogno di creare l’API. Poiché abbiamo solo un Cluster, selezioniamo quello e clicchiamo sul pulsante OK.

Successivamente ti verrà mostrato il token API come mostrato sopra. Inoltre, se vediamo la parte inferiore dell’immagine, ci viene fornito anche il frammento di codice per collegare il nostro Cluster, che utilizzeremo nella prossima sezione.

Qdrant – Pratico

In questa sezione, lavoreremo con il database vettoriale Qdrant. Per prima cosa, inizieremo importando le librerie necessarie.

!pip install sentence-transformers!pip install qdrant_client

La prima riga installa la libreria Python sentence-transformer. La libreria sentence transformer viene utilizzata per generare embeddi di frasi, testi e immagini. Possiamo utilizzare questa libreria per importare diversi modelli di embeddi per creare embeddi. La dichiarazione successiva installa il client qdrant per Python. Iniziamo creando il nostro client.

from qdrant_client import QdrantClientclient = QdrantClient(    url="YOUR CLUSTER URL",    api_key="YOUR API KEY",)

QdrantClient

Nel codice sopra, istanziamo il client importando la classe QdrantClient e fornendo l’URL del Cluster e la API Key che abbiamo appena creato poco fa. Successivamente, importeremo il nostro modello di embeddi.

# importing our embedding modelfrom sentence_transformers import SentenceTransformermodel = SentenceTransformer('sentence-transformers/all-mpnet-base-v2')

Nel codice sopra, abbiamo utilizzato la classe SentenceTransformer e istanziato un modello. Il modello di embeddi che abbiamo preso è il all-mpnet-base-v2. Questo è un modello di embeddi vettoriali di uso generale ampiamente popolare. Questo modello prende in input testo e restituisce un vettore di 768-dimensional. Definiamo i nostri dati.

# dati documenti = [    """ Gli elefanti, i mammiferi terrestri più grandi, mostrano una notevole intelligenza e \    legami sociali, affidandosi ai loro potenti trombi per comunicare e svolgere varie \ attività come sollevare oggetti \ e raccogliere cibo. """,    """ I pinguini, uccelli non volatori adattati alla vita in acqua, mostrano forti \ strutture sociali e straordinarie capacità genitoriali. I loro corpi snelli \ consentono nuotate efficienti e resistono \ alle dure condizioni antartiche in colonie strette. """,    """ Le auto, versatili mezzi di trasporto, si presentano in varie forme e \ dimensioni, dalle auto cittadine compatte ai potenti veicoli sportivi, offrendo una \ gamma di caratteristiche per diverse preferenze e \ esigenze. """,    """ Le moto, agili macchine a due ruote, offrono un'esperienza di guida emozionante e \ liberatoria, che attrae gli appassionati che apprezzano \ velocità, agilità e strade aperte. """,    """ Le tigri, magnifici grandi felini, sono cacciatori solitari con un \ pelo a strisce distintivo. La loro struttura corporea potente e i loro movimenti furtivi li rendono \ predatori temibili, ma le loro popolazioni sono minacciate \ a causa della perdita di habitat e del bracconaggio. """]

Nel codice sopra, abbiamo una variabile chiamata documenti che contiene una lista di 5 stringhe (prendiamo ciascuna di esse come un singolo documento). Ogni stringa dei dati è correlata a un argomento specifico. Alcuni dati sono correlati agli elementi e alcuni dati sono correlati agli autoveicoli. Creiamo gli embeddi per i dati.

# embeddare i datiembeddings = model.encode(documenti)print(embeddings.shape)

Utilizziamo la funzione encode() dell’oggetto modello per codificare i nostri dati. Per codificare, passiamo direttamente la lista dei documenti alla funzione encode() e memorizziamo gli embeddi vettoriali risultanti nella variabile embeddings. Stiamo anche stampando la forma degli embeddi, che qui stampa (5, 768). Questo perché abbiamo 5 punti dati, ovvero 5 documenti e per ogni documento viene creato un embeddo vettoriale di 768 dimensioni.

Crea la tua collezione

Ora creeremo la nostra collezione.

from qdrant_client.http.models import VectorParams, Distanceclient.create_collection(    collection_name = "my-collection",    vectors_config = VectorParams(size=768,distance=Distance.COSINE))
  • Per creare una Collezione, lavoriamo con la funzione create_collection() dell’oggetto client, e al parametro “Collection_name” passiamo il nome della nostra Collezione, ad esempio “mia-collezione”
  • VectorParams: Questa classe di qdrant viene utilizzata per la configurazione del vettore, come ad esempio la dimensione dell’embedding vettoriale, quale metrica di distanza utilizzare, e così via
  • Distance: Questa classe di qdrant viene utilizzata per definire quale metrica di distanza utilizzare per interrogare i vettori
  • Adesso al parametro vector_config passiamo la nostra configurazione, ovvero la dimensione degli embedding vettoriali che è 786, e la metrica di distanza che vogliamo utilizzare, che è COSINE

Aggiungi Embedding Vettoriali

Abbiamo ora creato con successo la nostra Collezione. Ora aggiorneremo i nostri embedding vettoriali in questa Collezione.

from qdrant_client.http.models import Batchclient.upsert (    collection_name = "mia-collezione",    points = Batch(        ids = [1,2,3,4,5],        payloads= [            {"categoria":"animali"},            {"categoria":"animali"},            {"categoria":"automobili"},            {"categoria":"automobili"},            {"categoria":"animali"}        ],        vectors = embeddings.tolist()    ))
  • Per aggiungere dati a qdrant chiamiamo il metodo upsert() e passiamo il nome della Collezione e i Punti. Come abbiamo imparato in precedenza, un Punto è composto da vettori, un indice opzionale e payload. La classe Batch di qdrant ci consente di aggiungere dati a lotti invece di aggiungerli uno per uno.
  • ids: Stiamo assegnando un ID ai nostri documenti. Attualmente stiamo fornendo una serie di valori da 1 a 5 perché abbiamo 5 documenti nella nostra lista.
  • payloads: Come abbiamo visto in precedenza, il payload contiene informazioni sui vettori, come metadata. Lo forniamo mediante coppie chiave-valore. Per ogni documento forniamo un payload, in cui assegniamo le informazioni di categoria per ciascun documento.
  • vectors: Questi sono gli embedding vettoriali dei documenti. Li convertiamo in una lista da un array numpy e li inseriamo.

Quindi, dopo aver eseguito questo codice, gli embedding vettoriali vengono aggiunti alla Collezione. Per verificare se sono stati aggiunti, possiamo visitare il pannello di controllo cloud che Qdrant Cloud fornisce. A tale scopo, eseguiamo quanto segue:

Clicchiamo sul pannello di controllo e si apre una nuova pagina.

Questo è il pannello di controllo di qdrant. Controlliamo qui la nostra Collezione “mia-collezione”. Clicchiamo su di essa per vedere cosa contiene.

Nel cloud di Qdrant, osserviamo che i nostri Punti (vettori + payload + ID) vengono effettivamente aggiunti alla nostra Collezione all’interno del nostro Cluster. Nella sezione successiva, impareremo come interrogare questi vettori.

Interrogazione del Database Vettoriale di Qdrant

In questa sezione, esamineremo come interrogare il database vettoriale e proveremo ad aggiungere alcuni filtri per ottenere un risultato filtrato. Per interrogare il nostro database vettoriale di qdrant, dobbiamo prima creare un vettore di query, che possiamo fare tramite:

query = model.encode(['Gli animali vivono nella foresta'])

Query Embedding

Quanto sopra creerà il nostro embedding di query. Successivamente, utilizzando questo embedding, interrogheremo il nostro store di vettori per ottenere gli embedding vettoriali più rilevanti.

client.search(    collection_name = "my-collection",    query_vector = query[0],    limit = 4)

Ricerca() Query

Per effettuare una query utilizziamo il metodo search() dell’oggetto client e gli passiamo i seguenti parametri:

  • Collection_name: Il nome della nostra Collezione
  • query_vector: Il vettore di query su cui vogliamo cercare nel vettore store
  • limit: Quanti risultati di ricerca vogliamo che la funzione search() limiti

Eseguendo il codice produrrà il seguente output:

Vediamo che per la nostra query, i documenti recuperati migliori sono della categoria animali. Possiamo quindi dire che la ricerca è efficace. Ora proviamola con un’altra query in modo da ottenere risultati diversi. I vettori non vengono visualizzati/recuperati per impostazione predefinita, quindi sono impostati su None.

query = model.encode(['I veicoli stanno inquinando il mondo'])client.search(    collection_name = "my-collection",    query_vector = query[0],    limit = 3)

Questa volta abbiamo dato una query relativa ai veicoli, il database dei vettori è stato in grado di recuperare con successo i documenti della categoria rilevante (automobili) in cima. Ora, se vogliamo fare del filtraggio, possiamo farlo in questo modo:

from qdrant_client.http.models import Filter, FieldCondition, MatchValuequery = model.encode(['Gli animali vivono nella foresta'])custom_filter = Filter(    must = [        FieldCondition(            key = "category",            match = MatchValue(                value="animals"            ),        )    ])
  • Innanzitutto, stiamo creando il nostro embedding/vettore di query
  • Qui importiamo le classi Filter, FieldCondition e MatchValue dalla libreria qdrant.
  • Filter: Utilizziamo questa classe per creare un oggetto Filter
  • FieldCondition: questa classe è per creare il filtro, ad esempio su cosa vogliamo filtrare la nostra ricerca
  • MatchValue: questa classe è per indicare su quale valore per una determinata chiave vogliamo che il database di vettori qdrant faccia il filtraggio

Quindi nel codice sopra, stiamo essenzialmente dicendo che stiamo creando un Filter che controlla la FieldCondition che la chiave “category” nel Payload corrisponde al valore “animals” (MatchValue). Questo sembra un po’ complicato per un semplice filtro, ma questo approccio renderà il nostro codice più strutturato quando stiamo lavorando su un Payload contenente molte informazioni e vogliamo filtrare su più chiavi. Ora utilizziamo il filtro nella nostra ricerca.

client.search(    collection_name = "my-collection",    query_vector = query[0],    query_filter = custom_filter,    limit = 4)

Query_filter

In questo caso, stavolta forniamo anche una variabile query_filter che prende il Filtro personalizzato che abbiamo definito. Nota che abbiamo impostato un limite di 4 per recuperare i primi 4 documenti corrispondenti. La query è relativa agli animali. Eseguendo il codice otterremo il seguente output:

Nell’output abbiamo ricevuto solo i primi 3 documenti più vicini anche se ne abbiamo 5. Questo perché abbiamo impostato il nostro filtro per scegliere solo le categorie animali e ci sono solo 3 documenti con quella categoria. In questo modo possiamo memorizzare gli embedding di vettori nel cloud di qdrant, eseguire una ricerca vettoriale su questi embedding di vettori, recuperare quelli più vicini e applicare anche filtri per filtrare l’output:

Applicazioni

Le seguenti applicazioni possono utilizzare Qdrant Vector Database:

  • Sistemi di Raccomandazione: Qdrant può alimentare i motori di raccomandazione, abbinando in modo efficiente vettori ad alta dimensionalità, rendendolo adatto per raccomandazioni di contenuti personalizzate su piattaforme come servizi di streaming, e-commerce o social media.
  • Ricerca di Immagini e Multimedia: Sfruttando la capacità di Qdrant di gestire vettori che rappresentano immagini e contenuti multimediali, le applicazioni possono implementare funzionalità di ricerca e recupero efficaci per database di immagini o archivi multimediali.
  • Applicazioni di Elaborazione del Linguaggio Naturale (NLP): Il supporto di Qdrant agli embedding vettoriali lo rende prezioso per compiti di NLP, come la ricerca semantica, il matching di similarità tra documenti e la raccomandazione di contenuti in applicazioni che gestiscono grandi quantità di dati testuali.
  • Rilevazione delle Anomalie: La ricerca di vettori ad alta dimensionalità di Qdrant può essere utilizzata nei sistemi di rilevazione delle anomalie. Confrontando i vettori che rappresentano il comportamento normale con i dati in ingresso, possono essere identificate anomalie in campi come la sicurezza delle reti o il monitoraggio industriale.
  • Ricerca e Abbinamento di Prodotti: Nelle piattaforme di e-commerce, Qdrant può migliorare le capacità di ricerca dei prodotti abbinando vettori che rappresentano le caratteristiche dei prodotti, facilitando raccomandazioni precise ed efficienti in base alle preferenze dell’utente.
  • Filtraggio basato sul Contenuto in Social Networks: La ricerca di vettori di Qdrant può essere applicata ai social network per il filtraggio basato sul contenuto. Gli utenti possono ottenere contenuti rilevanti in base alla similarità delle rappresentazioni vettoriali, migliorando l’interazione dell’utente.

Conclusioni

Man mano che cresce la richiesta di rappresentazione efficiente dei dati, Qdrant si distingue essendo un motore di ricerca di similarità vettoriale Open Source, scritto nel robusto e sicuro linguaggio Rust. Qdrant include tutte le metriche di distanza più popolari e offre un modo robusto per filtrare la nostra ricerca vettoriale. Con le sue ricche funzionalità, architettura nativa cloud e terminologia robusta, Qdrant apre le porte a una nuova era nella tecnologia di ricerca di similarità vettoriale. Nonostante sia nuovo nel campo, fornisce librerie client per molti linguaggi di programmazione e offre un servizio cloud che si scala efficientemente con la dimensione.

Punti Chiave

Alcuni dei punti chiave includono:

  • Creato in Rust, Qdrant garantisce sia velocità che affidabilità, anche sotto carichi pesanti, rendendolo la scelta migliore per i negozi di vettori ad alte prestazioni.
  • Ciò che distingue Qdrant è il suo supporto per le API client, rivolte ai sviluppatori in Python, TypeScript/JavaScript, Rust e Go.
  • Qdrant sfrutta l’algoritmo HSNW e fornisce diverse metriche di distanza, tra cui Dot, Cosine ed Euclidea, consentendo agli sviluppatori di scegliere la metrica che si allinea con i loro casi d’uso specifici.
  • Qdrant si trasferisce senza soluzione di continuità nel cloud con un servizio cloud scalabile, offrendo una opzione gratuita per l’esplorazione. La sua architettura nativa cloud garantisce prestazioni ottimali, indipendentemente dal volume dei dati.

Domande Frequenti

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e vengono utilizzati a discrezione dell’autore.