đ§© RAG & Agents : L'architecture de la connaissance
Un LLM ânuâ qui sort dâusine est figĂ© dans le temps. Ses poids internes contiennent une vaste culture gĂ©nĂ©rale, mais il ignore tout de vos documents dâentreprise, de vos rĂ©unions de la veille ou de lâĂ©tat de votre base de donnĂ©es. Pire : si vous tentez de lui apprendre ces informations via un rĂ©entraĂźnement (Fine-Tuning), cela vous coĂ»tera trĂšs cher pour un rĂ©sultat souvent dĂ©cevant sur la restitution de faits prĂ©cis.
Pour transformer ce moteur statistique aveugle en un assistant dâentreprise souverain, la solution logicielle standard est le RAG (Retrieval-Augmented Generation)1. Et depuis 2025, ce concept a Ă©voluĂ© vers des Workflows Agentiques autonomes.
1. Le RAG Standard : La recherche vectorielle
Lâapproche RAG classique (trĂšs populaire entre 2023 et 2024) est une chaĂźne linĂ©aire :
- Ingestion : Vos documents (PDF, Word, Code) sont découpés en petits blocs (les chunks). Un modÚle spécialisé convertit ces blocs en listes de nombres (Embeddings) et les stocke dans une Base de Données Vectorielle (comme Qdrant, Milvus ou Chroma).
- Recherche : Quand lâutilisateur pose une question, le systĂšme cherche les blocs les plus mathĂ©matiquement proches de la question.
- GĂ©nĂ©ration : Le systĂšme colle ces blocs dans le prompt de lâutilisateur de maniĂšre invisible, puis envoie le tout au LLM pour gĂ©nĂ©rer la rĂ©ponse.
â ïž La limite physique (Le mur du KV Cache)
Le RAG standard a un dĂ©faut dâarchitecture en local : il est aveugle. Pour ĂȘtre sĂ»r de ne rien rater, le dĂ©veloppeur configure souvent la base pour renvoyer les 20 meilleurs rĂ©sultats. Le prompt final gonfle dĂ©mesurĂ©ment, saturant la FenĂȘtre de contexte du modĂšle. Comme nous lâavons vu au chapitre matĂ©riel, un contexte gĂ©ant fait exploser la taille du KV Cache, dĂ©truisant la VRAM de votre serveur et effondrant vos performances en infĂ©rence2.
2. LâĂvolution 2026 : Agentic RAG et GraphRAG
Pour Ă©viter de saturer la mĂ©moire avec des informations inutiles, le marchĂ© a basculĂ© vers le RAG Agentique (Agentic RAG)13. Au lieu dâĂȘtre un tuyau passif, le LLM devient le pilote.
Le framework de lâAgent
Grùce à des bibliothÚques comme SmolAgents (Hugging Face) ou LangGraph, le développeur donne au LLM des Outils (Tool Calling / Function Calling). Le déroulé devient dynamique :
- Lâutilisateur pose une question complexe.
- LâAgent rĂ©flĂ©chit : âAi-je besoin de chercher dans la base RH ou dans le code source ?â
- LâAgent appelle lâoutil de recherche, lit un rĂ©sumĂ©, et dĂ©cide lui-mĂȘme si lâinformation est suffisante ou sâil doit faire une nouvelle recherche affine, avant de rĂ©diger sa rĂ©ponse finale4.
Le GraphRAG
PopularisĂ© par les recherches de Microsoft, le GraphRAG remplace la base vectorielle âbĂȘteâ par un Knowledge Graph (Graphe de connaissances)5. Le systĂšme extrait les entitĂ©s (Personnes, Lieux, Concepts) et leurs relations. Cela permet au LLM de rĂ©pondre Ă des questions globales (ex: âQuels sont les thĂšmes principaux abordĂ©s par lâĂ©quipe produit ce mois-ci ?â) qui faisaient systĂ©matiquement Ă©chouer le RAG vectoriel classique.
3. Lâapproche Memory Tree
PlutĂŽt que dâutiliser une lourde base vectorielle, une architecture alternative sâappuie sur des dossiers Markdown hiĂ©rarchiques et une base de mĂ©tadonnĂ©es SQLite locale6. LâidĂ©e est de donner Ă lâagent une vue rĂ©sumĂ©e de la connaissance disponible, et de ne charger le dĂ©tail que si nĂ©cessaire. Ce pattern est dĂ©taillĂ© dans la fiche Memory Tree.
- HiĂ©rarchie : Lâagent ne charge jamais un document entier en mĂ©moire. Il utilise le LLM pour lire le âtitreâ et un ârĂ©sumĂ© dâune ligneâ de lâarbre des fichiers.
- Injection sĂ©lective : Sâil juge un fichier pertinent, lâagent appelle une fonction pour âdĂ©plierâ ce nĆud spĂ©cifique de lâarbre et lire son contenu exact.
- Avantage architectural : Le contexte reste minuscule (quelques centaines de tokens pour les rĂ©sumĂ©s), ce qui maintient le TTFT (Temps avant le premier mot) sous la seconde et prĂ©serve les ressources matĂ©rielles, mĂȘme avec un modĂšle dense lourd.
4. Choisir sa base de données vectorielle
Le choix de la base vectorielle dépend du volume de données, du niveau de souveraineté requis et des ressources disponibles.
| Solution | Type | Points forts | Limites | Idéal pour |
|---|---|---|---|---|
| Chroma | In-process (Python) | Zéro configuration, embarqué | Pas adapté à > 1 M chunks | Prototypage, labo dev |
| Qdrant | Serveur Docker | Filtrage payload riche, REST/gRPC, scalable | Infra à gérer | PME, production moderée |
| Milvus | Serveur distribué | Milliards de vecteurs, haute disponibilité | Complexe à opérer | Datacenter, gros volumes |
| pgvector | Extension PostgreSQL | Vecteurs dans la base existante | Performances < bases natives | SI existant sous Postgres |
| SQLite + vss | Fichier local | Zéro dépendance, souveraineté max | Pas de scalabilité H | Solo, Memory Tree patterns |
5. RAG multi-locataire : cloisonnement des embeddings
Dans les dĂ©ploiements multi-tenant â un serveur dâinfĂ©rence mutualisĂ© pour plusieurs organisations ou Ă©quipes â le RAG introduit un risque de sĂ©curitĂ© critique : la fuite de documents dâun locataire vers les rĂ©sultats de recherche dâun autre.
LâOWASP a formellement classifiĂ© ce risque dans son Top 10 LLM 2025 sous LLM08 : Vector and Embedding Weaknesses7. Une implĂ©mentation naĂŻve de base vectorielle sans isolation par tenant peut permettre Ă une requĂȘte du âClient Bâ de remonter des embeddings appartenant au âClient Aâ.
Pattern 1 â Row-Level Security avec pgvector
Si votre infrastructure repose dĂ©jĂ sur PostgreSQL, lâextension pgvector permet de stocker les embeddings dans la mĂȘme base. Le cloisonnement sâappuie sur le mĂ©canisme natif de Row-Level Security (RLS) du moteur8 :
-- Activer RLS sur la table des embeddingsALTER TABLE documents ENABLE ROW LEVEL SECURITY;
-- Politique : chaque tenant ne voit que ses propres lignesCREATE POLICY tenant_isolation ON documents USING (tenant_id = current_setting('app.current_tenant')::uuid);
-- Ă l'exĂ©cution : positionner le tenant avant chaque rechercheSET app.current_tenant = '{{tenant_uuid}}';SELECT content, embedding <=> query_embedding AS distanceFROM documents ORDER BY distance LIMIT 5;Avantage : le moteur PostgreSQL applique le filtre tenant au plus bas niveau â une requĂȘte mal formĂ©e au niveau applicatif ne peut pas contourner la politique. Le cloisonnement est mathĂ©matiquement garanti par la base, pas par la logique applicatif.
Limite : les performances de pgvector restent infĂ©rieures Ă celles dâune base vectorielle native pour des volumes supĂ©rieurs Ă ~1 M embeddings.
Pattern 2 â Payload-based partitioning avec Qdrant
Qdrant recommande nativement une architecture de collection unique exploitant le Payload-based Partitioning9. Chaque embedding est indexĂ© avec un payload tenant_id, et les clĂ©s dâaccĂšs vectorielles sont scopĂ©es Ă un tenant au moment de la recherche :
from qdrant_client import QdrantClientfrom qdrant_client.models import Filter, FieldCondition, MatchValue
client = QdrantClient(url="http://localhost:6333")
# Recherche scopĂ©e : seuls les vecteurs du tenant courant sont comparĂ©sresults = client.search( collection_name="documents", query_vector=query_embedding, query_filter=Filter( must=[FieldCondition( key="tenant_id", match=MatchValue(value=current_tenant_id) )] ), limit=5)Avantage : une seule collection, pas de multiplications de collections par tenant (ce qui ferait sâeffondrer le cluster Ă grande Ă©chelle). Le filtre payload est appliquĂ© avant le calcul de similaritĂ© vectorielle.
6. FinOps : routage CPU/GPU et pré-filtrage RAG
LâinfĂ©rence GPU coĂ»te cher. Une architecture bien conçue rĂ©serve le GPU Ă la seule tĂąche oĂč il est irremplaçable â la gĂ©nĂ©ration de texte â et dĂ©lĂšgue les tĂąches auxiliaires au CPU.
Routage CPU/GPU
| Tùche | Moteur recommandé | Matériel |
|---|---|---|
| Génération de texte (LLM) | vLLM, SGLang | GPU (VRAM exclusive) |
| GĂ©nĂ©ration dâembeddings | nomic-embed-text, mxbai-embed via Ollama | CPU |
| Transcription vocale (STT) | faster-whisper (CTranslate2)10 | CPU |
| Re-ranking, scoring | CrossEncoder léger | CPU |
faster-whisper (implĂ©mentation Whisper de SYSTRAN sur le moteur CTranslate2) peut transcrire en temps rĂ©el des audio courts directement sur CPU, sans utiliser un seul octet de VRAM10. Les modĂšles dâembedding comme nomic-embed-text sont suffisamment petits pour sâexĂ©cuter efficacement en batch asynchrone sur CPU.
BĂ©nĂ©fice : 100 % de la VRAM du GPU reste disponible pour la gĂ©nĂ©ration. Sur un serveur 2Ă L40S (96 Go), ce routage peut doubler ou tripler le nombre dâutilisateurs simultanĂ©s servis par rapport Ă une configuration oĂč les embeddings et Whisper partagent la VRAM.
Pré-filtrage RAG : le levier FinOps le plus puissant
Lâerreur classique est dâenvoyer au LLM lâintĂ©gralitĂ© des documents rĂ©cupĂ©rĂ©s par la base vectorielle. Les API cloud facturent au token ; les modĂšles locaux saturent leur fenĂȘtre de contexte.
Le principe : câest le microservice Python qui exĂ©cute la recherche sĂ©mantique, pas le LLM. Le LLM ne reçoit que les K meilleurs rĂ©sultats, tronquĂ©s Ă quelques centaines de tokens chacun :
# Le Python sélectionne le Top-K avant d'appeler le LLMtop_chunks = vector_db.search(query_embedding, limit=3)
# Le LLM ne reçoit que le contexte pertinent â jamais la base entiĂšrecontext = "\n\n".join([chunk.text for chunk in top_chunks])response = llm.generate(prompt=f"Contexte :\n{context}\n\nQuestion : {user_query}")Sur un cas dâusage de type âcopilot documentaireâ, passer de 20 rĂ©sultats (pratique courante) Ă 3 rĂ©sultats filtrĂ©s rĂ©duit les tokens envoyĂ©s au LLM dâun facteur 5 Ă 10, sans dĂ©gradation perceptible de la qualitĂ© si la recherche sĂ©mantique est bien calibrĂ©e.
7. Architecture de rĂ©fĂ©rence â Stack RAG souveraine
flowchart TD
A["Documents\n(PDF, MD, DOCX)"] --> B["Chunking + Embedding\n(nomic-embed-text, mxbai-embed via Ollama)"]
B --> C["Base vectorielle locale\n(Qdrant)"]
C --> D["Agent de routage\n(modĂšle 7â8B rapide)"]
D --> E["Base vec."]
D --> F["Outil web / FS"]
E --> G["Contexte assemblé"]
F --> G
G --> H["LLM principal (70B)\nâ gĂ©nĂ©ration de la rĂ©ponse"]
ModĂšles dâembedding locaux recommandĂ©s :
# Via Ollamaollama pull nomic-embed-text # 137M paramÚtres, 768 dim, trÚs rapideollama pull mxbai-embed-large # 335M paramÚtres, 1024 dim, meilleure qualité
# Test rapidecurl http://localhost:11434/api/embeddings \ -d '{"model": "nomic-embed-text", "prompt": "La bande passante mĂ©moire limite l'\''infĂ©rence."}'đ Le Conseil de lâArchitecte
Pour construire une stack logicielle dâentreprise souveraine en 2026 :
- DĂ©diez un petit modĂšle au routage : Nâutilisez pas votre gros modĂšle 70B pour choisir quel outil appeler. Utilisez un modĂšle ultra-rapide (ex: Qwen 2.5 7B ou Llama 3 8B) configurĂ© pour lâappel d'outils. Il appellera la base de donnĂ©es.
- Gardez les gros modĂšles pour la synthĂšse : Une fois les bons blocs de texte rĂ©cupĂ©rĂ©s par le petit agent, envoyez le tout au modĂšle lourd (le âcerveauâ) pour rĂ©diger la rĂ©ponse finale.
- Ăvitez les dĂ©pendances Cloud : Si vous utilisez LangChain ou LlamaIndex, auditez la tĂ©lĂ©mĂ©trie. En on-premise pur, des frameworks minimalistes comme SmolAgents garantissent que vos prompts ne fuiteront pas vers une API externe pendant lâorchestration4.
- Isolez les embeddings par tenant dÚs le premier jour. Un RAG multi-tenant sans isolation (RLS pgvector ou payload Qdrant) est une faille de sécurité garantie. Ajouter ce cloisonnement aprÚs coup sur une base de production est coûteux.
- Routez les tĂąches auxiliaires sur CPU. Embeddings et transcription Whisper ne consomment pas de VRAM si on utilise
faster-whisperetnomic-embed-textsur CPU. La VRAM libĂ©rĂ©e multiplie la capacitĂ© dâaccueil en infĂ©rence concurrente.
đ Sources et RĂ©fĂ©rences
Footnotes
-
Lyzr Blog, What is Agentic RAG? Everything You Need to Know in 2026 (Ăvolution des pipelines statiques vers lâadaptation intelligente), Janvier 2026. https://www.lyzr.ai/blog/agentic-rag/ â© â©2
-
NVIDIA Technical Blog, Mastering LLM Techniques: Inference Optimization (Impact du contexte long sur le KV Cache), Novembre 2023. https://developer.nvidia.com/blog/mastering-llm-techniques-inference-optimization/ â©
-
Vinod Rane (Medium), Next-Generation Agentic RAG with LangGraph (2026 Edition) (Graph orchestration, self-correcting RAG), Mars 2026. https://medium.com/@vinodkrane/next-generation-agentic-rag-with-langgraph-2026-edition-d1c4c068d2b8 â©
-
Hugging Face, Agentic RAG with SmolAgents (RAG orchestration via Hugging Face light framework), 2025. https://huggingface.co/docs/smolagents/main/examples/rag â© â©2
-
Neo4j Developer Blog, What is agentic RAG? A developerâs guide (GraphRAG, ReAct, multi-agent RAG patterns), Mai 2026. https://neo4j.com/blog/agentic-ai/what-is-agentic-rag/ â©
-
OpenHuman, Memory Trees (GitBook â pipeline local SQLite + Markdown, injection sĂ©lective pour Ă©conomie VRAM), 2025. Note : OpenHuman utilise par dĂ©faut un backend cloud pour le routage des modĂšles. Le pattern Memory Tree reste applicable dans une implĂ©mentation 100% on-premise indĂ©pendante du projet. https://tinyhumans.gitbook.io/openhuman/features/memory-tree â©
-
OWASP GenAI Security Project, LLM08:2025 Vector and Embedding Weaknesses. https://genai.owasp.org/llm-top-10/ â©
-
Crunchy Data, Row-Level Security for tenants in Postgres / pgvector. https://www.crunchydata.com/blog/row-level-security-for-tenants-in-postgres â©
-
Qdrant, Multitenancy â Payload-based Partitioning. https://qdrant.tech/documentation/guides/multiple-partitions/ â©
-
SYSTRAN, faster-whisper â High-throughput Whisper inference on CPU and GPU (CTranslate2). https://github.com/SYSTRAN/faster-whisper â© â©2
Références entrantes
- đïž La Bande Passante MĂ©moire & Le "Memory Wall"
- đą Multi-tenant
- đ SĂ©curitĂ© de l'infĂ©rence locale
- đ€ Agents & Assistants On-Premise
- đ§âđŒ Assistants Personnels On-Premise
- đ§Ș Ăvaluer un modĂšle local
- đ DĂ©marrer avec Ollama
- đ Index Zero to Hero
- Agent autonome (LLM)
- AnythingLLM
- Appel d'outils (Tool / Function Calling)
- Base de données vectorielle
- Embedding
- GraphRAG
- Khoj
- LangGraph
- Memory Tree
- Open WebUI
- OpenHands
- OpenHuman
- RAG
- SearXNG
- SmolAgents