
Créer un RAG multimodal qui répond avec du texte, des images et des tableaux à partir de sources
Génération (RAG) a été l’une des applications les plus anciennes et les plus réussies de l’IA générative. Pourtant, peu de chatbots reviennent images, tableaux et figures à partir de documents sources aux côtés de réponses textuelles.
Dans cet article, j’explore pourquoi il est difficile de construire un système RAG fiable et véritablement multimodal, en particulier pour documents complexes tels que les documents de recherche et les rapports d’entreprise, qui comprennent souvent du texte dense, des formules, des tableaux et des graphiques.
Aussi, je présente ici une approche pour un pipeline RAG multimodal amélioré qui fournit des résultats multimodaux cohérents et de haute qualité pour ces types de documents.
Ensemble de données et configuration
Pour illustrer, j’ai construit une petite base de connaissances multimodale à l’aide des documents suivants :
- Les modèles CLIP entièrement réglés permettent des apprenants efficaces en quelques étapes
- VectorPainter : synthèse avancée de graphiques vectoriels stylisés à l’aide de priorités de style trait
- Stratégie marketing pour les services financiers : Financement de l’agriculture et de la transformation des chaînes de valeur du manioc, du maïs et du plantain en Côte d’Ivoire
Le modèle de langage utilisé est GPT-4oet pour les intégrations, j’ai utilisé intégration de texte-3-small.
L’architecture RAG multimodale standard
En théorie, un bot RAG multimodal devrait :
- Accepter texte et image requêtes.
- Retour texte et image réponses.
- Récupérer contexte à partir de sources de texte et d’images.
Un pipeline typique ressemble à ceci :
- Ingestion
- Analyse et découpage : Divisez les documents en segments de texte et extrayez des images.
- Résumé des images : Utilisez un LLM pour générer des légendes ou des résumés pour chaque image.
- Intégrations multi-vecteurs : Créez des intégrations pour les morceaux de texte, les résumés d’images et éventuellement pour les fonctionnalités d’image brute (par exemple, en utilisant CLIP).
2. Indexation
- Stockez les intégrations et les métadonnées dans une base de données vectorielle.
3. Récupération
- Pour une requête utilisateur, effectuez une recherche de similarité sur :
- Intégrations de texte (pour les correspondances textuelles)
- Intégrations de résumé d’image (pour la pertinence de l’image)
4. Génération
- Utilisez un LLM multimodal pour synthétiser la réponse finale en utilisant à la fois le texte et les images récupérés.
L’hypothèse inhérente
Cette approche suppose que la légende ou le résumé d’une image généré à partir de son contenu, contient toujours suffisamment de contexte sur le texte ou les thèmes qui apparaissent dans le document, pour lesquels cette image serait une réponse appropriée.
Dans les documents réels, cela n’est souvent pas vrai.
Exemple : perte de contexte dans les rapports d’entreprise
Prenez le rapport « Stratégie marketing pour les services financiers (#3 dans l’ensemble de données) » dans l’ensemble de données. Dans son résumé, il y a deux tableaux similaires montrant Fonds de roulement exigences – une pour producteurs primaires (agriculteurs) et un pour processeurs. Ce sont les suivants :


GPT-4o génère ce qui suit pour le premier tableau :
« Le tableau présente différents types d’options de financement du fonds de roulement pour les entreprises agricoles, y compris leurs objectifs et leur disponibilité dans différentes situations. »
Et ce qui suit pour le deuxième tableau :
« Le tableau donne un aperçu des options de financement du fonds de roulement, détaillant leurs objectifs et leur applicabilité potentielle dans différents scénarios pour les entreprises, en particulier les exportateurs et les acheteurs d’actions. »
Les deux semblent bien individuellement – mais aucun ne capture le contexte qui distingue producteurs depuis processeurs.
Cela signifie qu’ils seront récupéré incorrectement pour les requêtes portant spécifiquement sur les producteurs ou les transformateurs uniquement. Il existe d’autres tableaux tels que CAPEX, Opportunités de financement où le même problème peut être constaté.
Pour l’article VectorPainter, où la figure 3 de l’article montre le pipeline VectorPainter, GPT-4o génère la légende sous la forme « Présentation du cadre proposé pour l’extraction de style basée sur les traits et la synthèse SVG stylisée avec des contraintes au niveau des traits » il manque le fait qu’il représente le thème central de l’article, nommé « VectorPainter » par les auteurs.
Et pour la formule de perte de distillation de similarité Vision Language définie dans la section 3.3 du document de réglage fin CLIP, la légende générée est « Équation représentant la perte de distribution logit variationnelle (VLD), définie comme la somme des divergences Kullback – Leibler (KL) entre les distributions logit prédites et cibles sur un lot d’entrées. », où le contexte de corrélation entre la vision et le langage est absent.
Il convient également de noter que dans les documents de recherche, les figures et les tableaux ont une légende fournie par l’auteur. Cependant, lors du processus d’extraction, celle-ci est extraite non pas dans le cadre de l’image, mais dans le cadre du texte. Et aussi le positionnement de la légende est parfois au-dessus et à d’autres moments en dessous de la figure. En ce qui concerne les rapports de stratégie marketing, les tableaux et autres images intégrés n’ont même pas de légende décrivant la figure.
Ce qui précède a illustré, c’est que les documents du monde réel ne suivent aucun format standard de texte, d’images, de tableaux et de légendes, ce qui rend difficile le processus d’association du contexte aux figures.
Le nouveau pipeline RAG multimodal amélioré
Pour résoudre ce problème, j’ai apporté deux modifications clés.
1. Résumés d’images contextuels
Au lieu de demander au LLM de résumer l’image, j’en extrait le texte immédiatement avant et après le chiffre — jusqu’à 200 caractères dans chaque direction.
De cette façon, la légende de l’image comprend :
- Le fourni par l’auteur légende (le cas échéant)
- Le récit environnant ça donne un sens
Même si le document ne dispose pas d’une légende formelle, celle-ci fournit un résumé contextuellement précis.
2. Sélection d’image guidée par réponse texte au moment de la génération
Lors de la récupération, je ne le faites pas faites correspondre la requête de l’utilisateur directement avec les légendes des images. En effet, la requête de l’utilisateur est souvent trop courte pour fournir un contexte adéquat pour la récupération d’images (par exemple : Qu’est-ce que… ?)
Plutôt:
- Tout d’abord, générez le réponse textuelle en utilisant les principaux morceaux de texte récupérés pour le contexte.
- Alors, sélectionnez les deux meilleures imagespour la réponse textuelle correspondant aux légendes des images
Cela garantit que les images finales sont choisies par rapport à la réponse réelle pas la requête seule.
Voici un schéma pour le Extraction à l’intégration pipeline:

Et le pipeline pour Récupération et génération de réponsesest la suivante :

Détails de mise en œuvre
Étape 1 : Extraire le texte et les images
Utiliser API d’extraction Adobe PDF pour analyser des PDF en :
- figures/ et tableaux/ dossiers avec des fichiers .png
- Un fichier structuredData.json contenant des positions, du texte et des chemins de fichiers
J’ai trouvé cette API bien plus fiable que des bibliothèques comme PyMuPDF, notamment pour extraire des formules et des diagrammes.
Étape 2 : Créer un fichier texte
Concaténez tous les éléments textuels du JSON pour créer le corpus de texte brut :
# Extract text, sorted by Page and vertical order (Bounds[1])
elements = data.get("elements", [])
# Concatenate text
all_text = []
for el in elements:
if "Text" in el:
all_text.append(el["Text"].strip())
final_text = "\n".join(all_text)
Étape 3 : Créer des légendes d’images : Parcourez chaque élément de `structuredData.json`, vérifiez si le chemin du fichier de l’élément se termine par `.png` . Chargez le fichier à partir du dossier figures et tableaux du document, puis utilisez le LLM pour effectuer un contrôle qualité sur l’image. Ceci est nécessaire car le processus d’extraction trouvera de petites images illisibles, des en-têtes et des pieds de page, des logos d’entreprise, etc. qui doivent être exclus de toute réponse de l’utilisateur.
Notez que nous ne demandons pas au LLM d’interpréter les images ; commentez simplement s’il est suffisamment clair et pertinent pour être inclus dans la base de données. L’invite pour le LLM serait la suivante :
Analyse the given image for quality, clarity, size etc. Is it a good quality image that can be used for further processing ? The images that we consider good quality are tables of facts and figures, scientific images, formulae, everyday objects and scenes etc. Images of poor quality would be any company logo or any image that is illegible, small, faint and in general would not look good in a response to a user query.
Answer with a simple Good or Poor. Do not be verbose
Ensuite, nous créons le résumé de l’image. Pour cela, dans `structuredData.json`, nous examinons les éléments derrière et devant l’élément `.png` et collectons jusqu’à 200 caractères dans chaque direction pour un total de 400 caractères. Cela forme la légende ou le résumé de l’image. L’extrait de code est le suivant :
# Collect before
j = i - 1
while j >= 0 and len(text_before) < 200:
if "Text" in elements[j] and not ("Table" in elements[j]["Path"] or "Figure" in elements[j]["Path"]):
text_before = elements[j]["Text"].strip() + " " + text_before
j -= 1
text_before = text_before[-200:]
# Collect after
k = i + 1
while k < len(elements) and len(text_after) < 200:
if "Text" in elements[k]:
text_after += " " + elements[k]["Text"].strip()
k += 1
text_after = text_after[:200]
Nous effectuons cela pour chaque figure et tableau de chaque document de notre base de données et stockons les légendes des images sous forme de métadonnées. Dans mon cas, je stocke sous forme de fichier `image_captions.json`.
Ce simple changement crée un énorme différence— les légendes résultantes incluent un contexte significatif. Par exemple, les légendes que je reçois pour les deux tableaux du fonds de roulement du rapport sur la stratégie marketing sont les suivantes. Notez comment les contextes sont maintenant clairement différenciéet incluent les agriculteurs et les transformateurs.
"caption": "o farmers for their capital expenditure needs as well as for their working capital needs. The table below shows the different products that would be relevant for the small, medium, and large farmers. Working Capital Input Financing For purchase of farm inputs and labour Yes Yes Yes Contracted Crop Loan* For purchase of inputs for farmers contracted by reputable buyers Yes Yes Yes Structured Loan"
"caption": "producers and their buyers b)\t Potential Loan products at the processing level At the processing level, the products that would be relevant to the small scale and the medium_large processors include Working Capital Invoice discounting_ Factoring Financing working capital requirements by use of accounts receivable as collateral for a loan Maybe Yes Warehouse receipt-financing Financing working ca"
Étape 4 : regrouper le texte et générer des intégrations
Le fichier texte du document est divisé en morceaux de 1 000 caractères, en utilisant ` RécursiveCharacterTextSplitter` de `chaîne de langue` et stocké. Intégrations créées pour les morceaux de texte et les légendes d’images, normalisées et stockées sous `faisss`index
Étape 5 : Récupération du contexte et génération de réponses
La requête de l’utilisateur est mise en correspondance et les 5 premiers morceaux de texte sont récupérés comme contexte. Ensuite, nous utilisons ces morceaux récupérés et la requête de l’utilisateur pour obtenir la réponse textuelle à l’aide du LLM.
À l’étape suivante, nous prenons la réponse textuelle générée et trouvons les 2 images les plus proches (en fonction des intégrations de légendes) de la réponse. Ceci est différent de la manière traditionnelle de faire correspondre la requête de l’utilisateur aux intégrations d’images et fournit de bien meilleurs résultats.
Il reste une dernière étape. Nos légendes d’images étaient basées sur 400 caractères autour de l’image dans le document et peuvent ne pas former une légende logique et concise à afficher. Par conséquent, pour les 2 images finales sélectionnées, nous demandons au LLM de prendre les légendes des images avec les images et de créer une brève légende prête à être affichée dans la réponse finale.
Voici le code de la logique ci-dessus :
# Retrieve context
result = retrieve_context_with_images_from_chunks(
user_input,
content_chunks_json_path,
faiss_index_path,
top_k=5,
text_only_flag= True
)
text_results = result.get("top_chunks", [])
# Construct prompts
payload_1 = construct_prompt_text_only (user_input, text_results)
# Collect responses (synchronously for tool)
assistant_text, caption_text = "", ""
for chunk in call_gpt_stream(payload_1):
assistant_text += chunk
lst_final_images = retrieve_top_images (assistant_text, caption_faiss_index_path, captions_json_path, top_n=2)
if len(lst_final_images) > 0:
payload = construct_img_caption (lst_final_images)
for chunk in call_gpt_stream(payload):
caption_text += chunk
response = {
"answer": assistant_text + ("\n\n" + caption_text if caption_text else ""),
"images": [x['image_name'] for x in lst_final_images],
}
return response
Résultats des tests
Exécutons les requêtes mentionnées au début de ce blog pour voir si les images récupérées sont pertinentes par rapport à la requête de l’utilisateur. Par souci de simplicité, j’imprime uniquement les images et leurs légendes affichées et non la réponse textuelle.
Requête 1 : Quels sont les besoins en prêt et en fonds de roulement du producteur primaire ?
Figure 1 : Aperçu des options de financement du fonds de roulement pour les petits, moyens et grands agriculteurs.
Figure 2 : Options de financement des dépenses en capital pour les moyens et grands agriculteurs.

Requête 2 : Quels sont les besoins en crédit et en fonds de roulement des transformateurs ?
Figure 1 : Aperçu des produits de prêt de fonds de roulement destinés aux transformateurs de petite et moyenne taille.
Figure 2 : Produits de prêt CAPEX pour l’achat de machines et l’expansion de l’entreprise au niveau de la transformation.

Requête 3 : Qu’est-ce que la distillation du langage visuel ?
Figure 1 : Formule de perte de distillation de similarité vision-langage pour transférer la cohérence modale d’un CLIP pré-entraîné vers des modèles affinés.
Figure 2 : Fonction objectif finale combinant la perte de distillation, la perte contrastive supervisée et la perte de distillation de similarité vision-langage avec des hyperparamètres d’équilibrage.

Requête 4 : Qu’est-ce que le pipeline VectorPainter ?
Figure 1 : Présentation du processus d’extraction de style de trait et de synthèse SVG, mettant en évidence la vectorisation du trait, la perte de style et la génération basée sur des invites de texte.
Figure 2 : Comparaison de diverses méthodes de transfert de style entre les formats raster et vectoriels, démontrant l’efficacité de l’approche proposée pour maintenir la cohérence stylistique.

Conclusion
Ce pipeline amélioré démontre comment résumé d’image contextuel et sélection d’images basée sur une réponse textuellepeut considérablement améliorer la précision de la récupération multimodale.
L’approche produit des réponses riches et multimodalesqui combinent texte et visuels de manière cohérente – essentiels pour les assistants de recherche, les systèmes d’intelligence documentaire et les robots de connaissances alimentés par l’IA.
Essayez-le… laissez vos commentaires et connectez-vous avec moi à www.linkedin.com/in/partha-sarkar-lets-talk-AI
Ressources
1. Les modèles CLIP entièrement réglés permettent des apprenants efficaces en quelques étapes: Mushui Liu, Bozheng Li, Université Yunlong Yu Zhejiang
2. VectorPainter : synthèse avancée de graphiques vectoriels stylisés à l’aide de priorités de style trait: Juncheng Hu, Ximing Xing, Jing Zhang, Qian Yu† Université Beihang
3. Stratégie marketing pour les services financiers : Financement de l’agriculture et de la transformation des chaînes de valeur du manioc, du maïs et du plantain en Côte d’Ivoire depuis https://www.ifc.org



