RAG multimodal : interroger les graphiques, tableaux et schémas d'un PDF
Faire décrire les figures d'un PDF par Gemini à l'indexation, indexer descriptions et texte avec gemini-embedding-2, joindre l'image elle-même à la réponse, et mesurer le gain face à un RAG texte seul : 0/10 contre 10/10 sur les questions dont la réponse est dans une figure.
Un rapport d'entreprise, une notice technique ou une étude de marché portent souvent leurs informations les plus importantes dans les figures : le graphique des ventes, le tableau des coûts, le schéma d'architecture. Or un RAG classique commence par extract_text() : tout ce qui est dessiné disparaît. Le modèle répond alors honnêtement « l'information n'est pas présente », alors qu'elle est là, en gros, au milieu de la page.
Ce lab construit un RAG qui voit les figures, et le compare à un RAG texte seul sur le même PDF.
Pour qui ?
- Vous avez déjà construit un RAG vectoriel (embeddings, similarité cosinus, génération avec contexte).
- Vous êtes à l'aise en Python et avec les appels à l'API Gemini.
- Vous travaillez sur des documents riches : rapports, présentations exportées en PDF, documentation technique.
Ce que vous construisez
Un rapport trimestriel fictif de 6 pages (entreprise imaginaire « Verdalis », 4 entrepôts frigorifiques) est généré par un script : texte, graphique en barres, courbe avec seuil, schéma d'architecture et tableau dessiné. Les valeurs chiffrées n'existent que dans les images.
flowchart LR P["PDF"] --> T["pypdf : texte des pages"] P --> I["pypdf : images"] I --> D["Gemini : description<br/>(valeurs, liaisons)"] T --> E["gemini-embedding-2"] D --> E E --> X["Index : chunks texte + figure"] Q["Question"] --> X X -->|"top 3 + figures des mêmes pages"| G["Gemini : réponse<br/>avec l'image jointe"]
Le résultat, en un tableau
Mesuré le 2026-10-15 avec python evaluate.py sur 12 questions, dont 10 portent sur une figure (détails dans la leçon 4) :
| Mode | Réponses exactes | dont questions sur figure |
|---|---|---|
| Texte seul | 2/12 | 0/10 |
| Multimodal (descriptions indexées) | 10/12 | 8/10 |
| Multimodal + expansion par page | 12/12 | 10/10 |
Prérequis
- Python 3.10 ou plus récent, une clé d'API Gemini dans
GOOGLE_API_KEY(ou dans.env, voir .env.example). pip install -r requirements.txt(requirements.txt) :google-genai,pypdf,reportlab,pillow,numpy.- Facultatif : la police DejaVu (
fonts-dejavusous Debian/Ubuntu) pour des accents nets dans les graphiques.
Programme
| Module | Leçon | Ce que vous faites |
|---|---|---|
| 1. Cas d'usage et architecture | Quand le texte ne suffit pas | générer le PDF, constater ce que perd extract_text() |
| 2. Construire pas à pas | Extraire et décrire les figures | images avec pypdf, descriptions structurées par Gemini, cache |
| Indexer et répondre avec l'image | embeddings, trois modes de recherche, image jointe à la question | |
| 3. Évaluer et exploiter | Texte seul contre multimodal | évaluation chiffrée, analyse des échecs, coûts |
En local ou sur GCP ?
| En local (ce lab) | Sur Google Cloud | |
|---|---|---|
| Extraction | pypdf, images intégrées au PDF | Document AI (mise en page, tableaux) ou Gemini sur la page entière |
| Description | Gemini via clé d'API | Gemini sur Vertex AI, en lot (batch) pour de gros volumes |
| Index | matrice NumPy en mémoire | Vertex AI Vector Search, AlloyDB/pgvector |
| Images | .cache/ local | Cloud Storage, référencées par leur URI |
Code complet : make_pdf.py, multimodal_rag.py, evaluate.py, questions.json, test_multimodal_rag.py.
Recursos
- example.env.example1 KB
- pyevaluate.py2 KBVer
- pymake_pdf.py7 KBVer
- pymultimodal_rag.py7 KBVer
- jsonquestions.json2 KBVer
- pdfrapport_verdalis_t3.pdf116 KB
- txtrequirements.txt1 KBVer
- pytest_multimodal_rag.py3 KBVer
Referencias
- Compréhension d'images avec l'API Geminiai.google.dev
- Traitement de documents PDF avec l'API Geminiai.google.dev — L'alternative : envoyer le PDF entier au modèle
- Embeddings avec l'API Geminiai.google.dev
- pypdf : extraire les images d'un PDFpypdf.readthedocs.io
- Documentation ReportLabdocs.reportlab.com
- ColPali: Efficient Document Retrieval with Vision Language Modelsarxiv.org — Pour aller plus loin : indexer directement l'image des pages