IAG et IA du futur
Pouvoir des répétiteurs et de la recherche en deux étapes pour la génération augmentée de récupération

Par
Aayush Mittal Mittal
Lorsqu’il s’agit de traitement automatique du langage naturel (TAL) et de recherche d’informations, la capacité de récupérer efficacement et avec précision les informations pertinentes est primordiale. Alors que le domaine continue d’évoluer, de nouvelles techniques et méthodologies sont développées pour améliorer les performances des systèmes de récupération, en particulier dans le contexte de la Génération Augmentée de Récupération (RAG). Une telle technique, appelée recherche en deux étapes avec répétiteurs, est émergée comme une solution puissante pour répondre aux limites inhérentes aux méthodes de récupération traditionnelles.
Dans cet article, nous discutons des complexités de la recherche en deux étapes et des répétiteurs, en explorant leurs principes sous-jacents, les stratégies de mise en œuvre et les avantages qu’ils offrent pour améliorer la précision et l’efficacité des systèmes RAG. Nous fournirons également des exemples pratiques et des extraits de code pour illustrer les concepts et faciliter une compréhension plus approfondie de cette technique de pointe.
Comprendre la Génération Augmentée de Récupération (RAG)
Avant de plonger dans les détails de la recherche en deux étapes et des répétiteurs, révisons brièvement le concept de Génération Augmentée de Récupération (RAG). La RAG est une technique qui étend les connaissances et les capacités des grands modèles de langage (LLM) en leur fournissant un accès à des sources d’informations externes, telles que des bases de données ou des collections de documents. Référez-vous à l’article “Une plongée en profondeur dans la Génération Augmentée de Récupération dans les LLM“.
Le processus RAG typique implique les étapes suivantes:
- Requête: Un utilisateur pose une question ou fournit une instruction au système.
- Récupération: Le système interroge une base de données vectorielle ou une collection de documents pour trouver des informations pertinentes à la requête de l’utilisateur.
- Augmentation: Les informations récupérées sont combinées avec la requête originale de l’utilisateur ou l’instruction.
- Génération: Le modèle de langage traite l’entrée augmentée et génère une réponse, en exploitant les informations externes pour améliorer la précision et la complétude de sa sortie.
Bien que la RAG ait prouvé être une technique puissante, elle n’est pas sans défis. L’un des principaux problèmes réside dans la phase de récupération, où les méthodes de récupération traditionnelles peuvent ne pas identifier les documents les plus pertinents, conduisant à des réponses sous-optimales ou inexactes du modèle de langage.
Le besoin de recherche en deux étapes et de répétiteurs
Les méthodes de récupération traditionnelles, telles que celles basées sur la correspondance de mots clés ou les modèles d’espace vectoriel, ont souvent du mal à capturer les relations sémantiques nuancées entre les requêtes et les documents. Cette limitation peut entraîner la récupération de documents qui ne sont que superficiellement pertinents ou manquent d’informations cruciales qui pourraient améliorer considérablement la qualité de la réponse générée.
Pour répondre à ce défi, les chercheurs et les praticiens se sont tournés vers la recherche en deux étapes avec répétiteurs. Cette approche implique un processus en deux étapes:
- Récupération initiale: Dans la première étape, un ensemble relativement large de documents potentiellement pertinents est récupéré à l’aide d’une méthode de récupération rapide et efficace, telle qu’un modèle d’espace vectoriel ou une recherche basée sur des mots clés.
- Répétition: Dans la deuxième étape, un modèle de répétition plus sophistiqué est utilisé pour réorganiser les documents récupérés initialement en fonction de leur pertinence par rapport à la requête, promouvant ainsi les documents les plus pertinents au sommet de la liste.
Le modèle de répétition, souvent un réseau neuronal ou une architecture basée sur un transformateur, est spécifiquement conçu pour évaluer la pertinence d’un document par rapport à une requête donnée. En exploitant les capacités avancées de compréhension du langage naturel, le répétiteur peut capturer les nuances sémantiques et les relations contextuelles entre la requête et les documents, aboutissant à un classement plus précis et plus pertinent.
Avantages de la recherche en deux étapes et des répétiteurs
L’adoption de la recherche en deux étapes avec répétiteurs offre plusieurs avantages significatifs dans le contexte des systèmes RAG:
- Précision améliorée: En réorganisant les documents récupérés initialement et en promouvant les plus pertinents au sommet, le système peut fournir des informations plus précises et plus précises au modèle de langage, conduisant à des réponses générées de meilleure qualité.
- Problèmes de domaine atténués: Les modèles d’incorporation utilisés pour la récupération traditionnelle sont souvent formés sur des corpus de texte à usage général, qui peuvent ne pas capturer adéquatement le langage et la sémantique spécifiques à un domaine. Les modèles de répétition, en revanche, peuvent être formés sur des données spécifiques au domaine, atténuant ainsi le problème “hors de domaine” et améliorant la pertinence des documents récupérés dans des domaines spécialisés.
- Évolutivité: L’approche en deux étapes permet une évolutivité efficace en exploitant des méthodes de récupération rapides et légères dans la première étape, tout en réservant le processus de répétition plus gourmand en calculs pour un sous-ensemble plus petit de documents.
- Flexibilité: Les modèles de répétition peuvent être remplacés ou mis à jour indépendamment de la méthode de récupération initiale, offrant ainsi de la flexibilité et de l’adaptabilité aux besoins évoluant du système.
ColBERT: Interaction tardive efficace et efficiente
L’un des modèles de répétition les plus remarquables est ColBERT (Contextualized Late Interaction over BERT). ColBERT est un modèle de répétition de documents qui exploite les capacités de compréhension du langage profond de BERT tout en introduisant un mécanisme d’interaction novateur appelé “interaction tardive”.

