Il Mondo Nascosto degli Indici (Vettoriali)

Il Mondo Segreto degli Indici (Vettoriali)

Tutto quello che hai sempre voluto sapere sugli indici (vettoriali) ma hai avuto paura di chiedere.

Dalla pubblicazione di ChatGPT, è passato appena un giorno senza nuovi contenuti che discutono di LLM, RAG e database vettoriali. Il mondo della tecnologia rimbomba delle possibilità offerte da LLM, considerata l’ultima tecnologia che cambierà le nostre vite: per il meglio per alcuni, per il peggio per altri. Accanto a loro, Retrieval Augmented Generation (RAG) è emerso come una soluzione dinamica per adattarsi al panorama in continua evoluzione della conoscenza. Ma dietro le quinte c’è un attore cruciale: gli indici e i database vettoriali.

Mentre LLM, RAG e database vettoriali vengono intensamente dibattuti, gli (indici) vettoriali che alimentano queste innovazioni sono meno conosciuti. In questo articolo, demistificheremo il concetto di indici per aiutarti a capire come un indice rende semplice trovare informazioni in vastissime collezioni.

1. Cos’è un indice?

Tutti abbiamo affrontato una situazione del genere. Hai un appuntamento con la tua amica a casa sua. L’unica informazione che ti ha dato è “Vivo nel quartiere Metro Town”. Quando arrivi nel suddetto quartiere Metro Town:

Foto di Manson Yim su Unsplash

Bene, senza aiuti, trovare il suo posto richiederà un po’ di tempo! Se solo ci fosse una mappa all’ingresso…

Ecco esattamente di cosa si tratta un indice: come trovare rapidamente dove si trovano le persone (o i dati).

Yellow Pages sono un indice che ti permette di trovare il domicilio delle persone in base ai loro nomi.

Un indice è una struttura dati creata per migliorare la velocità delle operazioni di recupero dei dati. In altre parole, è il modo in cui si organizzano le informazioni in modo da poter trovare rapidamente ciò che si sta cercando.

I dati vengono indicizzati utilizzando delle chiavi. L’ordine è basato sulle chiavi, e si possono utilizzare più chiavi. Nelle Pagine Gialle, la prima chiave è il cognome e la seconda è il nome di battesimo.

L’indice non memorizza necessariamente tutti i dati. Si concentra solo sulle parti critiche utilizzate per localizzare rapidamente e accedere a particolari dati all’interno dell’intero insieme di dati.

L’indice alla fine del libro è un buon esempio: ti mostra dove trovare le pagine utilizzando la parola, per cui mappa ogni parola ai numeri di pagina e non alle frasi stesse.

Gli indici sono alla base dei motori di ricerca e dei database: svolgono un ruolo cruciale nel migliorare l’efficienza e la velocità delle operazioni di recupero dei dati.

La scelta di come organizzare i dati è fondamentale e dipende dal contesto.

Ad esempio, nell’esempio delle Pagine Gialle, se gli indici fossero organizzati in base ai numeri di telefono invece che ai nomi, e tu conoscessi solo i nomi, trovare i loro indirizzi sarebbe abbastanza complicato!

Le informazioni sono lì; alla fine le troverai, ma il tempo richiesto ti impedirà persino di provare. D’altra parte, utilizzando le Pagine Gialle, con un solo sguardo alla pagina sai esattamente se devi guardare indietro o avanti! L’ordine lessicografico ti permette di effettuare una ricerca approssimativamente logaritmica. Ecco perché la scelta dell’indice è essenziale.

In generale, un indice ha uno scopo molto preciso: può essere progettato per eseguire inserimenti o recupero rapido dei dati o una query più esotica come una query di intervallo (“recupera tutti i dati compresi tra il 1° maggio e il 15 agosto di quest’anno”). La scelta dell’operazione da ottimizzare determinerà l’aspetto dell’indice.

