====== RAG et bases de données vectorielles ====== ===== Introduction ===== Le **RAG (Retrieval-Augmented Generation)**, ou génération augmentée par récupération, représente l'une des techniques les plus puissantes pour exploiter les grands modèles de langage (LLM) sur des données privées et propriétaires. Cette approche hybride améliore les capacités des modèles de langage en intégrant des mécanismes de recherche avec des capacités génératives. Ce guide explore le fonctionnement du RAG, depuis les implémentations simples jusqu'aux architectures d'entreprise utilisant des bases de données vectorielles. ===== Qu'est-ce que le RAG ? ===== Le RAG combine deux composants essentiels pour créer un système d'IA plus précis et contextuel. ==== Composant 1 : Récupération (Retrieval) ==== Le composant de récupération vise à extraire des informations pertinentes d'un vaste corpus ou d'une base de données. Ces informations peuvent provenir de : * Ensembles de données structurées * Documents internes * Pages web * Toute autre forme de stockage textuel **Fonctionnement** : Face à une requête, le système de récupération recherche et retourne les documents ou passages les plus pertinents. Cette opération est souvent implémentée via des techniques de **recherche vectorielle**, où les requêtes et les documents sont représentés sous forme d'embeddings, et des mesures de similarité (comme la similarité cosinus) sont utilisées pour trouver les correspondances les plus proches. ==== Composant 2 : Génération augmentée (Augmented Generation) ==== Ce composant génère du texte en utilisant les informations récupérées, améliorant ainsi la qualité et la pertinence du résultat en l'ancrant dans un contenu factuel. **Fonctionnement** : Le modèle génératif, typiquement un modèle de langage basé sur l'architecture Transformer, prend les informations récupérées et la requête originale pour produire une réponse cohérente et contextuellement précise. Cette intégration permet au modèle de fournir des réponses détaillées et spécifiques plutôt que de s'appuyer uniquement sur ses connaissances pré-entraînées. ===== Avantages du RAG ===== ^ Avantage ^ Description ^ | **Accès amélioré à l'information** | Le RAG permet d'exploiter dynamiquement de vastes sources de connaissances externes, améliorant ainsi la précision et la pertinence du contenu généré | | **Réponses contextualisées** | Le composant de génération peut produire des réponses conscientes du contexte, facilitant l'interprétation d'ensembles de données complexes et de résultats | | **Réduction des hallucinations** | En s'appuyant sur des sources factuelles, le RAG diminue les risques que le modèle invente des informations | | **Actualisation des connaissances** | Permet d'utiliser des informations à jour sans avoir à réentraîner le modèle | ===== RAG simple : implémentation de base ===== La mise en œuvre du RAG est relativement simple lorsqu'il s'agit de travailler sur quelques documents. De nombreux outils proposent des fonctionnalités RAG de base prêtes à l'emploi : * [[https://anythingllm.com/|AnythingLLM]] * [[https://openai.com/|OpenAI]] (via leur API) * [[https://mistral.ai/|Mistral AI]] * [[https://claude.ai/|Claude]] (Anthropic) **Processus simplifié** : - **Upload de documents** : Vous téléchargez vos documents dans l'outil - **Indexation automatique** : L'outil crée automatiquement des embeddings de vos documents - **Interrogation** : Vous posez vos questions naturellement - **Récupération et génération** : Le système récupère les passages pertinents et génère une réponse Cette approche convient parfaitement pour : * Prototypes et preuves de concept * Petites équipes avec des besoins limités * Ensembles de documents de taille modeste (< 1000 documents) ===== Bases de données vectorielles : passage à l'échelle ===== Dans le contexte des opérations d'IA au niveau entreprise, un système RAG basique où les documents sont simplement uploadés peut ne pas toujours répondre aux standards requis. Les entreprises optent souvent pour une approche plus centralisée utilisant une **base de données vectorielle**. ==== Qu'est-ce qu'une base de données vectorielle ? ==== Une base de données vectorielle (VectorDB) fonctionne de manière similaire à une base de données traditionnelle. Cependant, elle stocke de manière unique des **embeddings de tokens**, qui sont des représentations de données récupérables. Cela permet une gestion plus efficace et organisée de données complexes. **Embeddings** : Un embedding est une représentation numérique d'un morceau de texte sous forme de vecteur (liste de nombres). Des textes similaires en termes de sens auront des vecteurs proches dans l'espace vectoriel. Par exemple : * "chat" et "félin" auront des embeddings proches * "chat" et "automobile" auront des embeddings éloignés ==== Avantages des bases de données vectorielles ==== **Stockage persistant** : Conservation permanente de toutes les données textuelles, éliminant le besoin de re-téléchargements constants. **Intégration multi-sources** : Capacité d'intégrer plusieurs sources dans une seule VectorDB. Vous pouvez connecter diverses applications, telles qu'AnythingLLM, une autre application LangChain, ou tout autre modèle de langage. **Sécurité des données améliorée** : Les informations ne sont pas stockées localement sur les machines individuelles des employés, mais sur des serveurs sécurisés et centralisés. **Externalisation de la puissance de calcul** : Décharge de la puissance de calcul et du stockage nécessaires pour exécuter les embeddings, réduisant la charge sur vos systèmes locaux. **Scalabilité** : Capacité à gérer des millions de documents et des milliers de requêtes simultanées. ==== Inconvénients potentiels ==== **Coût** : Les VectorDBs peuvent être coûteuses. Il est essentiel de s'assurer que les bénéfices surpassent l'investissement. **Compétences techniques** : La plupart des VectorDBs nécessitent des compétences en programmation pour y accéder. Il est crucial d'avoir des membres d'équipe avec cette capacité. **Complexité** : La mise en place et la maintenance nécessitent une expertise technique plus avancée qu'une solution RAG simple. ===== Principaux fournisseurs de bases de données vectorielles ===== Il existe de nombreux fournisseurs de VectorDB disponibles aujourd'hui. Parmi les plus reconnus : ^ Solution ^ Type ^ Caractéristiques ^ | [[https://weaviate.io/|Weaviate]] | Open-source | Schéma GraphQL, support multi-modal, hébergement cloud ou on-premise | | [[https://www.pinecone.io/|Pinecone]] | Cloud | Entièrement managé, optimisé pour la performance, facile à démarrer | | [[https://www.trychroma.com/|Chroma]] | Open-source | Léger, orienté développeurs, facilité d'intégration | | [[https://nuclia.com/|Nuclia]] | Cloud | Spécialisé dans la recherche sémantique, support multilingue | | [[https://www.datastax.com/products/datastax-astra|AstraDB]] | Cloud | Basé sur Cassandra, haute disponibilité | | [[https://qdrant.tech/|Qdrant]] | Open-source | Performance optimisée, support du filtrage | | [[https://milvus.io/|Milvus]] | Open-source | Très scalable, utilisé en production par de grandes entreprises | Le choix de la bonne VectorDB dépend de vos besoins spécifiques, de votre budget et des compétences techniques disponibles au sein de votre équipe. ===== Processus de stockage et d'interrogation ===== ==== Phase de stockage : préparation des données ==== Lorsque vous souhaitez stocker et traiter des données, plusieurs étapes sont nécessaires : **1. Corpus de texte en langage naturel** Vous commencez avec votre texte brut : documents Word, PDFs, pages web, fichiers texte, etc. Exemple : "The Force will be with you. Always." **2. Génération d'embeddings** Le corpus entier de texte est transformé en embeddings (à l'aide de code). Chaque morceau de texte devient un vecteur de nombres. Exemple d'embedding (simplifié) : `[0.789, -0.234, 0.156, ..., 0.421]` **3. Découpage en chunks** Le corpus embeddings est divisé en morceaux de plus petite taille. Ce découpage permet une récupération plus rapide par la suite, car le système n'a pas besoin de traiter des documents entiers. **Stratégies de découpage** : * Par taille fixe (ex : 512 tokens) * Par paragraphe ou section * Par unité sémantique (en préservant le contexte) **4. Stockage dans la base de données** Les chunks découpés sont alors stockés dans la base de données vectorielle avec leurs métadonnées (source, date, auteur, etc.). {{ :ai:vector-storage-diagram.png?600 |{{:rag:vector-storage-diagram.png?600|Diagramme du processus de stockage vectoriel}} ==== Phase d'interrogation : récupération et génération ==== Lorsque vous interrogez la base de données, plusieurs options sont disponibles : **1. Recherche vectorielle** Un LLM (ou des modèles de Machine Learning plus simples) effectue une recherche dans la base de données et récupère les chunks les plus pertinents. Le processus : - La question de l'utilisateur est transformée en embedding - Le système calcule la similarité entre cet embedding et tous les chunks stockés - Les chunks les plus similaires sont récupérés (typiquement les 3-5 meilleurs résultats) Exemple de question : "Quelle est la maison spirituelle de Jedi ?" Chunks récupérés : * **Chunk 1** : "The ancient world of Aldna was home to one of the first civilizations to explore the nature of the Force." * **Chunk 2** : "Some scholars made a case for Jedha as the homeworld of the Jedi Order's first Temple." * **Chunk 3** : "Of all Jedi, Yoda boosted home to the Consocation of the Force." **2. Augmentation du prompt** Les chunks récupérés sont ajoutés comme contexte supplémentaire au prompt que l'utilisateur a donné au LLM avec lequel il interagit. **Prompt final** (invisible pour l'utilisateur) : ``` Contexte récupéré : [Chunk 1] [Chunk 2] [Chunk 3] Question de l'utilisateur : Quelle est la maison spirituelle de Jedi ? Réponds en te basant sur le contexte fourni ci-dessus. ``` **3. Génération de la réponse** Le LLM génère une réponse en s'appuyant sur le contexte récupéré et ses connaissances générales. {{ :ai:d02-rag_with_vector_search.webp |}} ===== Architecture RAG en entreprise ===== Une architecture RAG d'entreprise typique comprend plusieurs couches : ==== Couche de données ==== * Sources multiples : documentation interne, emails, bases de connaissances, wikis * Pipelines ETL pour l'ingestion automatique * Mise à jour incrémentale (plutôt que rechargement complet) ==== Couche de traitement ==== * Service de génération d'embeddings (via OpenAI, Cohere, ou modèles auto-hébergés) * Chunking intelligent avec préservation du contexte * Métadonnées enrichies (permissions, dates, auteurs) ==== Couche de stockage ==== * Base de données vectorielle principale * Cache pour les requêtes fréquentes * Backup et réplication pour la haute disponibilité ==== Couche d'application ==== * API de recherche * Interface utilisateur (chatbot, assistant) * Gestion des permissions et de l'authentification ==== Couche de monitoring ==== * Métriques de qualité des réponses * Temps de réponse * Coûts d'utilisation ===== Considérations techniques avancées ===== ==== Choix du modèle d'embeddings ==== Le choix du modèle d'embeddings impacte fortement la qualité de la recherche : * **OpenAI text-embedding-3-large** : performant, payant * **Cohere embed-multilingual-v3** : excellent pour le multilingue * **Sentence-Transformers** : open-source, hébergeable * **BGE (Beijing Academy)** : performance comparable aux solutions commerciales **Critères de sélection** : * Langue(s) supportée(s) * Dimensionnalité des vecteurs (trade-off performance/stockage) * Coût par token * Latence ==== Stratégies de chunking ==== Le découpage du texte influence la pertinence des résultats : **Fixed-size chunking** : Morceaux de taille fixe avec overlap * Avantage : simple, prévisible * Inconvénient : peut couper au milieu d'une idée **Semantic chunking** : Découpage basé sur le sens * Avantage : préserve la cohérence sémantique * Inconvénient : plus complexe à implémenter **Document-based chunking** : Respect de la structure du document * Avantage : maintient la hiérarchie * Inconvénient : taille variable des chunks ==== Optimisation de la recherche ==== **Hybrid search** : Combinaison de recherche vectorielle et recherche par mots-clés (BM25) * Meilleure précision sur les termes techniques exacts * Résilience face aux limitations des embeddings **Re-ranking** : Ré-ordonnancement des résultats après récupération * Utilisation d'un modèle de re-ranking (comme Cohere Rerank) * Améliore la pertinence des 3-5 premiers résultats **Filtrage par métadonnées** : Pré-filtrage avant la recherche vectorielle * Par date, département, type de document * Réduit l'espace de recherche et améliore la pertinence ===== Cas d'usage en entreprise ===== ==== Support client intelligent ==== **Problème** : Les agents de support passent beaucoup de temps à chercher des réponses dans la documentation. **Solution RAG** : * Indexation de toute la base de connaissances * Réponses instantanées aux questions courantes * Suggestion de réponses aux agents avec source **Résultat** : Temps de résolution divisé par 3, satisfaction client accrue. ==== Assistant juridique ==== **Problème** : Recherche de jurisprudence et de textes de loi pertinents est chronophage. **Solution RAG** : * Indexation de la base juridique complète * Recherche sémantique dans des milliers de documents * Citations précises avec références **Résultat** : Gain de 10h/semaine par juriste. ==== Documentation technique interne ==== **Problème** : Les développeurs cherchent constamment dans Confluence, GitLab, Slack. **Solution RAG** : * Indexation multi-sources (documentation, tickets, conversations) * Assistant intégré à l'IDE * Mise à jour automatique quotidienne **Résultat** : Onboarding des nouveaux développeurs 2x plus rapide. ==== Analyse de contrats ==== **Problème** : Revue manuelle de centaines de contrats pour identifier des clauses spécifiques. **Solution RAG** : * Indexation de tous les contrats * Recherche de clauses types * Comparaison automatique **Résultat** : Due diligence 5x plus rapide. ===== Bonnes pratiques et pièges à éviter ===== ==== À faire ==== ✅ **Commencer petit** : Prototype sur un domaine limité avant de généraliser ✅ **Mesurer la qualité** : Mettre en place des métriques (précision, rappel) dès le début ✅ **Documenter les sources** : Toujours fournir les références des informations récupérées ✅ **Gérer les permissions** : S'assurer que le RAG respecte les droits d'accès aux documents ✅ **Monitorer les coûts** : Les embeddings et requêtes s'accumulent rapidement ==== À éviter ==== ❌ **Chunks trop petits ou trop grands** : Trouver le bon équilibre (généralement 200-800 tokens) ❌ **Ignorer la qualité des sources** : Garbage in, garbage out ❌ **Négliger le re-ranking** : La première passe de recherche n'est souvent pas optimale ❌ **Oublier les edge cases** : Tester avec des questions difficiles, ambiguës ou hors-sujet ❌ **Sous-estimer la maintenance** : Les données évoluent, le système doit suivre ===== Sécurité et conformité ===== ==== Protection des données ==== * **Chiffrement** : Au repos et en transit * **Isolation** : Séparation par tenant/département * **Anonymisation** : Des données sensibles avant indexation * **Audit logs** : Traçabilité de tous les accès ==== Conformité RGPD ==== * **Droit à l'oubli** : Capacité de supprimer des données indexées * **Minimisation** : N'indexer que le nécessaire * **Consentement** : Pour l'utilisation de données personnelles * **Transparence** : Informer les utilisateurs sur l'utilisation du RAG ===== Évolutions futures ===== ==== Vers le RAG multi-modal ==== Intégration d'images, vidéos et audio dans le RAG : * Embeddings multi-modaux (CLIP, ImageBind) * Recherche dans des vidéos par contenu sémantique * Analyse de documents scannés ==== RAG agentique ==== Combinaison du RAG avec l'IA agentique : * Agents qui décident quand et comment rechercher * Orchestration de multiples recherches * Validation croisée des sources ==== RAG graphique ==== Utilisation de graphes de connaissances : * Relations explicites entre concepts * Raisonnement multi-hop * Meilleure compréhension du contexte ===== Ressources complémentaires ===== **Documentation officielle** : * [[https://aws.amazon.com/what-is/retrieval-augmented-generation/|AWS - Qu'est-ce que le RAG ?]] * [[https://www.nvidia.com/en-us/glossary/retrieval-augmented-generation/|NVIDIA - Définition du RAG]] * [[https://python.langchain.com/docs/use_cases/question_answering/|LangChain - Guide RAG]] **Bases de données vectorielles** : * [[https://weaviate.io/developers/weaviate|Weaviate Documentation]] * [[https://docs.pinecone.io/|Pinecone Docs]] * [[https://docs.trychroma.com/|Chroma Documentation]] **Tutoriels pratiques** : * [[https://github.com/openai/openai-cookbook/blob/main/examples/Question_answering_using_embeddings.ipynb|OpenAI Cookbook - RAG avec embeddings]] * [[https://www.deeplearning.ai/short-courses/building-applications-vector-databases/|DeepLearning.AI - Building Applications with Vector Databases]] **Articles de recherche** : * [[https://arxiv.org/abs/2005.11401|RAG: Retrieval-Augmented Generation (papier original)]] * [[https://arxiv.org/abs/2312.10997|Seven Failure Points When Engineering a RAG System]] ===== Conclusion ===== Le RAG représente une avancée majeure dans l'utilisation pratique des grands modèles de langage. En permettant aux LLM d'accéder à des connaissances externes et actualisées, le RAG résout le problème fondamental des hallucinations et de l'obsolescence des connaissances. Les bases de données vectorielles apportent la scalabilité et les performances nécessaires pour déployer le RAG au niveau entreprise, bien que cela implique des coûts et une complexité accrus. La clé du succès réside dans : * Le choix approprié de l'architecture (simple vs. vectorielle) selon vos besoins * L'optimisation du chunking et de la recherche * La mise en place de bonnes pratiques de gouvernance et sécurité * L'itération continue basée sur les retours utilisateurs Le RAG n'est pas une solution miracle, mais correctement implémenté, il peut transformer radicalement la façon dont une organisation exploite ses connaissances internes.