La génération augmentée par recherche (Retrieval-Augmented Generation ou RAG) combine les grands modèles de langage (LLM) avec des systèmes de recherche d’informations pour créer des applications d’IA plus fiables.
Cette approche aide à résoudre les limitations courantes des LLM comme les hallucinations et les connaissances obsolètes en ancrant les réponses dans des informations factuelles pertinentes.
Dans cet article, nous explorerons pas à pas le processus de construction d’un RAG en utilisant LangChain.
Les systèmes RAG améliorent les capacités des LLM en leur fournissant un contexte pertinent avant de générer des réponses. Cette approche offre plusieurs avantages clés :
Contrairement à un appel directe à un LLM, le RAG permet aux modèles de travailler avec vos données spécifiques et connaissances métier. Cela les rend plus précis pour des applications spécialisées où la fiabilité est importante.
C’est pourquoi créer un RAG est au coeur de notre formation LangChain en une journée : c’est un parfait cas d’usage pour découvrir un framework LLM tel que LangChain. La formation vous guide pas-à-pas dans l’implémentation de votre première architecture RAG avec LangChain en Python.
Pour implémenter un RAG, le second concept à maîtriser est la transformation du texte en langage naturel en représentations vectorielles. Ces “embeddings” ou vecteurs sémantiques capturent le sens des mots, mais dans un format informatique, c’est-à-dire un tableau de taille fixe.
Les embeddings permettant aux systèmes de trouver des contenus conceptuellement similaires, et dépassent les systèmes fondés sur les mots-clés qui sont en difficulté pour gérer des textes complexes ou même des synonymes.
Voici un exemple simple de création d’embeddings avec LangChain :
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
text = "LangChain helps build RAG applications"
vector = embeddings.embed_query(text)
# vector est maintenant une représentation numérique du sens du texte
La recherche sémantique diffère de la recherche traditionnelle en se concentrant sur l’intention et le sens plutôt que sur la simple correspondance de termes. Cela permet une récupération d’informations efficace.
Sur le plan technique, les embeddings sont calculés par des modèles d’apprentissage de représentation. Matryoshka est un puissant modèle d’embedding qui permet de gérer des embeddings de taille variables. On peut ainsi optimiser le rapport coût/précision des embeddings simplement en choissant leur longueur.
LangChain fournit des outils pour ingérer les documents, première étape de tout pipeline RAG :
# Chargement d'un document
from langchain.document_loaders import TextLoader
loader = TextLoader("./my_document.txt")
# On obtient un tableau d'objets Document
# dans un format standardisé par LangChain
# On peut aussi utiliser "load_and_split" pour procéder directement
# à un découpage du texte s'il est trop long
documents = loader.load()
Le framework propose des loaders spécialisés pour différents types de fichier et des utilitaires de découpage pour fragmenter les documents en chunks de taille raisonnable.
Les bases de données vectorielles stockent les embeddings de documents, et fournissent ensuite des opérations de recherche sémantique rapides.
Lors de l’implémentation de votre pipeline RAG, vous devrez sélectionner une base de données vectorielle qui répond à vos besoins.Voici un exemple simple de configuration de Chroma, une base de données vectorielle populaire, avec LangChain :
from langchain_chroma import Chroma
vector_store = Chroma(
collection_name="example_collection",
embedding_function=embeddings,
# Stockage local des données
persist_directory="./chroma_langchain_db",
)
uuids = [str(uuid4()) for _ in range(len(documents))]
vector_store.add_documents(documents=documents, ids=uuids)
# Recherche de 3 documents similaires à la requête
docs = db.similarity_search("How do I use LangChain?", k=3)
La base de données s’occupe de tous les aspects algorithmiques. Elle peut notamment calculer elle-même les embeddings, ou vous laisser fournir des embeddings déjà calculés, selon la situation.
La construction d’un système RAG de bout en bout nécessite de connecter les composants évoqués jusqu’à présent en un pipeline cohérent.
Lorsque l’utilisateur déclenche une requête, il s’agit tout simplement d’enrichir cette requête en s’appuyant sur des documents pertinents, récupérés dans la base de données vectorielles via une recherche sémantique.
Le processus d’implémentation comprend finalement :
Lorsqu’un utilisateur soumet une requête, votre système identifie les informations pertinentes en comparant l’embedding de la requête avec les embeddings des documents stockés. Il transmet ensuite le contexte enrichi à un LLM.
Si vous voulez découvrir des architectures RAG beaucoup plus élaborées, la publication de recherche de Gao et al. est une revue de littérature incontournable recensant de nombreux systèmes RAG.
Les systèmes RAG, comme toutes les applications fondées sur les LLM nécessitent une surveillance et une optimisation continues. L’implémentation n’était que la première étape du travail !
LangSmith fournit des outils pour suivre vos applications LangChain, vous aidant à identifier et résoudre les problèmes dans vos processus de récupération et de génération.
Nous mettons en place LangSmith dès le début de notre formation à LangChain, avant même d’aborder la création d’agents en combinant LangChain et LangGraph.
L’apprentissage de la construction de systèmes RAG avec LangChain suit une progression naturelle, de la compréhension des concepts fondamentaux à l’implémentation de fonctionnalités avancées.
En maîtrisant chaque composant — embedding, récupération, génération et monitoring — vous développerez les compétences pour créer des applications d’IA plus fiables.
Implémenter une architecture RAG avec LangChain constitue un excellent exercice d’apprentissage pour découvrir le développement LLM. Il s’agit d’après nous du point de départ idéal pour une formation LangChain.
Une fois que vous avez maîtrisé les bases, vous pouvez améliorer votre système RAG avec des capacités avancées comme la mémoire conversationnelle, les architectures de type agent, l’utilisation d’un moteur de recherche pour LLM tel que Tavily.
Ces ajouts permettent à votre application de maintenir le contexte lors d’interactions prolongées et d’effectuer des tâches de raisonnement complexes, en plus de s’appuyer sur des documents à jour selon la logique RAG.
Ces capacités transforment les systèmes basiques de questions-réponses en assistants IA sophistiqués capables de résoudre des problèmes complexes.
Vous l’avez peut-être déjà deviné, mais cet article a été en grande partie généré à l’aide d’une architecture RAG couplant LangChain, Tavily, et nos propres contenus de formation LangChain !
Les experts SEO l’auront aussi compris, les résultats de recherche sont désormais destinés à être consommés par des LLM et aussi gérés par des LLM. Un article de Forbes explique par exemple comment les principes E-A-T (Expertise, Authoritativeness, Trustworthiness) deviennent cruciaux avec l’émergence de moteurs de recherche fondés sur les LLM.
Le paradigme RAG continue d’évoluer, avec des développements dans les implémentations multimodales qui peuvent traiter à la fois du texte et des images. À mesure que les LLM et les moteurs de recherche sémantiques progressent, rester à jour avec les dernières techniques vous aidera à construire des applications de plus en plus sophistiquées.
Vous avez apprécié cette ressource ?
Découvrez toutes nos formations Next.js, Astro.js et LangChain en présentiel ou en distanciel
Eric Burel est ingénieur diplômé de l'ENSIMAG. Il est co-fondateur de LBKE et a contribué à la création de plusieurs startups technologiques en tant que développeur freelance.
Eric est impliqué dans l'open source en tant que membre du collectif Devographics, qui organise les enquêtes annuelles "State of" JavaScript, React et AI.
Il contribue aussi au domaine de l'intelligence artificielle en tant que membre de la communauté LangChain.
Depuis 2018, Eric intervient comme formateur en entreprise et enseignant en école d'ingénieur, dans le domaine du développement web et du développement LLM.
Ses années d'expérience en tant que consultant lui ont permis de développer une culture technique large, qu'il mobilise pour créer des formations qui répondent aux besoins concrets des participants.
Il partage régulièrement ses connaissances à travers des articles publiés sur Smashing Magazine, sur son blog et via les cours en ligne NextPatterns et AstroPatterns.
Si vous passez par Montpellier, vous le croiserez sûrement au détour d'un meetup MontpellierJS ou Gen-AI !