Hai sentito parlare di Ricerca Vettoriale e Comprensione Semantica del testo ma non sai come sono correlati con l'Intelligenza Artificiale? Vorresti approfondire, anche tecnicamente, i concetti che sono alla base della Ricerca Vettoriale e della Comprensione Semantica Avanzata con l'AI?
Bene, allora seguimi in questo articolo nel quale cercherò di fornirti strumenti e nozioni per comprendere al meglio i concetti base correlati alla comprensione semantica del testo, alla ricerca vettoriale e come siano strettamente connessi con l'Intelligenza Artificiale e le tecnologie emergenti basate su reti neurali.
Ti mostrerò anche qualche esempio pratico su come mettere in piedi un semplice sistema di ricerca vettoriale per ottimizzare la ricerca e comprensione del testo.
I contenuti dell'articolo
- Differenze tra ricerca per tag, full text e vettoriale
- Intelligenza Artificiale e Vettori
- Come generare Embeddings e Vettori
- Come implementare un sistema di Ricerca Vettoriale
- Vuoi un Sistema di Ricerca Semantica Aziendale?
- I DBMS che supportano la ricerca vettoriale
- Il futuro della ricerca vettoriale e dell’AI
Dal lancio di ChatGPT si parla sempre più spesso di Intelligenza Artificale, OpenaAI e prompt, di creazione di immagini o video con l'AI ma troppo spesso si sottovaluta l'importanza dell'Intelligenza Artificiale correlata con la ricerca dei dati.
In epoca di BigData la ricerca è diventata una componente cruciale di molti sistemi e sempre più spesso i metodi tradizionali si rivelano inadatti o poco funzionali.
Vediamo quindi come la ricerca si è evoluta dai tradizionali tag e parole chiave fino alla rivoluzionaria ricerca vettoriale che sfrutta l'intelligenza artificiale ed i vettori o embeddings.
Cominciamo quindi con il chiarire alcuni concetti chiave legati alle diverse tipologie di ricerca ovvero ricerca standard (tag e parole) ricerca di tipo Full-Text (analisi del testo) e la nuovissima ricerca di tipo Vettoriale
Differenze tra ricerca per tag, full text e vettoriale
Questa le principali differenze tra le varie tipologie di ricerca.
Ricerca tradizionale per tag o per parole
Questo metodo è basato sulla ricerca diretta di tag o parole contenute nel testo. È molto efficiente quando i dati sono ben categorizzati, ma è limitato dalla rigidità dei tag e delle parole stesse. Per esempio, se stai cercando “auto sportive” i dati devono essere specificamente taggati come tali, oppure nel testo devono essere presenti le parole “auto” e “sportive” altrimenti potresti non ottenere risultati.
Questa ricerca possiamo definirla anche “binaria” ossia o ritorna risultati o non ritorna risultati, non è quindi possibile definire uno “score” della ricerca ovvero una pertinenza del termine cercato con i risultati ottenuti perché lo score sarebbe sempre o 1 (trovo i dati) oppure 0 (non trovo i dati).
Ricerca full text
Nella ricerca full text il sistema cerca i termini all’interno del contenuto testuale. È un miglioramento rispetto ai tag perché analizza l’intero testo, ma ha ancora delle limitazioni: si basa solo sulle corrispondenze esatte o parziali delle parole, il che può restituire risultati irrilevanti o mancare di cogliere contesti più sottili o sfumature semantiche.
La ricerca di tipo Full-Text necessita di particolari indici creati sui dati oggetto della ricerca, quasi tutti i dbms moderni supportano questi indici e si può implementare sia su dbms tradizionali (Transazionali) che su dbms noSQL.
Questa ricerca ritorna uno “score” ovvero una pertinenza del termine cercato con i risultati ottenuti che solitamente è compreso tra 0 e 1, sulla base dello score quindi si può determinare quale siano le occorrenze migliori.
Ricerca vettoriale
Qui entra in gioco la ricerca vettoriale che rappresenta le informazioni come vettori in uno spazio multidimensionale. Invece di cercare semplicemente parole o tag, il sistema confronta l'intero significato di frasi o documenti. Questo approccio è molto più potente perché può comprendere somiglianze semantiche, trovando corrispondenze anche quando il linguaggio varia.
Anche la ricerca di tipo Vettoriale necessita di particolari indici creati sui dati oggetto della ricerca, sono pochi i dbms che supportano questi indici e si può implementare sia su dbms tradizionali (Transazionali) che su dbms noSQL, anche se è consigliabile usare dbms di tipo noSQL. (Sotto ti fornisco esempi di dbms che supportano questa tipologia di ricerca)
Anche questa ricerca ritorna uno “score” della ricerca ovvero una pertinenza del termine cercato con i risultati ottenuti che solitamente è compreso tra 0 e 1, sulla base dello score quindi si può determinare quale siano le occorrenze migliori.
Intelligenza Artificiale e Vettori
Facciamo ora un focus specifico su questa tipologia di ricerca cercando di capire quali sono le peculiarità della ricerca vettoriale, chiarendo concetti come vettori, embeddings, reti neurali ed intelligenza artificiale.
La prima distinzione da fare e da comprendere è che il processo di generazione di un vettore e quello di ricerca vettoriale sono distinti e quindi è bene comprendere come generare un vettore e poi come utilizzarlo per implementare un sistema evoluto di ricerca.
Mentre la generazione di un vettore si concentra sull'estrazione di caratteristiche o significati dai dati (testo, immagini, audio) attraverso modelli di intelligenza artificiale come le reti neurali, la ricerca vettoriale utilizza quei vettori per confrontare e trovare somiglianze tra dati diversi in uno spazio vettoriale e si implementa sfruttando le potenzialità dei dbms noSQL (ne parleremo più avanti) o sistemi dedicati che eseguono la ricerca in memoria (questo secondo aspetto non verrà trattato in questo articolo).
In altre parole la generazione di un vettore è il processo di trasformazione di un concetto in una rappresentazione numerica, mentre la ricerca vettoriale sfrutta questi vettori per eseguire operazioni matematiche di confronto semantico, trovando elementi con significati o contesti simili.
Esistono, ovviamente, soluzioni commerciali che fanno tutto in modo integrato (generazione e ricerca) ma la loro analisi non è il focus di questo articolo.
Come generare Embeddings e Vettori
Come sottolineato la ricerca vettoriale si basa sugli embeddings, che sono una particolare tipologia di vettori creati attraverso modelli di apprendimento automatico.
Un embedding è una rappresentazione numerica di dati complessi, come parole, frasi o immagini, in uno spazio vettoriale a più dimensioni. In altre parole è un modo per trasformare concetti astratti in una serie di numeri (un vettore) che possono essere confrontati matematicamente.
Gli embeddings sono fondamentali per la ricerca vettoriale perché consentono di cercare non solo corrispondenze esatte, ma anche concetti simili o collegati tra loro (come “re” e “principe“) che hanno vettori vicini nello spazio vettoriale.
Questo avviene perché gli embeddings catturano le relazioni semantiche tra le parole, basandosi su come vengono usate in contesti simili, mentre nella ricerca standard o full-text abbiamo solo una corrispondenza di termini.
Questo un esempio di generazione di embeddings considerando solo due parametri (età e sesso) per i Ruoli Familiari
Ovviamente nella pratica concreta delle reti neurali la generazione degli embeddings utilizza moltissime informazioni in più e moltissime dimensioni.
Ma come si può convertire un testo generico in embeddings ovvero in rappresentazione numerica multidimensionale?
Ecco che entra in gioco l'Intelligenza Artificiale e più in generale le reti neurali.
Intelligenza artificiale e la generazione dei vettori
L'intelligenza artificiale e più in particolare le reti neurali sono il cuore della generazione degli embeddings.
Modelli avanzati, come ad esempio quelli di OpenAI, sono addestrati su enormi quantità di dati per produrre embeddings molto sofisticati. Questi modelli possono generare vettori che rappresentano il significato profondo di una parola o di un concetto, rendendo la ricerca vettoriale incredibilmente potente e precisa.
La API di OpenAI per generare vettori
Una delle soluzioni più avanzate per generare vettori da utilizzare nella ricerca vettoriale è l’API di OpenAI, che consente di generare embeddings di alta qualità tramite modelli come GPT.
Questa API permette di convertire frasi o documenti in vettori che potranno poi essere utilizzati nei dbms di ricerca vettoriale per trovare somiglianze semantiche. La semplicità e l’efficacia di questi modelli hanno reso l’API di OpenAI una delle soluzioni più popolari per la generazione di embeddings.
Per generare gli embeddings di un testo usando le API Rest di OpenAI dovrai invocare la API “/v1/embeddings” con il modello text-embedding-3-small o text-embedding-3-large questo un esempio con curl
E questo il risultato della risposta
L'embeddings è stato semplificato per motivi di visualizzazione, ma come puoi vedere altro non è che un Array di Float.
Trovi maggiori dettagli sul sito ufficiale di OpenAI.
Maggiore è la dimensione dell'array e migliore è la rappresentazione vettoriale dell'oggetto convertito, ad esempio OpenAI mette a disposizione degli utenti due diversi modelli che sono:
- text-embedding-3-small produce array di dimensione 1536
- text-embedding-3-large produce array di dimensione 3072
Una volta generati i vettori questi potranno essere utilizzati per implementare la ricerca vettoriale basata su somiglianze semantiche.
Considera che solo gli utenti sottoscrittori di un abbonamento a ChatGPT Plus potranno invocare l'API “/v1/embeddings” e che una volta generati gli embeddings questi poi dovranno essere utilizzati in un dbms che supporti questa tipologia di ricerca.
C'è tuttavia una limitazione nel numero massimo di token ovvero nella lunghezza del testo che puoi inviare ad OpenAI.
Esistono anche soluzioni Open Source che ti permettono di generare gli embeddings per la ricerca vettoriale e che non hanno la limitazione del testo, vediamo i principali.
Soluzioni open source per generare vettori
Oltre alle soluzioni commerciali, esistono numerose alternative open source per generare embeddings. Questi strumenti sono ampiamente utilizzati per trasformare dati complessi come testo, immagini o suoni in vettori numerici.
Ecco alcune delle più note:
- FastText: Creato da Facebook AI Research, FastText è uno strumento efficace per la generazione di embeddings basati su parole e sotto-parole. È particolarmente utile per catturare somiglianze semantiche tra parole e affrontare lingue morfologicamente complesse.
- DeepLearning4J: Una potente libreria di deep learning open source per Java. DeepLearning4J supporta la creazione di modelli di deep learning per la generazione di embeddings, rendendolo particolarmente interessante per progetti che richiedono un'integrazione in applicazioni Java aziendali.
- Hugging Face Transformers: Una libreria che fornisce modelli pre-addestrati per compiti di NLP (Natural Language Processing), inclusa la generazione di embeddings per testi. Questi modelli possono essere utilizzati per creare rappresentazioni vettoriali di frasi, documenti o persino parole, sfruttando modelli come BERT, GPT, e RoBERTa.
- Word2Vec: Un algoritmo pionieristico per la generazione di embeddings basati su parole. Word2Vec crea vettori che rappresentano le parole in uno spazio multidimensionale, catturando le relazioni semantiche tra di esse in base al contesto d'uso nei testi.
- GloVe (Global Vectors for Word Representation): Un altro modello di generazione di embeddings per parole, sviluppato da Stanford. GloVe crea vettori a partire dalle co-occorrenze di parole nei corpora, generando rappresentazioni che catturano sia le relazioni semantiche che quelle sintattiche.
- TensorFlow Embeddings: TensorFlow, una delle librerie di deep learning più popolari, offre strumenti per creare embeddings personalizzati attraverso reti neurali. Con TensorFlow, è possibile addestrare modelli per generare vettori che catturano caratteristiche avanzate da testo, immagini o altri dati.
Questi strumenti offrono soluzioni accessibili e scalabili per la ricerca vettoriale, tuttavia potrebbero richiedere un numero elevato di risorse sui tuoi sistemi, soprattutto se vuoi pre-addestrare i modelli con i dati in tuo possesso (es i dati dei tuoi documenti).
Cosa significa pre-addestrare i modelli
Pre-addestrare un modello significa addestrare un algoritmo su un grande corpus di dati generici prima di adattarlo a un compito specifico. Questo approccio consente al modello di acquisire conoscenze generali sul linguaggio (es italiano) o altri tipi di dati, come immagini o audio, che poi possono essere affinate con dati specifici per il tuo caso d'uso.
Esempio con FastText
In FastText il modello può essere pre-addestrato su grandi corpora generici, come Wikipedia o Common Crawl, per imparare le rappresentazioni vettoriali delle parole in modo generale. Una volta ottenuto questo modello pre-addestrato, puoi fare il fine-tuning sui tuoi dati specifici (ad esempio documenti aziendali) per ottenere embeddings più rilevanti per il tuo dominio. Questo processo combina i vantaggi di partire da un modello robusto e generale, adattandolo alle peculiarità dei dati specifici che utilizzi.
La procedura per eseguire il fine-tuning di un modello pre-esistente (ad esempio, addestrato su Wikipedia) con le informazioni specifiche del tuo dominio è abbastanza semplice, anche se può richiedere risorse computazionali notevoli.
Come prima cosa devi installare fastText sul tuo pc o sul server, la procedura è molto semplice. Una volta installato potrai usare o la riga di comando oppure pyton per effettuare l'addestramento.
Scarica, sempre dal sito fastText, il modello vettoriale generico addestrato con le informazioni presenti in wikipedia italiano: cc.it.300.vec
Dopo aver scaricato il modello, prepara un file di testo contenente le informazioni che desideri aggiungere al modello. Questo file potrebbe essere una rappresentazione testuale dei tuoi documenti (ad esempio estratti da file DOC, PDF o altro). Assicurati che il contenuto del file sia su un'unica riga per documento, senza interruzioni di riga.
Il comando per il fine-tuning è il seguente:
fasttext skipgram -input input.txt -output mymodel -pretrainedVectors cc.it.300.vec -epoch 5 -dim 300
Eseguendo questo comando, otterrai due nuovi file:
- mymodel.vec: Questo file contiene le rappresentazioni vettoriali aggiornate, addestrate sui tuoi dati e su Wikipedia. Dovrai utilizzare questo file in futuro se desideri continuare ad aggiungere informazioni al modello.
- mymodel.bin: Questo è il file binario che utilizzerai nel tuo software per generare gli embeddings, ovvero per creare rappresentazioni vettoriali delle nuove informazioni da confrontare.
Maggiori informazioni su come utilizzare FastText le trovi a questo link.
Come Integrare fastText in Java SpringBoot
Sebbene FastText sia ottimizzato per applicazioni in Python, può essere facilmente integrato in altri linguaggi di programmazione, inclusi Java e Spring Boot, per generare in modo programmato gli embeddings di un concetto o di una frase.
In Java, puoi utilizzare la libreria JFastText, un binding Java per FastText, che ti consente di caricare modelli FastText e generare embeddings direttamente dal codice Java.
Questi i passaggi per integrare FastText in un'applicazione Java Spring Boot:
- Aggiungere la dipendenza JFastText
Il primo passo per integrare FastText in un progetto Java Spring Boot è aggiungere la dipendenza di JFastText nel tuo file pom.xml (se utilizzi Maven) o build.gradle (se utilizzi Gradle).
- Scarica il modello FastText
Scarica il modello pre-addestrato o personalizzato in formato .bin oppure esegui l'addestramento di tipo fine-tuning come spiegato in precedenza creando la tua versione di file binario.
- Crea un servizio per gestire FastText
All'interno della tua applicazione Spring Boot, puoi creare un servizio per gestire il caricamento del modello FastText e generare embeddings dalle query o dai documenti.
Ora potrai generare gli embeddings, anche su modelli pre-addestrati, direttamente nella tua applicazione.
Ma una volta generati gli embeddings di un concetto, come possiamo utilizzarli per eseguire ed implementare un sistema di ricerca vettoriale?
Vediamo in dettaglio come implementare un sistema di Ricerca Vettoriale.
Come implementare un sistema di Ricerca Vettoriale
Una volta che hai generato gli embeddings (i vettori) dei tuoi dati, il passo successivo è utilizzare questi vettori per implementare un sistema di ricerca vettoriale.
Ecco i passaggi principali per costruire tale sistema:
Creazione e archiviazione degli embeddings
Prima di tutto, devi generare gli embeddings per i tuoi dati. Ogni parola, frase, documento, immagine o altro tipo di contenuto verrà convertito in un vettore numerico. Questi vettori devono essere archiviati in una struttura che permetta un accesso rapido e una facile manipolazione.
A seconda della scala del tuo progetto, puoi scegliere di salvarli in memoria o in un database vettoriale, nel prossimo paragrafo vedremo insieme quali sono i principali dbms che permettono di eseguire ricerche vettoriali e faremo anche qualche esempio concreto.
Indice vettoriale
Per rendere la ricerca efficiente è importante costruire un indice sui tuoi vettori. Gli indici vettoriali aiutano a ridurre i tempi di ricerca, specialmente quando lavori con set di dati di grandi dimensioni.
Strumenti come Faiss di Facebook o Annoy di Spotify ti permettono di costruire indici efficienti che ottimizzano la velocità di ricerca. Questi strumenti utilizzano tecniche di nearest neighbor search (ricerca del vicino più prossimo) per trovare i vettori più simili a quello che stai cercando.
Ad esempio questa è la sintassi per creare un indice vettoriale con mongoDB
Come puoi notare dovrai inserire la “dimensions” del tuo vettore, questo campo è di fondamentale importanza perché poi tutti gli embeddings che andrai ad inserire dovranno avere la stessa dimensione (numero di campi), per cui è fondamentale scegliere un sistema di generazione degli embeddings e poi utilizzare sempre quello.
Se ad esempio scegli le API di OpenAI ed il modello di generazione text-embedding-3-small allora dovrai creare un indice di dimensione 1536
Importante è anche il campo “similarity” che specifica il metodo utilizzato per calcolare la similarità tra vettori durante le query di ricerca.
Misura della somiglianza
Una volta che hai gli embeddings e un indice, la chiave per la ricerca vettoriale è calcolare la somiglianza tra vettori.
Gli algoritmi più comuni per calcolare la somiglianza tra vettori sono:
- Distanza Coseno: misura l'angolo tra due vettori nello spazio multidimensionale, utilizzata spesso per dati testuali.
- Distanza Euclidea: misura la distanza diretta tra due punti nello spazio, utile per embeddings di immagini o dati spaziali.
- Distanza di Manhattan o Minkowski: altre varianti per confrontare vettori in funzione della loro configurazione geometrica.
Per le ricerche testuali, solitamente, si utilizza la Distanza Coseno.
Esecuzione delle query di ricerca
Quando l'utente inserisce una query di ricerca questa deve essere convertita in un embedding utilizzando lo stesso modello utilizzato per i dati originali archiviati nel dbms.
L'embeddings della query viene confrontato con tutti i vettori del dataset utilizzando l’indice vettoriale ed i vettori più vicini (in termini di somiglianza) vengono restituiti come risultato della ricerca.
Ad esempio, se stai cercando un documento simile a un altro, la ricerca vettoriale troverà documenti che hanno vettori vicini nello spazio semantico.
Classifica e filtraggio dei risultati
Una volta ottenuti i vettori più simili, puoi classificarli in base al loro livello di somiglianza con la query o dato di score. Spesso il sistema restituisce i risultati in ordine di rilevanza, con i vettori più vicini ai primi posti.
Puoi anche applicare ulteriori filtri o logiche aziendali per raffinare i risultati in base ad altre metriche o regole.
Da quanto descritto puoi capire come una ricerca di questo tipo ossia una ricerca basata su concetti semantici e non a uguaglianza diretta, possa risultare di grande utilità per la ricerca di documenti aziendali soprattutto se la tua azienda ha moltissimi documenti.
Esempi potrebbero essere quelli di studi di ingegneria, studi legali o di commercialisti ma più in generale di chiunque abbia moltissimo documenti e voglia effettuare delle ricerche semantiche complesse sui dati.
Vuoi un Sistema di Ricerca Semantica Aziendale?
Se ti interessa questa soluzione e vorresti capire se puoi implementare in azienda un sistema di Ricerca Vettoriale basato sull' Intelligenza Artificiale e l'Analisi Semantica dei testi allora contattami.
Sarò lieto di mostrarti “troovo” la soluzione software che ho implementato appositamente per gli studi professionali e le piccole e medie imprese integrato con l'AI
troovo è un software che semplifica la gestione dei tuoi documenti aziendali! Archivia, indicizza e trova facilmente i tuoi file, inoltre con l'aiuto dell'AI e della tecnologia RAG ottieni risposte rapide e precise dai tuoi stessi documenti.
Fai una domanda e Troovo ti guiderà al documento ed alla risposta giusta.
Facciamo un esempio concreto:
Immagina uno studio di ingegneria che sta lavorando a un progetto per la costruzione di un nuovo ponte. Gli ingegneri hanno bisogno di accedere rapidamente a documenti tecnici, normative di costruzione, studi strutturali e progetti precedenti, tutti archiviati nei loro sistemi aziendali. Con Troovo, possono farlo in modo semplice e veloce.
Utilizzando un sistema di ricerca vettoriale, un ingegnere può digitare nella barra di ricerca: “normative per la costruzione di ponti in acciaio” o “progetto ponte ad arco”. Troovo cerca in tempo reale tutti i documenti rilevanti già indicizzati, trovando rapidamente regolamenti, manuali e file tecnici specifici per la costruzione del ponte.
Una volta trovati i documenti potrai interrogare l'Intelligenza Artificiale per fargli domande specifiche o redigere un breve documento di sintesi.
Potrai inoltre salvare i tuoi documenti in bucket S3 privati, sicuri ed ottimizzati per generare copie di backup.
I DBMS che supportano la ricerca vettoriale
Ma quali sono i DBMS che supportano gli indici vettoriali?
Sono ormai molti i database management systems (DBMS) moderni che stanno integrando funzionalità di ricerca vettoriale per offrire un supporto nativo a questo tipo di tecnologia.
Vediamo i principali
- Pinecone: Pinecone è un DBMS specializzato in ricerca vettoriale, progettato per fornire risultati di query estremamente rapidi su grandi set di dati, senza bisogno di infrastrutture complesse. Pinecone è molto utilizzato in ambiti che richiedono scalabilità.
- Apache Solr: Solr, noto principalmente per la sua ricerca full-text, ha introdotto dalla versione 9 il supporto per la ricerca vettoriale attraverso l’integrazione di funzionalità come il cosine similarity. Questo lo rende un'opzione flessibile per chi cerca un sistema che combini ricerca testuale e semantica.
- MongoDB: A partire dalla versione 7, MongoDB ha introdotto il supporto per la ricerca vettoriale attraverso la sua funzionalità Atlas Search. Questo consente di eseguire query su dati vettoriali in modo nativo, offrendo anche la possibilità di combinare ricerca full-text e vettoriale per creare esperienze di ricerca più intelligenti e personalizzate. Nel momento in cui scrivo l'articolo la ricerca vettoriale è disponibile solo nella versione Atlas (cloud) di MongoDB.
- PostgreSQL + pgvector: PostgreSQL, uno dei DBMS open-source più popolari, può essere esteso con l’uso dell’estensione pgvector. Questa estensione permette di memorizzare e interrogare vettori in PostgreSQL, integrandosi facilmente con sistemi esistenti.
- Weaviate: Weaviate è un motore di database open-source che permette la ricerca di dati attraverso vettori. Supporta nativamente la ricerca vettoriale, ed è ottimo per progetti AI e ricerca semantica.
- Redis: Redis ha recentemente introdotto supporto per search vectors attraverso il modulo RedisSearch. Questo permette di integrare capacità di ricerca vettoriale in un ambiente ad alta velocità e con bassissima latenza.
- Elasticsearch + KNN (Approximate Nearest Neighbor): Elasticsearch, noto per la ricerca full-text, ha aggiunto funzionalità di K-Nearest Neighbors (KNN) per supportare ricerche vettoriali. Questo permette di combinare ricerca testuale e vettoriale in un unico sistema.
- Zilliz: Zilliz è un motore di ricerca specializzato nella gestione di dati non strutturati e vettoriali, ed è il principale sostenitore del progetto Milvus. È progettato per applicazioni AI e machine learning su larga scala.
Come vedi sono molte le soluzioni di DBMS che implementano ricerca vettoriale e pian piano sempre più soluzioni vengono rese disponibili proprio perché l'attenzione legata all'intelligenza artificiale è sempre più alta.
Vediamo ora tre esempi concreti di implementazione della ricerca vettoriale usando i dbms Pinecone, Solr e mongoDB.
La ricerca vettoriale con Pinecone
Pinecone è un DBMS specializzato in ricerca vettoriale, progettato per fornire risultati di query estremamente rapidi su grandi set di dati, senza bisogno di infrastrutture complesse. Pinecone è molto utilizzato in ambiti che richiedono scalabilità considerando che è disponibile in versione Cloud.
Per utilizzare Pinecone come dbms vettoriale è necessario iscriversi sul sito https://www.pinecone.io , una volta iscritto la prima cosa da fare è creare un indice vettoriale
Puoi farlo da interfaccia web, tramite API Rest oppure usando le librerie standard disponibili per moltissimi linguaggi di programmazione.
Vedremo come farlo in Python, come prima cosa copia la API_KEY e registrala tra le variabili di ambiente. Poi installa le librerie standard di pinecone con il comando:
pip install pinecone
Ora puoi creare il tuo primo programma phyton per interfacciarti con il dbms vettoriale.
Crea l'indice usando il seguente codice:
Ora che hai creato l'indice puoi iniziare ad archiviare i dati nel data base. Per farlo è necessario convertire il testo in embeddings, quindi dovrai interfacciarti con un modello di AI per la conversione di testo in embeddings, una volta convertito il testo potrai caricarlo nel dbms
Puoi usare il seguente codice
Ora che hai caricato gli embeddings puoi interrogare il dbms, per farlo dovrai preventivamente convertire anche la stringa di ricerca in vettore
Come puoi vedere gestire un dbms vettoriale usando Pinecone è relativamente semplice.
La ricerca vettoriale con Solr
Apache Solr, originariamente progettato per la ricerca full-text, ha recentemente integrato funzionalità per la ricerca vettoriale utilizzando tecniche come il cosine similarity o altre misure di distanza per il confronto tra vettori.
Questi i passi per implementare la ricerca vettoriale con Solr
Creazione del core e schema per gli embeddings
Inizia creando un nuovo core in Solr e definendo il tuo schema per includere un campo che possa contenere i vettori, Solr supporta vettori numerici utilizzando il tipo di campo VectorField, che permette di indicizzare vettori per la ricerca.
Come prima cosa aggiungi il tipo di dato VectorField
<fieldType name="VectorField" class="solr.DenseVectorField" vectorDimension="512" similarityFunction="cosine"/>
Poi aggiungi il campo “embedding”
<field name="embedding" type="VectorField" multiValued="false" indexed="true" stored="true"/>
In questo esempio, il campo embedding ha una dimensione di 512, che è tipica per modelli di embeddings come BERT o GPT.
Caricamento dei dati e degli embeddings
Una volta definito lo schema puoi caricare i tuoi dati in Solr insieme agli embeddings generati per ogni documento. Ogni documento avrà un campo contenente il vettore numerico generato da un modello di deep learning.
Esempio JSON per il caricamento di un documento con embeddings:
{ "id": "1", "text": "Questo è un esempio di documento", "embedding": [0.12, 0.98, ..., 0.45] }
Ricerca dei vicini più prossimi (nearest neighbors)
Solr utilizza algoritmi di nearest neighbors per la ricerca vettoriale, quando un utente inserisce una query, questa viene convertita in un embedding, e puoi eseguire una ricerca su Solr per trovare i documenti con embeddings simili.
Esempio di query Solr per la ricerca:
http://localhost:8983/solr/core_name/select?q={!knn f=embedding topK=10}embedding:[0.12, 0.98, …, 0.45]
In questa query abbiamo in input la rappresentazione vettoriale della query di ricerca (embedding) e la query vettoriale {!knn f=embedding topK=10} che cerca i 10 documenti più simili all'embedding fornito.
Solr restituirà i documenti con vettori più vicini, ordinati per rilevanza (score).
La ricerca vettoriale con mongoDB
A partire dalla versione 7 MongoDB ha introdotto funzionalità native per la ricerca vettoriale attraverso il suo servizio MongoDB Atlas Search. Questo permette di integrare la ricerca vettoriale direttamente in MongoDB senza bisogno di strumenti esterni.
Passi principali per implementare la ricerca vettoriale con MongoDB
Aggiungere un campo vettoriale
MongoDB permette di memorizzare gli embeddings come array numerici all'interno dei documenti. È possibile memorizzare ogni embedding generato come un array nel documento stesso.
Esempio di documento in MongoDB:
{ "_id": "1", "text": "Questo è un esempio di documento", "embedding": [0.12, 0.98, ..., 0.45] }
Creazione dell'indice vettoriale
MongoDB richiede di creare un indice vettoriale per consentire ricerche efficienti basate sugli embeddings. Puoi definire l'indice utilizzando il comando createIndex con il supporto di cosine similarity o L2 norm.
Esempio di comando per creare l'indice:
db.collection.createIndex( { "embedding": "vector" }, { "dimensions": 512, "similarity": "cosine" } )
In questo caso l'indice è creato sul campo embedding con 512 dimensioni e verrà utilizzata la distanza coseno per il calcolo della somiglianza.
Eseguire la query di ricerca vettoriale
Quando un utente inserisce una query, la frase o il contenuto viene convertito in un embedding, e puoi usare MongoDB per cercare i documenti con embeddings simili.
Esempio di query di ricerca vettoriale in MongoDB
db.collection.aggregate([ { $search: { "knnBeta": { "vector": [0.12, 0.98, ..., 0.45], "path": "embedding", "k": 10} } }])
Questa query utilizza l'operatore $search di MongoDB Atlas Search per eseguire una ricerca basata su nearest neighbors (knn).
La query restituirà i 10 documenti con embeddings più simili all'embedding fornito.
Il futuro della ricerca vettoriale e dell’AI
La ricerca vettoriale è destinata a diventare la base dei moderni sistemi di ricerca grazie alla sua capacità di comprendere il significato semantico dei dati.
Rende cosi possibile l'integrazione di nuove funzionalità avanzate, come la generazione automatica di risposte, la sintesi di informazioni e la ricerca predittiva.
Con l’AI in continua evoluzione, possiamo aspettarci miglioramenti significativi nella precisione e nella velocità della ricerca vettoriale.
Che te ne pare di questo articolo? Avevi mai sentito parla di ricerca vettoriale?
1 commento
Pingback: I Sistemi RAG - Retrieval-Augmented Generation