La principale differenza tra i database di elaborazione delle transazioni online (OLTP) e di elaborazione analitica online (OLAP) è la scelta delle operazioni che si desidera ottimizzare: OLTP si concentra sulle operazioni sulle righe (come l’aggiornamento di una voce), mentre l’altro è rivolto alle operazioni sulle colonne (come il calcolo di una media ad esempio). I due database non utilizzeranno gli stessi indici poiché non puntano alle stesse operazioni.

1.1 Qual è la differenza tra indici e strutture dati?

💡Una struttura dati è un modo per organizzare e memorizzare i dati in un computer in modo che possano essere accessati e manipolati in modo efficiente. Spiegato in questo modo, la differenza tra indici e strutture dati è a volte difficile da vedere, quindi qual è la differenza? Gli indici si concentrano sull’inserimento, sulla ricerca, sulla classificazione o sul filtraggio dei dati. Le strutture dati sono più generiche.

Gli indici vengono costruiti utilizzando le strutture dati ma di solito non memorizzano i dati stessi.

Se si considera un database di film, non si desidera spostare grandi file ogni volta che l’indice viene aggiornato: si memorizza un puntatore al file, non il file stesso. Un puntatore può essere visto come l’indirizzo del file sul disco.

Ora che hai un’idea generale di cosa sia un indice, concentriamoci su esempi numerici. Ecco alcuni indici comuni (numerici):

  • Indice invertito
  • Indici hash
  • Alberi B
  • Località-Sensitive-Hashing (LSH).

Per capire meglio come funzionano gli indici, esploriamo uno dei più elementari: l’indice invertito.

1.2 Indice invertito

L’indice invertito è un indice standard utilizzato nei motori di ricerca.

È progettato per trovare rapidamente dove si trova l’informazione: mira ad ottimizzare il tempo di recupero.

In poche parole, un indice invertito mappa i contenuti alle loro posizioni, un po’ come l’indice di un libro. Spesso viene utilizzato per mappare una caratteristica ai dati che la possiedono.

Ad esempio, supponiamo di voler sapere chi vive nello stesso edificio.

Innanzitutto, si dovrebbe avere una tabella in cui, per ogni nome, si ha l’edificio (la tabella che avrebbe aiutato a trovare Alice):

Questa tabella viene aggiornata ogni volta che una persona arriva o lascia il distretto.

Se si vuole trovare chi vive nell’edificio B in questa tabella, si deve scorrere l’intera tabella.

Pur essendo tecnicamente possibile, non sarà scalabile poiché il tempo di calcolo aumenterà linearmente con la dimensione della tabella.

Pensa al numero di appartamenti nel distretto: se si vuole trovare tutte le persone che vivono nell’edificio B controllando tutti i profili uno per uno, ci vorrà un po’ di tempo!

Un’altra soluzione è utilizzare un indice invertito: si mantiene una tabella in cui gli edifici vengono utilizzati come chiavi e collegati alle persone che vi abitano:

Questa tabella viene mantenuta contemporaneamente alla precedente: il costo di aggiungere o rimuovere una nuova persona è leggermente superiore rispetto prima, ma il tempo di recupero si è ridotto a quasi nulla!

Per trovare chi vive nell’edificio B, è sufficiente accedere alla riga corrispondente “Building B” di questa tabella ed ecco il risultato!

Una ricerca inversa di un numero di telefono è un indice inverso di numeri di telefono!

In pratica, gli indici invertiti sono un po’ più complessi poiché manipolano dati più complessi rispetto a una coppia (utente, interesse). Gli indici sono tipicamente memorizzati come tabelle hash.

Nonostante la loro relativa semplicità, gli indici invertiti sono tra i più comuni indici utilizzati nei motori di ricerca.

1.3 Indici e Database

I database sono costruiti su indici. Gli indici migliorano il recupero dei dati nel database memorizzando puntatori o riferimenti ai dati del database. Non memorizza i dati effettivi, ma serve come mezzo per accedervi rapidamente, migliorando significativamente le prestazioni delle query.

