Dalle cenci alle ricchezze

Dai brandelli alla bellezza

10 Applicazioni della ricerca vettoriale per comprendere a fondo i tuoi dati e modelli

Rappresentazione artistica della ricerca vettoriale per l'esplorazione dei dati. Immagine generata da DALLE-3.

Con l’avvento dei grandi modelli linguistici (LLM), anche i motori di ricerca vettoriali hanno fatto la loro comparsa. I database vettoriali costituiscono la base dei sistemi di memoria a lungo termine per i LLM.

Trovando efficientemente informazioni rilevanti da passare come contesto al modello linguistico, i motori di ricerca vettoriali possono fornire informazioni aggiornate oltre il punto di taglio dell’allenamento e migliorare la qualità dell’output del modello senza necessità di un ulteriore affinamento. Questo processo, comunemente definito come retrieval augmented generation (RAG), ha portato alla ribalta la sfida algoritmica una volta esoterica della ricerca dei vicini più prossimi approssimata (ANN)!

In mezzo a tutto questo trambusto, si potrebbe pensare erroneamente che i motori di ricerca vettoriali siano inestricabilmente legati ai grandi modelli linguistici. Ma c’è molto di più da esplorare. La ricerca vettoriale ha una miriade di applicazioni potenti che vanno ben oltre il miglioramento di RAG per i LLM!

In questo articolo, vi mostrerò dieci delle mie applicazioni preferite della ricerca vettoriale per la comprensione dei dati, l’esplorazione dei dati, l’interpretabilità dei modelli e altro ancora.

Ecco le applicazioni che tratteremo, in ordine approssimativo di complessità crescente:

Ricerca di similarità delle immagini su immagini provenienti dall'Oxford-IIIT Pet Dataset (LICENZA). Immagine cortesia dell'autore.

Forse il punto di partenza più semplice è la ricerca di similarità delle immagini. In questo compito, si dispone di un dataset composto da immagini — che può essere qualsiasi cosa, da un album di foto personali a un enorme repository di miliardi di immagini catturate da migliaia di telecamere distribuite nel corso degli anni.

La configurazione è semplice: calcola gli embeddings per ogni immagine in questo dataset e genera un indice vettoriale di questi vettori di embedding. Dopo questo primo calcolo, non è richiesta ulteriore inferenza. Un ottimo modo per esplorare la struttura del tuo dataset è selezionare un’immagine dal dataset e interrogare l’indice vettoriale per i k vicini più simili, ovvero le immagini più simili. Ciò può fornire un’intuizione su quanto densamente lo spazio delle immagini è popolato intorno alle immagini di query.

Per ulteriori informazioni e codice funzionante, vedere qui.

Ricerca immagini inversa su un'immagine da Unsplash (cortesia di Mladen Šćekić) contro il dataset Oxford-IIIT Pet. Immagine cortesia dell'autore.

In una vena simile, un’estensione naturale della ricerca di similarità delle immagini è trovare le immagini più simili all’interno del dataset rispetto a un’immagine esterna. Questa può essere un’immagine dal tuo filesystem locale o un’immagine da internet!

Per eseguire una ricerca di immagini inversa, crei l’indice vettoriale per il dataset come nell’esempio di ricerca di similarità delle immagini. La differenza avviene durante l’esecuzione, quando calcoli l’embedding per l’immagine di query e interroghi il database vettoriale con questo vettore.

Per ulteriori informazioni e codice funzionante, vedere qui.

Ricerca di similarità degli oggetti per pecore nel dataset COCO-2017 (LICENSE). Immagine cortesia dell'autore.

Se vuoi approfondire il contenuto delle immagini, allora la ricerca di similarità degli oggetti o dei “patch” potrebbe essere ciò che stai cercando. Un esempio di ciò è la re-identificazione delle persone, in cui hai un’unica immagine con una persona di interesse e desideri trovare tutte le istanze di quella persona nel tuo dataset.

La persona potrebbe occupare solo piccole parti di ogni immagine, quindi gli embeddings per le intere immagini in cui si trovano potrebbero dipendere fortemente dagli altri contenuti di queste immagini. Ad esempio, potrebbero esserci più persone in un’immagine.

