Un tutorial dettaglia la costruzione, in Python, di una pipeline di generazione aumentata per recupero (RAG) multimodale, capace di cercare e ragionare sia sul testo che sulle immagini estratte da documenti complessi. Il principio mira ai PDF che mescolano prosa, tabelle e grafici, formati in cui un RAG classico fatica secondo il testo.
Il RAG consiste nel recuperare estratti di un documento per trasmetterli a un modello linguistico prima che formuli la sua risposta. Applicato al solo testo, il procedimento dà buoni risultati. Al contrario, una suddivisione basata unicamente sul testo distrugge la formattazione delle tabelle e lascia da parte le immagini, cosicché il sistema risponde a partire da una visione incompleta del documento. La pipeline descritta tratta invece le immagini come oggetti interrogabili allo stesso titolo del testo.
La realizzazione si appoggia su LangChain, sulla libreria unstructured e sull’API di OpenAI. Il tutorial descrive quattro fasi: analizzare il documento, riassumere le immagini, immagazzinare l’insieme e interrogare il sistema. Il pacchetto poppler-utils, dipendenza di sistema, è necessario a unstructured per estrarre le immagini dai PDF.
Separare il testo e le immagini
La funzione partition_pdf() di unstructured legge il documento e classifica ogni elemento per tipo: paragrafi, tabelle e immagini integrate. Le immagini sono registrate in una cartella dedicata, mentre i blocchi di testo sono raggruppati in frammenti di 4000 caratteri al massimo, secondo i titoli. Un ciclo separa poi i frammenti testuali dai percorsi di accesso alle immagini.
Una base vettoriale classica non sa indicizzare direttamente un’immagine. Ogni immagine è quindi trasmessa a GPT-4o, con la consegna «Describe this image in detail for use in a search system», per ottenere una descrizione dettagliata che serve da sostituto interrogabile. Il tutorial segnala un costo in questa fase: ogni immagine scatena una chiamata all’API. Per i documenti contenenti molti loghi o icone, suggerisce di filtrare le immagini più piccole prima di questo trattamento.
Un immagazzinamento a due livelli
L’architettura si basa su un MultiVectorRetriever, che gestisce due spazi di immagazzinamento. Il primo, una base vettoriale Chroma, contiene i frammenti di testo e le descrizioni d’immagine, trasformati in vettori con l’aiuto del modello di embeddings text-embedding-3-small. Il secondo, un magazzino di documenti in memoria, conserva il contenuto grezzo. Ogni voce è collegata al suo equivalente da un identificatore unico. Una volta effettuata la ricerca sulle descrizioni, il sistema ritrova quindi il frammento di testo o il file immagine originale.
Durante una richiesta, la domanda è essa stessa vettorizzata e comparata agli elementi indicizzati. I frammenti di testo sono trasmetti tali e quali, mentre le immagini ritrovate sono aperte poi codificate in base64, un formato di testo che permette di unirle alla richiesta. L’insieme è inviato a GPT-4o, che produce una risposta fondata sui due tipi di contenuti. Il tutorial illustra la procedura con la domanda «What does the revenue chart show for Q3?», che può quindi essere ripresa tale e quale come esempio.
Piste di evoluzione
L’autore menziona diversi prolungamenti possibili: aggiungere una fase di riclassificazione (re-ranking) per migliorare la precisione della ricerca, registrare la base Chroma su disco per un uso in produzione, o esplorare i modelli visione-linguaggio come ColPali, che integrano direttamente le pagine di documenti sotto forma di immagini e si passano così della fase di analisi.