Il database è più di un indice in quanto è un sistema completo per la gestione dei dati. Memorizza, organizza e gestisce i dati effettivi, garantisce l’integrità dei dati, gestisce le transazioni e fornisce una gamma di funzionalità oltre all’indicizzazione, rendendolo un hub centrale per la memorizzazione e la manipolazione dei dati. Sebbene gli indici velocizzino il recupero dei dati all’interno dei database, i database fungono da ecosistema completo per la memorizzazione, la gestione e il recupero dei dati.

In sintesi, gli indici sono come segnali stradali in un database, indicando la strada per i dati che cerchi. Al contrario, i database sono i depositi dove si trovano effettivamente i dati e sono dotati di vari strumenti e funzionalità per gestire e manipolare quei dati.

A seconda del tuo caso d’uso, potresti non aver bisogno di un intero database ma solo degli indici, poiché l’overlay che gestisce i dati potrebbe essere costoso.

2. Indici vettoriali e database vettoriali

2.1 Che cos’è un indice vettoriale?

In poche parole, un indice vettoriale è un indice in cui le chiavi sono vettori.

Nel nostro esempio di indice invertito, le chiavi erano parole (hobby e nomi). Negli indici vettoriali, manipoliamo vettori: sequenze di numeri di dimensione fissa.

Due vettori di dimensione 4.

Lo so, lo so, posso sentirti dire: “sono negato in matematica, non voglio usare i vettori”.

Non preoccuparti, non devi essere bravo in matematica per capire gli indici vettoriali.

Tutto quello che devi sapere è che l’utilizzo dei vettori ti permette di fare affidamento su operazioni potenti ed ottimizzate.

La prima domanda che potresti farti è: “Cosa c’è di interessante nei tuoi vettori”?

Supponiamo che tu abbia finalmente trovato Alice a casa sua e ora vuoi trovare qualcosa da mangiare. Potresti voler trovare il ristorante più vicino. Cerchi un elenco di ristoranti e finisci con una tabella di ristoranti, specialità e indirizzi. Diamo un’occhiata alle informazioni che puoi trovare:

Questo non sembra utile, vero? La tua unica opzione è scorrere l’elenco, leggere gli indirizzi uno ad uno e valutare manualmente quanto è vicino a te. Potremmo provare a automatizzare la classificazione del luogo più vicino, ma calcolare le distanze basate sugli indirizzi grezzi è difficile (due strade potrebbero essere vicine ma avere nomi diversi).

Tuttavia, immagina ora di avere una tabella con le posizioni GPS che rappresentano la latitudine e la longitudine esatta di ogni ristorante:

Ogni posizione è un vettore di dimensione 2. Con quei vettori, puoi facilmente calcolare la distanza dalla tua posizione con una semplice – e veloce – operazione matematica. Quindi puoi rapidamente recuperare quelli più vicini, in altre parole, quelli con la distanza più piccola da te!

Ora puoi trovare facilmente il ristorante più vicino a te!

Il punto interessante è che indicizzando direttamente la tabella con il vettore (la posizione GPS in questo esempio), possiamo ottimizzare l’indice in modo che trovare le voci con la distanza più bassa risulti estremamente veloce.

Gli indici vettoriali sono indici specializzati progettati per recuperare in modo efficiente vettori che sono più vicini, o più simili, a un dato vettore. Questi indici si basano su operazioni matematiche ottimizzate per identificare in modo efficiente i vettori più simili.

Nel nostro esempio, la distanza utilizzata era la distanza classica, ma esistono indici per tutte le distanze o similarità esistenti, come la metrica di similarità del coseno.

Locality Sensitive Hashing (LSH) è uno degli indici più ampiamente utilizzati per trovare i k punti dati più simili in un dataset e funziona con diverse distanze o similarità.

“È bello, ma non sto usando vettori nel mio database”.

Questa è la parte entusiasmante: puoi trasformare qualsiasi cosa in un vettore.