Una soluzione migliore è trattare ogni patch di rilevamento degli oggetti come se fosse un’entità separata e calcolare un embedding per ognuno. Quindi, crea un indice vettoriale con questi embeddings di patch e esegui una ricerca di similarità verso una patch della persona che desideri re-identificare. Come punto di partenza potresti voler provare a utilizzare un modello ResNet.

Due sottigliezze in questo caso:

  1. Nell’indice vettoriale, è necessario archiviare i metadati che associano ciascuna patch all’immagine corrispondente nel dataset.
  2. Dovrai eseguire un modello di rilevamento degli oggetti per generare queste patch di rilevamento prima di istanziare l’indice. Potresti anche voler calcolare gli embeddings di patch solo per determinate classi di oggetti, come persona, e non per altri – sedia, tavolo, ecc.

Per ulteriori informazioni e codice funzionante, vedere qui.

Ricerca sfumata/semantica attraverso blocchi di testo generati dal motore di OCR Tesseract sulle pagine della mia tesi di dottorato. Embeddings calcolati utilizzando il modello GTE-base. Immagine cortesia dell'autore.

L’Optical Character Recognition (OCR) è una tecnica che consente di digitalizzare documenti come appunti scritti a mano, vecchi articoli di giornale, documenti medici e quelle lettere d’amore nascoste nel tuo armadio. I motori OCR come Tesseract e PaddleOCR lavorano identificando i singoli caratteri e simboli nelle immagini e creando “blocchi” di testo contigui, simili ai paragrafi.

Una volta ottenuto questo testo, è possibile effettuare ricerche tradizionali con parole chiave sulla base dei blocchi di testo previsti, come illustrato qui. Tuttavia, questo metodo di ricerca è suscettibile a errori di un solo carattere. Se il motore OCR riconosce erroneamente una “l” come un “1”, una ricerca di parole chiave per “controllo” fallirebbe (che ironia!).

Potremmo superare questa sfida utilizzando la ricerca vettoriale! Incorporiamo i blocchi di testo utilizzando un modello di embedding del testo come GTE-base dalla libreria Sentence Transformers di Hugging Face e creiamo un indice vettoriale. Possiamo quindi effettuare ricerche fuzzy e/o semantiche sui nostri documenti digitalizzati incorporando il testo di ricerca e interrogando l’indice. A un livello superiore, i blocchi di testo all’interno di questi documenti sono analoghi alle patch di rilevamento oggetti nelle ricerche di similarità degli oggetti!

Per ulteriori informazioni e codice funzionante, consulta qui.

Ricerca semantica dell'immagine utilizzando il linguaggio naturale sul set di convalida COCO 2017. Immagine gentilmente concessa dall'autore.

Con modelli multimodali, possiamo estendere il concetto di ricerca semantica dal testo alle immagini. Modelli come CLIP, OpenCLIP e MetaCLIP sono stati addestrati per trovare rappresentazioni comuni di immagini e didascalie, in modo che il vettore di embedding per un’immagine di un cane sia molto simile al vettore di embedding per la frase di testo “una foto di un cane”.

Ciò significa che è sensato (cioè “permesso”) creare un indice vettoriale utilizzando gli embedding di CLIP per le immagini nel nostro dataset e quindi eseguire una query di ricerca vettoriale in questo database vettoriale in cui il vettore di query è l’embedding di CLIP di una frase di testo.

💡 Trattando i singoli fotogrammi di un video come immagini e aggiungendo l’embedding di ciascun fotogramma a un indice vettoriale, è anche possibile effettuare una ricerca semantica attraverso i video!

Per ulteriori informazioni e codice funzionante, consulta qui.

Recupero cross-modale

Il recupero cross-modale di immagini che corrispondono a un file audio di un treno. Implementato utilizzando ImageBind con un indice vettoriale Qdrant, sul set di convalida COCO 2017. Video gentilmente concesso dall’autore.

In un certo senso, la ricerca semantica in un dataset di immagini è una forma di recupero cross-modale. Un modo di concepire questa idea è che stiamo recuperando immagini corrispondenti a una query di testo. Con modelli come ImageBind, possiamo fare un passo avanti!

ImageBind incorpora dati provenienti da sei diverse modalità nello stesso spazio di embedding: immagini, testo, audio, profondità, termico e unità di misura inerziale (IMU). Ciò significa che possiamo generare un indice vettoriale per i dati in una qualsiasi di queste modalità e interrogare questo indice con un campione di un’altro tipo di modalità. Ad esempio, possiamo prendere un clip audio di un clacson e recuperare tutte le immagini di auto!

