Een tutorial beschrijft in detail de bouw, in Python, van een multimodaal retrieval-augmented generation (RAG)-pijplijn die zowel tekst als afbeeldingen uit complexe documenten kan opzoeken en analyseren. Het principe richt zich op PDF’s die proza, tabellen en grafieken combineren, formaten waar een klassieke RAG op basis van alleen tekst moeite mee heeft.
- Het systeem scheidt tekst en afbeeldingen uit PDF’s met unstructured.
- GPT-4o beschrijft elke afbeelding, zodat afbeeldingen doorzoekbaar worden.
- Een MultiVectorRetriever koppelt vectorzoekopdrachten aan de originele inhoud.
- Bij een vraag ontvangt GPT-4o tekst en afbeeldingen samen voor het antwoord.
RAG bestaat uit het terugvinden van fragmenten uit een document om deze door te geven aan een taalmodel voordat het zijn antwoord formuleert. Toegepast op alleen tekst levert de procedure goede resultaten op. Een op alleen tekst gebaseerde opsplitsing vernietigt echter de opmaak van tabellen en laat afbeeldingen buiten beschouwing, waardoor het systeem antwoordt op basis van een onvolledig beeld van het document. De beschreven pijplijn behandelt afbeeldingen daarentegen als bevraagbare objecten op gelijke voet met tekst.
De implementatie maakt gebruik van LangChain, de bibliotheek unstructured en de API van OpenAI. De tutorial beschrijft vier stappen: het document analyseren, afbeeldingen samenvatten, alles opslaan en het systeem bevragen. Het pakket poppler-utils, een systeemafhankelijkheid, is nodig voor unstructured om afbeeldingen uit PDF’s te extraheren.
Tekst en afbeeldingen scheiden
De functie partition_pdf() van unstructured leest het document en classificeert elk element op type: alinea’s, tabellen en ingebedde afbeeldingen. De afbeeldingen worden opgeslagen in een aparte map, terwijl de tekstblokken worden gegroepeerd in fragmenten van maximaal 4000 tekens, op basis van koppen. Een lus scheidt vervolgens de tekstfragmenten van de bestandspaden naar de afbeeldingen.
Een klassieke vector database kan een afbeelding niet direct indexeren. Elke afbeelding wordt daarom doorgegeven aan GPT-4o, met de instructie ‘Describe this image in detail for use in a search system’, om een gedetailleerde beschrijving te verkrijgen die dient als bevraagbaar alternatief. De tutorial wijst op een kostenaspect in deze stap: elke afbeelding leidt tot een API-aanroep. Voor documenten met veel logo’s of pictogrammen stelt het voor om de kleinste afbeeldingen voor deze behandeling te filteren.
Een opslag met twee niveaus
De architectuur steunt op een MultiVectorRetriever, die twee opslagruimtes beheert. De eerste, een Chroma vector database, bevat de tekstfragmenten en afbeeldingsbeschrijvingen, omgezet in vectoren met behulp van het text-embedding-3-small embeddingsmodel. De tweede, een in-memory document store, bewaart de ruwe inhoud. Elke invoer is gekoppeld aan zijn equivalent via een unieke identifier. Zodra de zoekactie op de beschrijvingen is uitgevoerd, vindt het systeem dus het originele tekstfragment of afbeeldingsbestand terug.
Bij een vraag wordt de vraag zelf gevectoriseerd en vergeleken met de geïndexeerde elementen. De tekstfragmenten worden ongewijzigd doorgegeven, terwijl de teruggevonden afbeeldingen worden geopend en vervolgens gecodeerd in base64, een tekstformaat dat het mogelijk maakt ze bij de vraag te voegen. Het geheel wordt naar GPT-4o gestuurd, dat een antwoord produceert gebaseerd op beide soorten inhoud. De tutorial illustreert de aanpak met de vraag ‘What does the revenue chart show for Q3?’, die dus letterlijk als voorbeeld kan worden gebruikt.
Mogelijke uitbreidingen
De auteur noemt verschillende mogelijke vervolgstappen: een herrangschikkingsstap (re-ranking) toevoegen om de zoeknauwkeurigheid te verbeteren, de Chroma database op schijf opslaan voor productiegebruik, of vision-language modellen zoals ColPali verkennen, die documentpagina’s direct als afbeeldingen integreren en zo de analysestap overbodig maken.