Semplicemente prendere la rappresentazione binaria sarebbe inefficiente poiché potrebbe contenere rumore, quindi è essenziale trovare una rappresentazione che preservi le caratteristiche dei dati.

Rappresentare diverse informazioni come un vettore per utilizzare gli indici dei vettori è diventato un modo standard per migliorare l’efficienza di un sistema. La vettorizzazione è diventata un’arte.

Ad esempio, se hai un dataset di immagini e vuoi un database in cui puoi trovare le immagini più simili a una data, puoi utilizzare il descrittore SIFT delle immagini.

2.2 Qual è la differenza tra gli indici vettoriali e i database vettoriali?

La differenza tra gli indici vettoriali e i database vettoriali è la stessa differenza tra gli indici e i database: gli indici servono semplicemente per trovare rapidamente dove si trovano i dati, mentre i database vettoriali utilizzano gli indici vettoriali per eseguire le query di recupero velocemente, ma conservano e gestiscono anche i dati fornendo operazioni e proprietà aggiuntive.

3. Qual è il legame tra LLM e RAG?

Ora che hai imparato sugli indici vettoriali, potresti chiederti perché così tante discussioni su LLM e RAG abbiano anche discusso di indici vettoriali. Per capire il motivo, spieghiamo prima rapidamente cosa sia la Generazione Arricchita con Recupero, o RAG. AG funge da soluzione intelligente per una delle limitazioni intrinseche di LLM, ovvero la loro conoscenza limitata.

LLM sono consapevoli solo dei dati su cui sono stati addestrati. Una tecnica per aumentare la loro conoscenza è l’ingegneria delle prompt, in cui vengono integrati dati aggiuntivi nella richiesta: “Dati questi dati {data}, rispondi a questa domanda: {domanda}”.

Sebbene sia efficace, questo approccio affronta una nuova sfida: la scalabilità. Non solo la dimensione del prompt è limitata, ma più dati includi, più costosa diventa la query.

Per superare questo problema, la Generazione Arricchita con Recupero limita la quantità di dati inserendo solo i dati più simili, ed è qui che entrano in gioco gli indici vettoriali!

Ecco come funziona: tutti i documenti vengono inizialmente trasformati in vettori utilizzando LLM (1). Per essere più specifici, viene utilizzata la parte di codifica di LLM.

Questi vettori vengono utilizzati come chiavi per indicizzare i documenti in un indice vettoriale (2).

Nel caso di una query, la query viene vettorizzata utilizzando LLM (3). Il vettore risultante viene quindi cercato nell’indice vettoriale per recuperare i documenti più simili (4). Questi documenti vengono quindi utilizzati per rispondere alla query utilizzando l’ingegneria delle prompt (5).

Ecco fatto!

Come puoi vedere, similmente a LLM, l’indice vettoriale ricopre un ruolo centrale in RAG.

Alcune persone preferiscono utilizzare un database vettoriale invece di un indice vettoriale. Va bene ogni volta che si desidera riutilizzare gli stessi dati in più applicazioni. Tuttavia, se la tua preoccupazione principale è l’efficienza del recupero o la flessibilità nella definizione dell’indice per ciascuna applicazione, un singolo indice vettoriale è spesso più semplice e più veloce da implementare.

Conclusione

Congratulazioni ai coraggiosi che hanno letto fino a qui! Credo che ora tu abbia tutte le conoscenze di base per partecipare a queste appassionate discussioni su LLM e RAG.

Gli indici hanno un ruolo centrale nel recupero dei dati. Poiché il recupero dei dati è destinato a rimanere una componente chiave delle tecnologie dei dati, è fondamentale comprendere cosa sono gli indici, compresi gli indici vettoriali.

Se vuoi imparare su indici più avanzati, ti consiglio di leggere il mio articolo su LSH. Se invece vuoi imparare qualcosa di più pratico e desideri sperimentare in prima persona la Generazione Arricchita con Recupero in tempo reale (RAG), considera di esplorare l’app LLM, dove puoi sperimentare la potenza di queste tecnologie.