Per ulteriori informazioni e codice funzionante, consulta qui.

Sonda sulla somiglianza percettiva

Una parte molto importante della storia della ricerca vettoriale che abbiamo solo accennato finora è il modello. Gli elementi del nostro indice vettoriale sono embedding da un modello. Questi embedding possono essere l’output finale di un modello di embedding personalizzato, oppure possono essere rappresentazioni nascoste o latenti da un modello addestrato su un altro compito come la classificazione.

Indipendentemente da ciò, il modello che utilizziamo per incorporare i nostri campioni può avere un impatto significativo su quali campioni vengono considerati più simili ad altri campioni. Un modello CLIP cattura concetti semantici, ma fatica a rappresentare informazioni strutturali all’interno delle immagini. D’altra parte, un modello ResNet è molto bravo a rappresentare la similarità nella struttura e nella disposizione, operando a livello di pixel e patch. Poi ci sono modelli di incorporamento come DreamSim, che mirano a colmare il divario e catturare una similarità di livello medio, allineando la nozione di similarità del modello con ciò che è percepito dagli esseri umani.

La ricerca vettoriale fornisce un modo per indagare su come un modello “vede” il mondo. Creando un indice vettoriale separato per ogni modello che ci interessa (sullo stesso set di dati), possiamo sviluppare rapidamente un’intuizione su come i diversi modelli stanno rappresentando i dati internamente.

Ecco un esempio che mostra le ricerche di similarità con gli incorporamenti dei modelli CLIP, ResNet e DreamSim per la stessa immagine di query nel dataset delle NOTTI:

Ricerca di similarità con incorporamenti ResNet50 su un'immagine nel dataset delle NOTTI (Immagini generate da Stable Diffusion — MIT RAIL LICENSE). I modelli ResNet operano a livello di pixel e patch. Pertanto, le immagini recuperate sono simili strutturalmente alla query ma non sempre semanticamente simili.
Ricerca di similarità con incorporamenti CLIP sulla stessa immagine di query. I modelli CLIP rispettano la semantica sottostante delle immagini ma non il loro layout.
Ricerca di similarità con incorporamenti DreamSim sulla stessa immagine di query. DreamSim colma il divario, cercando il miglior compromesso di similarità di livello medio tra le caratteristiche semantiche e strutturali.

Per ulteriori informazioni e il codice funzionante, vedi qui.

Confronto delle rappresentazioni del modello

Confronto euristico delle rappresentazioni dei modelli ResNet50 e CLIP del dataset delle NOTTI. Gli incorporamenti ResNet sono stati ridotti a 2D usando UMAP. Selezionando un punto nel grafico degli incorporamenti e evidenziando i campioni vicini, possiamo vedere come ResNet cattura la similarità compositiva e della tavolozza, ma non la similarità semantica. Eseguendo una ricerca vettoriale sul campione selezionato con gli incorporamenti CLIP, possiamo vedere che la maggior parte dei campioni secondo CLIP non è localizzata secondo ResNet.

Possiamo ottenere nuove intuizioni sulle differenze tra due modelli combinando la ricerca vettoriale e le tecniche di riduzione di dimensionalità come la rappresentazione manifolds uniforme (UMAP). Ecco come:

Ogni embedding del modello contiene informazioni su come il modello rappresenta i dati. Utilizzando UMAP (o t-SNE o PCA), possiamo generare rappresentazioni dimensionalmente inferiori (2D o 3D) degli embedding da modello1. In questo modo, sacrificiamo alcuni dettagli, ma speriamo di preservare alcune informazioni su quali campioni vengono considerati simili ad altri campioni. Quello che guadagniamo è la capacità di visualizzare questi dati.

Con la visualizzazione degli embedding da modello1 come sfondo, possiamo scegliere un punto in questo grafico e eseguire una query di ricerca vettoriale su quel campione rispetto agli embedding di modello2. Puoi quindi vedere dove si trovano i punti recuperati all’interno della visualizzazione 2D!

L’esempio sopra utilizza lo stesso set di dati NIGHTS della sezione precedente, visualizzando gli embedding ResNet, che catturano una maggiore similarità compositiva e strutturale, e eseguendo una ricerca di similarità con gli embedding CLIP (semantici).

Interpolazione di concetti

Interpolazione tra i concetti “husky” e “chihuahua” con gli embedding CLIP sul dataset Oxford-IIIT Pet

Siamo arrivati alla fine delle dieci applicazioni, ma per fortuna ho riservato le migliori per ultime. Finora, abbiamo lavorato solo con vettori di embedding: l’indice del vettore è popolato con embedding e i vettori di query sono anch’essi embedding. Ma a volte c’è una struttura aggiuntiva nello spazio degli embedding che possiamo sfruttare per interagire con i nostri dati in modo più dinamico.

Un esempio di tale interazione dinamica è qualcosa che mi piace chiamare “interpolazione di concetti”. Ecco come funziona: prendi un set di dati di immagini e genera un indice vettoriale utilizzando un modello multimodale (testo e immagine). Scegli due prompt di testo come “soleggiato” e “piovoso”, che rappresentano concetti, e imposta un valore alpha nell’intervallo [0,1]. Possiamo generare i vettori di embedding per ogni concetto di testo e aggiungere questi vettori in una combinazione lineare specificata da alpha. Normalizziamo quindi il vettore e lo usiamo come query per il nostro indice vettoriale di embedding delle immagini.

Poiché stiamo interpolando linearmente tra i vettori di embedding per i due prompt di testo (concetti), in un senso molto ampio stiamo interpolando tra i concetti stessi! Possiamo cambiare dinamicamente alpha e interrogare il nostro database di vettori ogni volta che c’è un’interazione.

💡Questo concetto di interpolazione di concetti è sperimentale (ovvero non sempre un’operazione ben definita). Ho scoperto che funziona meglio quando i prompt di testo sono concettualmente correlati e il dataset è abbastanza diversificato da generare risultati diversi lungo lo spettro dell’interpolazione.

Per ulteriori informazioni e codice funzionante, consulta qui.

Attraversamento dello spazio dei concetti

Attraversamento dello spazio dei ”concetti” spostandosi nella direzione di vari prompt di testo tramite i loro embedding, illustrato per il set di test del dataset COCO 2017. Immagini e testo incorporati con un modello CLIP. Immagine cortesia dell'autore.

Infine, ma non meno importante, abbiamo quello che mi piace chiamare “attraversamento dello spazio dei concetti”. Come per l’interpolazione di concetti, inizia con un set di dati di immagini e genera embedding con un modello multimodale come CLIP. Successivamente, seleziona un’immagine dal set di dati. Questa immagine sarà il punto di partenza, da cui “attraverserai” lo spazio dei concetti.

A partire da lì, puoi definire una direzione in cui desideri muoverti fornendo una stringa di testo come sostituto di un concetto. Imposta la magnitudine del “passo” che desideri compiere in quella direzione e il vettore di embedding di quella stringa di testo (con un coefficiente moltiplicativo) verrà aggiunto al vettore di embedding dell’immagine iniziale. Il vettore “destinazione” verrà utilizzato per interrogare il database di vettori. Puoi aggiungere arbitrariamente molti concetti in quantità arbitrarie e osservare come l’insieme di immagini recuperate si aggiorna in tempo reale.

Come con l’interpolazione dei concetti, questo processo non è sempre ben definito. Tuttavia, lo trovo affascinante e funziona abbastanza bene quando il coefficiente applicato alle incapsulazioni di testo è abbastanza elevato da essere sufficientemente preso in considerazione.

Per ulteriori informazioni e codice funzionante, vedi qui.

Conclusioni

I motori di ricerca vettoriali sono strumenti incredibilmente potenti. Sicuramente, sono le star dello spettacolo migliore in città, RAG-time. Ma i database vettoriali sono molto più versatili di così. Permettono una comprensione più approfondita dei dati, forniscono un’idea di come i modelli rappresentano quei dati e offrono nuove possibilità per interagire con i dati.

I database vettoriali non sono legati solo agli LLM. Si dimostrano utili ogni volta che sono coinvolti gli incapsulamenti e gli incapsulamenti si trovano proprio all’intersezione di modelli e dati. Più rigorosamente comprendiamo la struttura degli spazi di incapsulamento, più dinamiche e pervasiva diventeranno le nostre interazioni tra dati e modelli abilitate dalla ricerca vettoriale.

Se hai trovato interessante questo articolo, potresti voler dare un’occhiata anche a questi articoli alimentati dalla ricerca vettoriale: