Tutoriel

Statut éditorial : En attente de relecture

RAG multimodal : indexer images et texte avec LlamaIndex

Construire un index qui retrouve des passages et des images, puis assemble un contexte multimodal traçable pour répondre à une question.

Classification du contenu

Types

  • RAG et recherche vectorielle

Technologies

Niveau
Avancé
Publié le
24 août 2026
Dernière relecture
Relecture en attente
Prochaine vérification
24 octobre 2026

Un RAG multimodal doit retrouver le bon passage, mais aussi la bonne image ou page. L’erreur classique consiste à extraire tout le texte puis à perdre la relation entre un tableau, sa légende et sa page source.

Préparer un petit corpus

Créez un dossier "data/" contenant quelques fichiers texte et images. Pour chaque image, conservez un identifiant de document, un numéro de page, une légende et le chemin original. Ces métadonnées permettront de citer la source.

~~~bash python -m venv .venv source .venv/bin/activate pip install -U llama-index llama-index-vector-stores-qdrant qdrant-client pillow ~~~

Ajoutez ensuite les intégrations d’embeddings et de modèle multimodal correspondant à votre fournisseur. L’écosystème LlamaIndex est modulaire : vérifiez les paquets de la version installée.

Charger les documents

~~~python from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader( input_dir="data", recursive=True, ).load_data()

for document in documents: print(type(document).__name__, document.metadata) ~~~

Inspectez réellement le résultat. Une image sans légende ou une page sans identifiant stable sera difficile à expliquer plus tard.

Construire deux espaces de recherche

Une architecture lisible conserve un index texte et un index image. Le premier utilise un embedding textuel ; le second un embedding visuel ou des descriptions d’images. Avec Qdrant, utilisez deux collections ou deux vecteurs nommés afin de ne jamais comparer des dimensions incompatibles.

~~~python from llama_index.core import StorageContext from llama_index.core.indices import MultiModalVectorStoreIndex from llama_index.vector_stores.qdrant import QdrantVectorStore from qdrant_client import QdrantClient

client = QdrantClient(path="./qdrant_data") text_store = QdrantVectorStore(client=client, collection_name="manual_text") image_store = QdrantVectorStore(client=client, collection_name="manual_images")

storage = StorageContext.from_defaults( vector_store=text_store, image_store=image_store, )

index = MultiModalVectorStoreIndex.from_documents( documents, storage_context=storage, ) ~~~

Les signatures changent parfois entre versions. Épinglez les paquets après avoir exécuté un test complet d’indexation et de requête.

Récupérer avant de générer

~~~python retriever = index.as_retriever( similarity_top_k=4, image_similarity_top_k=2, )

nodes = retriever.retrieve( "Quel graphique montre l'évolution du chiffre d'affaires ?" )

for item in nodes: print(item.score, type(item.node).__name__, item.node.metadata) ~~~

Affichez les candidats avant de brancher un LLM. Vous devez pouvoir expliquer quelle page et quelle image ont été retenues.

Construire la réponse

Transmettez au modèle multimodal uniquement les meilleurs passages et images, accompagnés de leurs identifiants. Demandez une réponse courte avec citations. Si aucune source ne dépasse votre seuil validé, retournez « information non trouvée » au lieu de laisser le modèle compléter.

Évaluer

Créez un jeu de questions ciblant texte seul, image seule, combinaison texte-image et absence de réponse. Mesurez le rappel des bonnes sources avant la qualité de rédaction. Une mauvaise réponse peut venir du chargement, de l’embedding, de la fusion des rangs ou du générateur : journalisez ces étapes séparément.

Production

Calculez les embeddings hors requête, versionnez les index, dédupliquez les images et protégez les originaux. Ajoutez OCR pour les captures riches en texte, mais conservez également l’image : l’OCR perd la mise en page et les relations visuelles.

FAQ

Faut-il transformer toutes les images en texte ?

Non. Une légende facilite la recherche textuelle, tandis qu’un embedding visuel conserve des signaux que la description peut omettre. Les deux approches sont complémentaires.

Pourquoi séparer retrieval et génération ?

Cela permet de tester la recherche indépendamment. Sans cette séparation, une réponse éloquente peut masquer de mauvaises sources.

Sources utilisées