ColBERT: Recherche de passage efficace et efficiente via interaction tardive contextualisée sur BERT
Le mécanisme d’interaction tardive dans ColBERT permet une récupération efficace et précise en traitant les requêtes et les documents séparément jusqu’aux dernières étapes du processus de récupération. Plus précisément, ColBERT encode indépendamment la requête et le document à l’aide de BERT, puis utilise une étape d’interaction légère mais puissante pour modéliser leur similarité fine. En retardant mais en conservant cette interaction fine, ColBERT peut exploiter l’expressivité des modèles de langage profonds tout en gagnant la capacité de précalculer les représentations de documents hors ligne, ce qui accélère considérablement le traitement des requêtes.
L’architecture d’interaction tardive de ColBERT offre plusieurs avantages, notamment une efficacité computationnelle améliorée, une évolutivité avec la taille de la collection de documents et une applicabilité pratique pour les scénarios du monde réel. De plus, ColBERT a été amélioré avec des techniques telles que la supervision bruyante et la compression résiduelle (dans ColBERTv2), qui raffinent le processus de formation et réduisent l’empreinte spatiale du modèle tout en maintenant une efficacité de récupération élevée.
Mise en œuvre de la recherche en deux étapes avec répétiteurs
Maintenant que nous avons une compréhension des principes sous-jacents de la recherche en deux étapes et des répétiteurs, explorons leur mise en œuvre pratique dans le contexte d’un système RAG. Nous allons utiliser des bibliothèques et des cadres populaires pour démontrer l’intégration de ces techniques.
Configuration de l’environnement
Avant de plonger dans le code, configurons notre environnement de développement. Nous allons utiliser Python et plusieurs bibliothèques NLP populaires, notamment Hugging Face Transformers, Sentence Transformers et LanceDB.
# Installez les bibliothèques requises !pip install datasets huggingface_hub sentence_transformers lancedb
Préparation des données
À des fins de démonstration, nous allons utiliser le jeu de données “ai-arxiv-chunked” de Hugging Face Datasets, qui contient plus de 400 articles d’arXiv sur l’apprentissage automatique, le traitement automatique du langage naturel et les grands modèles de langage.
from datasets import load_dataset <p>dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&gt;
Ensuite, nous allons prétraiter les données et les diviser en morceaux plus petits pour faciliter une récupération et un traitement efficaces.
from transformers import AutoTokenizer <p>tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")</p> <p>def chunk_text(text, chunk_size=512, overlap=64): tokens = tokenizer.encode(text, return_tensors="pt", truncation=True) chunks = tokens.split(chunk_size - overlap) texts = [tokenizer.decode(chunk) for chunk in chunks] return texts</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)</p>
Pour la phase de récupération initiale, nous allons utiliser un modèle de transformateur de phrases pour encoder nos documents et requêtes en représentations vectorielles denses, puis effectuer une recherche de plus proches voisins approximative à l'aide d'une base de données vectorielle comme LanceDB.
from sentence_transformers import SentenceTransformer from lancedb import lancedb <p># Chargez le modèle de transformateur de phrases model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Créez un magasin de vecteurs LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexez les documents for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)</p> <p>from sentence_transformers import SentenceTransformer from lancedb import lancedb</p> <p># Chargez le modèle de transformateur de phrases model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Créez un magasin de vecteurs LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indexez les documents for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
Une fois les documents indexés, nous pouvons effectuer la récupération initiale en trouvant les plus proches voisins de la requête.
from transformers import AutoTokenizer <p>tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")</p> <p>def chunk_text(text, chunk_size=512, overlap=64): tokens = tokenizer.encode(text, return_tensors="pt", truncation=True) chunks = tokens.split(chunk_size - overlap) texts = [tokenizer.decode(chunk) for chunk in chunks] return texts</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)
Répétition
Après la récupération initiale, nous allons utiliser un modèle de répétition pour réorganiser les documents récupérés en fonction de leur pertinence par rapport à la requête. Dans cet exemple, nous allons utiliser le modèle de répétition ColBERT, un modèle basé sur transformateur rapide et précis spécifiquement conçu pour le classement de documents.
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() <p># Répétez les documents initiaux reranked_docs = reranker.rerank(query, initial_docs)
La liste reranked_docs contient maintenant les documents réorganisés en fonction de leur pertinence par rapport à la requête, telle que déterminée par le modèle de répétition ColBERT.
Augmentation et Génération
Avec les documents réorganisés et pertinents en main, nous pouvons procéder aux phases d’augmentation et de génération du pipeline RAG. Nous allons utiliser un modèle de langage de la bibliothèque Hugging Face Transformers pour générer la réponse finale.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM <p>tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># Augmentez la requête avec les documents réorganisés augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># Générez la réponse à partir du modèle de langage input_ids = tokenizer.encode(augmented_query, return_tensors="pt") output_ids = model.generate(input_ids, max_length=500) response = tokenizer.decode(output_ids[0], skip_special_tokens=True)</p> print(response)
Dans l’extrait de code ci-dessus, nous augmentons la requête originale avec les trois premiers documents réorganisés, créant ainsi une requête augmentée. Nous passons ensuite cette requête augmentée à un modèle de langage T5, qui génère une réponse basée sur le contexte fourni.
La variable response contiendra la réponse finale, en exploitant les informations externes des documents récupérés et réorganisés pour fournir une réponse plus précise et plus complète à la requête originale.
Techniques avancées et considérations
Bien que la mise en œuvre que nous avons couverte fournisse une base solide pour intégrer la recherche en deux étapes et les répétiteurs dans un système RAG, il existe plusieurs techniques avancées et considérations qui peuvent améliorer encore les performances et la robustesse de l’approche.
- Expansion de requête: Pour améliorer la phase de récupération initiale, vous pouvez employer des techniques d’expansion de requête, qui consistent à augmenter la requête originale avec des termes ou des phrases liés. Cela peut aider à récupérer un ensemble plus diversifié de documents potentiellement pertinents.
- Répétition d’ensemble: Au lieu de s’appuyer sur un seul modèle de répétition, vous pouvez combiner plusieurs répétiteurs en un ensemble, en exploitant les forces de différents modèles pour améliorer les performances globales.
- Affinage des répétiteurs: Même si les modèles de répétition préformés peuvent être efficaces, les affiner sur des données spécifiques au domaine peut encore améliorer leur capacité à capturer les sémantiques et les signaux de pertinence spécifiques au domaine.
- Récupération et répétition itératives: Dans certains cas, une seule itération de récupération et de répétition peut ne pas suffire. Vous pouvez explorer des approches itératives, où la sortie du modèle de langage est utilisée pour raffiner la requête et le processus de récupération, conduisant à un système plus interactif et dynamique.
- Équilibre entre pertinence et diversité: Même si les répétiteurs visent à promouvoir les documents les plus pertinents, il est essentiel de trouver un équilibre entre la pertinence et la diversité. L’intégration de techniques favorisant la diversité peut aider à empêcher que le système ne soit trop étroit ou biaisé dans ses sources d’informations.
- Métriques d’évaluation: Pour évaluer l’efficacité de votre approche de recherche en deux étapes et de répétition, vous devrez définir des métriques d’évaluation appropriées. Celles-ci peuvent inclure des métriques de récupération d’information traditionnelles comme la précision, le rappel et le rang réciproque moyen (MRR), ainsi que des métriques spécifiques à la tâche adaptées à votre cas d’utilisation.
Conclusion
La Génération Augmentée de Récupération (RAG) est émergée comme une technique puissante pour améliorer les capacités des grands modèles de langage en exploitant des sources d’informations externes. Cependant, les méthodes de récupération traditionnelles peuvent souvent échouer à identifier les documents les plus pertinents, conduisant à des performances sous-optimales.
La recherche en deux étapes avec répétiteurs offre une solution convaincante à ce défi. En combinant une phase de récupération initiale rapide avec un modèle de répétition plus sophistiqué, cette approche peut considérablement améliorer la précision et la pertinence des documents récupérés, aboutissant finalement à des réponses générées de meilleure qualité par le modèle de langage.
J'ai passé les cinq dernières années à plonger dans le monde fascinant de l'apprentissage automatique et du deep learning. Ma passion et mon expertise m'ont conduit à contribuer à plus de 50 projets de génie logiciel divers, avec un focus particulier sur l'IA/ML. Ma curiosité continue m'a également attiré vers le traitement automatique des langues, un domaine que je suis impatient d'explorer plus en profondeur.
Découvrir plus


Le problème de mémoire de l’IA : Pourquoi l’efficacité du contexte long fait toute la différence, et ce qu’il faut pour le faire correctement


Pourquoi votre RAG biomédical cache les contradictions de vous


Les installations de packages Python comme indice d’adoption de l’IA locale


La Vraie Raison Pour Laquelle Votre Pipeline RAG Continue à Halluciner


Prédiction 2026 – L’open source chevauchera la vague de l’IA vers son prochain âge d’or


Pourquoi la plupart des applications modernes seront inutiles à l’ère de l’IA
