Retrieval-Augmented Generation (RAG)

Débloquer toute la puissance des documents : Une plongée profonde dans le RAG à long contexte

La génération augmentée par récupération (RAG) a révolutionné la façon dont les entreprises interagissent avec leurs données privées. Cependant, les implémentations traditionnelles du RAG atteignent souvent leurs limites face à des requêtes complexes impliquant plusieurs documents ou lorsque les informations pertinentes sont dispersées dans de nombreux fragments. C'est ici qu'intervient le RAG à long contexte. En tirant parti des fenêtres de contexte en expansion des grands modèles de langage (LLM) modernes, nous pouvons dépasser la simple correspondance de mots-clés et la recherche sémantique pour obtenir une compréhension plus holistique des documents longs.

Dans cet article, nous explorerons les changements architecturaux nécessaires pour prendre en charge les longs contextes, les compromis entre la taille de la fenêtre de contexte et la précision de la récupération, ainsi que des stratégies pratiques pour la mise en œuvre.

Le passage de petits fragments à des documents entiers

Traditionnellement, les pipelines RAG divisent les documents en petits fragments (par exemple, 500 à 1000 tokens) pour les adapter aux fenêtres de contexte limitées des premiers LLM. Bien que cela améliore la précision de la récupération pour des faits spécifiques, cela détruit la structure globale du texte. Le RAG à long contexte inverse ce paradigme. Avec les LLM désormais capables de gérer 128k, 200k, voire plus d'1 million de tokens, nous pouvons intégrer des chapitres entiers ou des documents dans leur intégralité, ou du moins des segments beaucoup plus grands, en préservant la cohérence sémantique.

L'avantage principal est la réduction de la perte d'informations. Lorsqu'une question nécessite de synthétiser des informations provenant du début et de la fin d'un manuel de 50 pages, une approche fragmentée pourrait manquer la connexion entre elles. Une approche à long contexte permet au modèle de « lire » l'intégralité du document lors de l'inférence ou lors de la phase de récupération si une recherche hybride est utilisée.

Stratégies architecturales pour les longs contextes

Mettre en œuvre le RAG à long contexte ne consiste pas seulement à transmettre plus de tokens ; cela nécessite une attention particulière aux modèles d'intégration (embeddings) et aux mécanismes de récupération.

1. Modèles d'intégration améliorés

Les modèles d'intégration standard, comme text-embedding-ada-002 d'OpenAI, ont une limite de contexte de 8192 tokens. Pour les longs contextes, vous avez besoin de modèles conçus pour les dépendances à longue portée. Des modèles plus récents, tels que les variantes étendues de sentence-transformers/all-MiniLM-L6-v2 ou des embeddings spécialisés pour les longs contextes, peuvent capturer les relations sur des milliers de tokens.

2. Recherche hybride

Combiner la recherche vectorielle dense avec la recherche par mots-clés clairsemée (BM25) est crucial. La recherche dense capture la signification sémantique, tandis que la recherche clairsemée garantit que des termes techniques ou des identifiants spécifiques trouvés dans les textes longs ne sont pas perdus en raison des effets de moyenne dans le vecteur d'intégration.

Exemple de code : Mise en œuvre de la récupération à long contexte

Voici un exemple simplifié utilisant Python et langchain pour démontrer comment vous pourriez gérer un document long en conservant des fragments plus grands que d'habitude et en vous appuyant sur un modèle avec une grande fenêtre de contexte.

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI

# 1. Définir une taille de fragment plus grande pour le RAG à long contexte
# La norme est de 500-1000, nous utilisons 2000-4000
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=4000,
    chunk_overlap=200,
    length_function=len,
)

# 2. Charger votre document long
docs = ... # Charger le texte ici

# 3. Diviser avec des fragments plus grands
split_docs = text_splitter.split_documents(docs)

# 4. Utiliser un modèle d'intégration qui prend en charge vos besoins en longs contextes
# Note : Assurez-vous que la longueur maximale de votre modèle dépasse la taille de votre fragment
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")

# 5. Créer le magasin vectoriel
vectorstore = FAISS.from_documents(split_docs, embeddings)

# 6. Récupérer les k meilleurs documents
# Puisque les fragments sont plus grands, vous pourriez avoir besoin de moins de résultats,
# mais assurez-vous de ne pas dépasser la fenêtre de contexte du LLM
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

# 7. Définir le LLM avec une grande fenêtre de contexte
llm = ChatOpenAI(model="gpt-4-1106-preview", temperature=0)

# Dans une chaîne réelle, vous combineriez ces éléments

Défis et bonnes pratiques

Bien que le RAG à long contexte offre des avantages significatifs, il introduit de nouveaux défis. Premièrement, le coût : transmettre 100k tokens à un LLM est exponentiellement plus coûteux que d'en transmettre 1k. Deuxièmement, le bruit : des fragments plus grands introduisent plus d'informations non pertinentes, ce qui peut confondre le modèle (le phénomène dit « lost in the middle »). Pour atténuer cela, envisagez d'utiliser des techniques de compression de contexte. Passez les fragments récupérés à travers un ré-ordonnanceur léger ou une étape de filtrage avant de les envoyer au LLM principal.

Conclusion

Le RAG à long contexte représente la prochaine évolution de l'intelligence documentaire. En équilibrant les tailles de fragments, en tirant parti des modèles d'intégration modernes et en utilisant des LLM avec d'immenses fenêtres de contexte, les développeurs peuvent construire des systèmes qui comprennent non seulement les faits, mais aussi les récits et les relations complexes au sein des données. À mesure que les capacités matérielles et des modèles continuent de croître, la frontière entre « récupérer » et « lire » continuera de s'estomper, faisant de la gestion efficace du contexte une compétence fondamentale pour les ingénieurs en IA.

Share: