La sortie de grands modèles de langage (LLM) dotés de fenêtres de contexte massives — allant de 32k à plus d'1M de jetons — a fondamentalement changé le paradigme de la Génération Augmentée par Récupération (RAG). Auparavant, le principal goulot d'étranglement consistait à maintenir le contexte petit et précis pour s'adapter aux limites de jetons restreintes. Aujourd'hui, nous pouvons fournir des documents entiers, des bases de code ou des historiques de conversation au modèle. Cependant, simplement charger davantage de données dans le contexte ne garantit pas automatiquement de meilleures réponses. En fait, cela introduit souvent du bruit, augmente la latence et gonfle les coûts. Ce guide explore comment concevoir des systèmes RAG à long contexte qui exploitent efficacement les fenêtres étendues tout en maintenant la précision de la récupération.
Le changement de stratégie de récupération
Le RAG traditionnel reposait sur un fractionnement agressif et une récupération stricte top-K pour s'assurer que seuls les extraits les plus pertinents atteignaient le LLM. Avec les capacités de long contexte, nous pouvons adopter une approche de Récupération large, Raisonnement précis.
Au lieu de récupérer 5 petits extraits, nous pouvons récupérer 50 paragraphes pertinents ou même des documents complets. Le LLM agit alors comme un filtre sophistiqué, utilisant son mécanisme d'attention pour identifier les détails spécifiques nécessaires à la requête. Cela est particulièrement efficace pour les tâches nécessitant une compréhension globale, telles que la synthèse d'un contrat juridique de 100 pages ou le débogage des fichiers journaux d'un système distribué.
Considérations architecturales
La construction d'un RAG à long contexte nécessite d'équilibrer trois facteurs :
- Latence : Le traitement de milliers de jetons prend du temps. Vous devez décider si le compromis pour une précision accrue est acceptable pour votre cas d'usage.
- Coût : Les jetons d'entrée sont moins chers que les jetons de sortie, mais les fenêtres de contexte massives finissent par s'additionner. Utilisez une récupération hiérarchique pour pré-filtrer avant l'envoi au modèle à long contexte.
- Dilution de l'attention : Bien que les modèles puissent gérer de longues entrées, les performances peuvent se dégrader si les informations pertinentes sont enfouies au milieu d'une séquence très longue (le phénomène « perdu au milieu »).
Exemple d'implémentation : Récupération hybride
Une approche robuste consiste à utiliser un modèle plus petit et rapide pour récupérer un ensemble plus large de candidats, puis à les transmettre à un modèle à long contexte pour la synthèse. Voici un extrait Python utilisant LangChain pour démontrer ce flux :
from langchain.chains import RetrievalQA
from langchain.llms import Ollama
from langchain.vectorstores import Chroma
from langchain.embeddings import OllamaEmbeddings
# Initialiser un modèle capable de long contexte
llm = Ollama(model="llama3:13b")
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# Charger le magasin de documents
db = Chroma(embedding_function=embeddings)
# Configurer le RAG pour récupérer plus d'extraits (k=20)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # Insérer tous les documents récupérés dans le contexte
retriever=db.as_retriever(search_kwargs={"k": 20}),
return_source_documents=True
)
# Requête avec une question complexe
result = qa_chain({"query": "Summarize the architectural decisions in the last three sprint reviews."})
print(result["result"])
Optimisation pour le « Perdu au milieu »
Des études récentes suggèrent que les LLM accordent le plus d'attention au début et à la fin du contexte. Lors de l'utilisation du RAG à long contexte, vous ne devriez pas simplement ajouter des documents récupérés aléatoirement. Envisagez les stratégies suivantes :
- Re-classement : Utilisez un codeur croisé (cross-encoder) pour re-classement les documents récupérés par pertinence. Placez les documents les plus pertinents au début ou à la fin du prompt.
- Structuration du prompt : Délimitez clairement les sections dans votre prompt. Utilisez des en-têtes comme
### Document de contexte 1pour aider le modèle à analyser l'entrée. - RAG itératif : Pour les contextes extrêmement longs, décomposez la tâche. D'abord, faites synthétiser les documents récupérés par le LLM, puis posez la question finale en utilisant les synthèses comme contexte.
Conclusion
Le RAG à long contexte ne vise pas à remplacer le RAG traditionnel, mais à étendre ses capacités. Il permet un raisonnement plus approfondi sur des informations complexes et interconnectées que les modèles à petit contexte ne peuvent tout simplement pas saisir. En combinant des stratégies de récupération robustes avec une ingénierie de prompt soignée, les développeurs peuvent construire des systèmes d'IA qui sont non seulement précis, mais aussi capables de gérer la complexité des données d'entreprise du monde réel. À mesure que les fenêtres de contexte continuent de croître, l'accent se déplacera de la recherche des bonnes données vers le raisonnement efficace sur celles-ci.