Retrieval, Embeddings, RAG

Da Wiki AI.

Nonostante si sappia che il meccanismo di generazione dei modelli di linguagigo è probabilistico ed esista un rischio di allucinazioni, è possibile porre a GPT e agli altri LLM domande puntuali su un'enorme varietà di argomenti: essi spesso fornisco delle risposte esaustive e dettagliate.[1]

Risulta però praticamente impossibile sfruttare le capacità di ragionamento e tutte le altre abilità emergenti di questi modelli per:

  1. rispondere a domande ed elaborare informazioni proprietarie, che per definizione non sono mai state viste dal modello durante l'addestramento, che deve necessariamente avvenire su dati pubblici
  2. rispondere a domande puntuali su argomenti di nicchia, o poco diffusi: il rischi di allucinazione è, ovviamente, inversamente proporzionale alla frequenza con la quale una determinata informazione si trova negli enormi dataset di addestramento

Retrieval Augmented Generation (RAG)

I modelli di linguaggio sono molto bravi a trattare ed elaborare fornite all'interno del contesto: si pensi al few-shot prompting nel quale questi modelli non solo riescono ad utilizzare l'informazione fornita durante l'inferenza, ma riescono addirittura ad imparare (meta-learning) come applicare lo specifico pattern ad esempi non ancora risolti.

La modalità più comune per ovviare ai problemi citati nell'introduzione, è la cosidetta Retrieval Augmented Generation, o RAG, il cui nome sta a indicare l'utilizzo di un modello generativo, ma aumentato dal preventivo recupero (o estrazione) di informazioni utili per rispondere alla domanda o per risolvere il problema, che vengono incluse nel contesto, ovvero nel prompt.

Esempio di Sistema RAG

Prendiamo come esempio pratico un assistente in grado di rispondere a domande sulle regioni italiane, partendo da una base di conoscenza che contiene informazioni su territori, popolazione, cultura e attrazioni turistiche.

  1. Il primo componente essenziale è la knowledge base, o corpus, ovvero l'insieme dei documenti sui quali vogliamo che il modello basi le sue risposte. Nel nostro esempio, ogni documento è un testo strutturato che un piatto tipico di una città o regione italiana. Questa base di conoscenza potrebbe essere ampliata con documenti provenienti da diverse fonti: pagine web, database interni, documenti PDF o qualsiasi altra fonte testuale pertinente.
  2. Il secondo componente è il sistema di retrieval, che deve essere in grado di identificare e recuperare i documenti più rilevanti per una determinata query.
  3. Il terzo componente è un modello di generazione del testo, dove il modello di linguaggio genera una risposta basandosi sul contesto recuperato. Il prompt viene costruito combinando:
    • Il documento/i (o parti di docomenti) recuperati dalla knowledge base
    • La query originale dell'utente
    • Eventuali istruzioni aggiuntive per il modello, in cui normalmente si spiega al modello che deve rispodere alla query dell'utente utilizzando solo il testo fornito

Primo Componente: la Knowledge Base

La knowledge base rappresenta il cuore di un sistema RAG: è l'insieme di informazioni su cui il modello baserà le sue risposte. Mentre nel nostro esempio abbiamo utilizzato brevi frasi su specialità regionali, nella pratica la knowledge base può assumere forme molto diverse. Può contenere documenti di ogni tipo e lunghezza: manuali tecnici, articoli scientifici, documentazione di prodotto, email, conversazioni di chat o post sui social media. I documenti più lunghi vengono tipicamente suddivisi in "chunk" (frammenti) più piccoli e gestibili, usando tecniche che preservano il contesto: per esempio, un documento di 1000 parole potrebbe essere diviso in chunk sovrapposti di 100 parole ciascuno, con 50 parole di sovrapposizione tra chunk consecutivi per mantenere la continuità del discorso.

La knowledge base può anche essere multimodale. Oltre al testo, è possibile indicizzare immagini associandole a descrizioni testuali o utilizzando modelli specializzati che generano embedding visivi. Questo permette di recuperare non solo testi rilevanti ma anche immagini pertinenti alla query. Per esempio, in un sistema RAG per un catalogo di prodotti, una query sulla "texture di un tessuto" potrebbe recuperare sia descrizioni testuali che immagini dei campioni di tessuto. Alcuni sistemi più avanzati supportano anche contenuti audio e video, trasformandoli in rappresentazioni vettoriali che catturano le caratteristiche salienti del contenuto multimediale.

La qualità e l'organizzazione della knowledge base sono importantissimi per l'efficacia del sistema: documenti ben strutturati, aggiornati e rilevanti sono il motivo più importante per cui il sistema dà risposte più accurate e utili. Per questo motivo, la gestione della knowledge base spesso include processi di pulizia dei dati, deduplicazione, aggiornamento automatico e monitoraggio della qualità dei contenuti.

Secondo Componente: Il Sistema di Retrieval

Il sistema di retrieval, il cui compito è trovare le informazioni del corpus che sono più attinenti a una determinata query, può implementare diverse strategie di ricerca, che vanno dalle più semplici alle più sofisticate.

Partiamo dalle tecniche elementari fino ad arrivare a quelle più sofisticate.

La keyword search è l'approccio più basilare: cerca le parole esatte della query nei documenti. Ad esempio, per la domanda "Qual è il capoluogo della Toscana?", cercherà documenti che contengono le parole "capoluogo" e "Toscana". Questo metodo, seppur semplice, mostra evidenti limiti: non coglie sinonimi o relazioni semantiche (la query "Quale città governa la regione toscana?" non troverebbe corrispondenze).

Embedding vicini alla parola "Guitar" in Word2Vec (https://projector.tensorflow.org/)

Un primo livello di astrazione è fornito dall'approccio bag of words con TF-IDF (Term Frequency-Inverse Document Frequency). Questa tecnica considera ogni documento come un vettore dove ogni dimensione rappresenta la frequenza di una parola, pesata per la sua rarità nel corpus. Questo permette di identificare i termini più caratterizzanti e discriminanti di ogni documento. Per esempio, in un documento sulla Toscana, parole come "Firenze" o "Uffizi" avranno un peso maggiore rispetto a termini comuni come "città" o "regione", che sono molto frequenti ma al contempo comuni a gran parte dei documenti del corpus.

Le tecniche moderne si basano sulla vector search: i testi vengono trasformati in embedding vettoriali che catturano il significato semantico in uno spazio multidimensionale. Un modello come sentence-transformers codifica sia la query che i documenti in vettori di centinaia di dimensioni, dove la vicinanza nello spazio vettoriale corrisponde alla similarità semantica. La query "Dove posso ammirare il David di Michelangelo?" troverà corrispondenza con documenti che parlano della Galleria dell'Accademia di Firenze, anche se non contengono le parole esatte della domanda.

L'approccio più robusto è quello ibrido, che combina vector search e keyword matching. Per esempio, si può:

  1. Utilizzare la ricerca vettoriale per identificare i documenti semanticamente rilevanti
  2. Riordinare i risultati dando priorità a quelli che contengono anche keyword esatte
  3. Eventualmente escludere documenti che non contengono almeno una parola chiave essenziale

Per valutare l'efficacia di questi sistemi di retrieval, una metrica fondamentale è il Mean Reciprocal Rank (MRR): esso calcola il reciproco del rango della prima risposta corretta, mediato su tutte le query.

Quando si implementa un sistema RAG utilizzando modelli di retrieval esistenti, è fondamentale verificarne l'accuratezza (MRR) sul tipo specifico di documenti che caratterizzano il nostro dominio applicativo e sulla lingua di interesse. Per una valutazione rigorosa, è consigliabile creare un dataset di test ad-hoc, annotato secondo i nostri criteri di rilevanza: questo ci permetterà di misurare quanto il sistema sia effettivamente capace di recuperare le informazioni nel modo più appropriato per il nostro caso d'uso specifico.

Gli Embedding: Rappresentazioni Dense del Significato

Gli embedding sono rappresentazioni vettoriali "dense" del significato di parole o frasi: ogni testo viene trasformato in un vettore di numeri (tipicamente centinaia di dimensioni) dove ogni dimensione contribuisce a catturare qualche aspetto semantico del significato. A differenza delle rappresentazioni sparse come TF-IDF, dove ogni dimensione corrisponde a una singola parola del vocabolario, negli embedding ogni dimensione rappresenta una complessa combinazione di caratteristiche semantiche.

Per intuire come funzionano, pensiamo a come un embedding cattura le relazioni tra parole [2]:

  • La parola "medico" sarà vicina nello spazio vettoriale a "dottore", "chirurgo", "ospedale"
  • La parola "Firenze" sarà vicina a "Toscana", "Uffizi", "Rinascimento"
  • Ancora più interessante, gli embedding catturano anche relazioni analogiche: la relazione tra "Roma" e "Lazio" è simile a quella tra "Firenze" e "Toscana"

Esempio, capire gli embeddings

Si immagini di non conoscere il significato della parola "Ongchoi"; essa appare per esempio nelle seguenti frasi: [1]

  • L'Ongchoi è delizioso saltato con l'aglio
  • Ongchoi è ottimo sul riso
  • ... foglie di Ongchoi con salse salate ...

E si supponga di aver visto, in altri contesti, le seguenti frasi:

  • Gli spinaci sono deliziosi saltati con l'aglio
  • i cardi sono ottimi sul riso
  • ... il cavolo nero con salse salate ...

Il fatto che Ongchoi co-occorra con parole simili a quelle con cui sono co-occorsi gli spinaci, i cardi e il cavolo nero suggerisce che esso sia una verdura simile a questi. (si veda la pagina Embeddings per l'esempio completo)

Modelli come sentence-transformersgenerano questi embedding attraverso reti neurali addestrate su enormi quantità di testo, imparando a posizionare nello spazio vettoriale parole e frasi in modo che la loro vicinanza rifletta la loro similarità semantica.

La similarità tra due testi può quindi essere calcolata come la similarità del coseno tra i loro vettori di embedding: dato l'angolo fra due rappresentazioni vettoriali, più esso è piccolo più i significati sono simili.

Questa rappresentazione vettoriale è alla base della moderna vector search:

  • quando un utente pone una domanda (query) , il suo testo viene trasformato in un embedding
  • l'embedding della query confrontato con gli embedding di tutti i documenti nel corpus
  • vengono ritornati i primi K documenti in ordine di somiglianza, cioè dal più simile al più diverso

Terzo Componente: Il Modello Generativo

Una volta recuperati i documenti più rilevanti, il sistema deve generare una risposta pertinente e accurata. La chiave per ottenere risposte affidabili sta nella costruzione accurata del prompt, che deve guidare il modello a utilizzare esclusivamente le informazioni fornite nel contesto. Vediamo un esempio pratico

CONTESTO:
La Toscana è una regione dell'Italia centrale. Capoluogo: Firenze.
Popolazione: circa 3.7 milioni di abitanti.
Piatti tipici: ribollita, panzanella, bistecca alla fiorentina.
Attrazioni principali: Duomo di Firenze, Torre di Pisa, Siena.

QUERY DELL'UTENTE:
Quali sono i piatti tipici della Toscana?

ISTRUZIONI:
Genera una risposta alla domanda dell'utente utilizzando ESCLUSIVAMENTE le informazioni fornite nel contesto sopra. Se alcune informazioni non sono presenti nel contesto, non inventarle. Fornisci una risposta chiara e ben strutturata.

Questo formato di prompt ha diversi vantaggi:

  1. La separazione chiara tra contesto, query e istruzioni aiuta il modello a distinguere le varie componenti
  2. L'enfasi sull'utilizzo esclusivo delle informazioni fornite riduce drasticamente il rischio di allucinazioni
  3. Le istruzioni specifiche sulla struttura della risposta aiutano a ottenere output più coerenti e utilizzabili

È importante notare che la qualità della risposta generata dipende non solo dalla qualità del modello, ma anche dalla pertinenza del contesto recuperato e dalla chiarezza delle istruzioni fornite. Un prompt ben costruito dovrebbe sempre:

  • Delimitare chiaramente il contesto di riferimento
  • Specificare esplicitamente i vincoli (usare solo le informazioni fornite)
  • Indicare il formato o lo stile desiderato per la risposta
  • Includere eventuali requisiti specifici (ad esempio, citare le fonti o evidenziare eventuali incertezze)

Oltre la RAG Base: Sistemi Avanzati di Retrieval e Generazione

Il sistema RAG presentato in questo capitolo rappresenta una delle implementazioni più semplici e dirette del concetto di retrieval augmented generation. Nella pratica, esistono numerose varianti e implementazioni più sofisticate che rispondono a esigenze specifiche.

Un esempio significativo è l'integrazione con database strutturati. In questo caso, il sistema deve essere in grado di tradurre una query in linguaggio naturale in una query SQL appropriata. Per esempio, alla domanda "Quali sono i cinque prodotti più venduti nell'ultimo trimestre?", il sistema deve:

  1. Comprendere l'intento della query
  2. Tradurla in SQL corretto (es: SELECT product_name, SUM(quantity) FROM sales WHERE date > DATE_SUB(NOW(), INTERVAL 3 MONTH) GROUP BY product_name ORDER BY SUM(quantity) DESC LIMIT 5)
  3. Eseguire la query
  4. Incorporare i risultati in una risposta naturale e comprensibile

Un altro caso d'uso interessante è la RAG su documenti tecnici strutturati, come manuali o documentazione software. In questo scenario, il sistema deve essere in grado di:

  • Comprendere la gerarchia e le relazioni tra diverse parti della documentazione
  • Interpretare correttamente snippet di codice e riferimenti tecnici
  • Fornire risposte che includano esempi di codice pertinenti e link alla documentazione completa

Nel campo medico, sistemi RAG specializzati possono aiutare i professionisti sanitari a navigare la letteratura scientifica e le cartelle cliniche. Questi sistemi devono:

  • Gestire terminologia medica specializzata
  • Comprendere le relazioni tra sintomi, diagnosi e trattamenti
  • Rispettare rigorosi requisiti di privacy e sicurezza dei dati

Questi esempi mostrano come la RAG sia un paradigma flessibile che può essere adattato a diverse esigenze. Le implementazioni più avanzate possono includere:

  • Multiple strategie di retrieval in parallelo
  • Sistemi di verifica e fact-checking delle risposte generate
  • Meccanismi di feedback per migliorare continuamente la qualità delle risposte
  • Integrazione con sistemi expert e regole di business specifiche del dominio

La chiave per implementare con successo un sistema RAG sta nel bilanciare la complessità del sistema con le esigenze specifiche del caso d'uso.

RAG e fine-tuning

Fine-tuning e RAG rappresentano due approcci diversi per specializzare un LLM. Il fine-tuning modifica il modello stesso attraverso ulteriore training, ed è preferibile quando serve acquisire uno stile o un linguaggio specifico, o quando le risposte devono seguire pattern precisi. Richiede un dataset di qualità e risorse computazionali significative.

La RAG mantiene il modello invariato ma lo arricchisce con informazioni esterne. È la scelta migliore quando i dati cambiano frequentemente, serve tracciabilità delle fonti, o quando non si dispone di dataset sufficienti per il fine-tuning. È più flessibile e permette aggiornamenti continui, ma può essere più lento nell'esecuzione.

Le due tecniche possono essere combinate: per esempio, un modello fine-tuned per comprendere un dominio specifico può usare RAG per accedere a informazioni sempre aggiornate.

Riferimenti

[1] Crawling the Internal Knowledge-Base of Language Models

[2] Si provi a utilizzare https://projector.tensorflow.org/