Table of Contents
Imaginez un monde où trouver des informations dans un document est aussi simple que de poser une question et d’obtenir une réponse combinant texte et images de manière fluide. Cet article explore la création d’un pipeline multimodal d’Extraction-Augmentée (RAG) capable de réaliser cela. Vous apprendrez à extraire du texte et des images d’une présentation PDF en utilisant des outils comme LlamaParse, à créer des résumés contextuels pour améliorer la récupération des données, et à intégrer ces informations dans des modèles avancés comme GPT-4 pour répondre aux requêtes. En cours de route, nous examinerons comment la récupération contextuelle améliore la précision, optimiser les coûts grâce à la mise en cache des requêtes, et comparer les résultats entre les pipelines de base et améliorés. Préparez-vous à découvrir le potentiel du RAG avec ce guide étape par étape !
Récupération contextuelle
La récupération contextuelle a été initialement introduite comme une amélioration au RAG standard. Chaque fragment de texte est annoté avec un bref résumé qui le situe dans le contexte global du document. Cela permet d’inclure des concepts ou mots-clés de haut niveau qui aident à extraire ce fragment pour différents types de requêtes.
Installation et configuration
Vous aurez besoin d’installer ou de mettre à jour quelques packages :
!pip install -U llama-index llama-parse
Nous allons également configurer une intégration avec LlamaTrace.
Analyse d’un rapport PDF
Dans notre exemple, nous allons analyser le rapport ICONIQ 2024 sur l’état de l’IA. Ce PDF est disponible publiquement.
!mkdir data
!mkdir data_images_iconiq
!wget "https://cdn.prod.website-files.com/65e1d7fb19a3e64b5c36fb38/66eb856e019e59758ef73759_ICONIQ%20Analytics%20%2B%20Insights%20-%20State%20of%20AI%20Sep24.pdf" -O data/iconiq_report.pdf
Nous allons maintenant configurer les composants essentiels pour construire et mettre en œuvre notre pipeline RAG multimodal de manière efficace.
Création des nœuds multimodaux
Les nœuds multimodaux sont les éléments de base qui nous permettent de traiter et d’intégrer différents types de données comme le texte et les images. Dans cette étape, nous allons diviser les pages PDF en nœuds de texte plus petits et gérables.
from pathlib import Path
from llama_index.core.schema import TextNode
from typing import Optional
import re
def get_page_number(file_name):
match = re.search(r"-page_(\d+)\.jpg$", str(file_name))
if match:
return int(match.group(1))
return 0
def _get_sorted_image_files(image_dir):
raw_files = [
f for f in list(Path(image_dir).iterdir()) if f.is_file() and "-page" in str(f)
]
return sorted(raw_files, key=get_page_number)
def get_text_nodes(image_dir, json_dicts):
nodes = []
image_files = _get_sorted_image_files(image_dir)
md_texts = [d["md"] for d in json_dicts]
for idx, md_text in enumerate(md_texts):
chunk_metadata = {
"page_num": idx + 1,
"image_path": str(image_files[idx]),
"parsed_text_markdown": md_text,
}
node = TextNode(text="", metadata=chunk_metadata)
nodes.append(node)
return nodes
text_nodes = get_text_nodes("data_images_iconiq", md_json_list)
Récupération contextuelle et création de nœuds
La récupération contextuelle attache un court résumé à chaque fragment, décrivant où il s’intègre dans le document global. Nous utiliserons le modèle LLM pour générer ces résumés et les stocker dans les métadonnées de chaque nœud.
def create_contextual_nodes(nodes, llm):
nodes_modified = []
doc_text = "\n".join([n.get_content(metadata_mode="all") for n in nodes])
for idx, node in enumerate(nodes):
new_node = deepcopy(node)
user_content = (f"{whole_doc_text.format(WHOLE_DOCUMENT=doc_text)}\n\n"
f"{chunk_text.format(CHUNK_CONTENT=node.get_content(metadata_mode='all'))}")
messages = [
ChatMessage(role="system", content="You are a helpful AI Assistant."),
ChatMessage(role="user", content=user_content),
]
new_response = llm.chat(messages)
new_node.metadata["context"] = str(new_response)
nodes_modified.append(new_node)
return nodes_modified
Intégration et requêtes
Nous souhaitons maintenant construire un pipeline RAG qui peut répondre à des requêtes utilisant les nœuds textuels et les images. Par exemple, nous pouvons interroger notre pipeline sur l’utilisation de l’IA par département.
response = query_engine.query("Which departments use GenAI the most and how are they using it?")
Une réponse typique pourrait indiquer les départements qui utilisent le plus l’IA générative en fonction des résultats d’une enquête.
Améliorations grâce à la récupération contextuelle
En comparant les résultats obtenus avec et sans récupération contextuelle, nous pouvons constater que cette méthode offre des réponses plus précises et pertinentes, permettant d’affiner les résultats de recherche.
Conclusion
Ce guide complet vous fournit les outils et techniques nécessaires pour créer des solutions d’IA multimodales efficaces, pouvant être adaptées à n’importe quelle source de données externe, que ce soit une immense base de connaissances d’entreprise ou des documents internes.