Aller au contenu

đŸ§© 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 :

  1. 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).
  2. Recherche : Quand l’utilisateur pose une question, le systĂšme cherche les blocs les plus mathĂ©matiquement proches de la question.
  3. 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 :

  1. L’utilisateur pose une question complexe.
  2. L’Agent rĂ©flĂ©chit : “Ai-je besoin de chercher dans la base RH ou dans le code source ?”
  3. 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.

SolutionTypePoints fortsLimitesIdéal pour
ChromaIn-process (Python)Zéro configuration, embarquéPas adapté à > 1 M chunksPrototypage, labo dev
QdrantServeur DockerFiltrage payload riche, REST/gRPC, scalableInfra à gérerPME, production moderée
MilvusServeur distribuéMilliards de vecteurs, haute disponibilitéComplexe à opérerDatacenter, gros volumes
pgvectorExtension PostgreSQLVecteurs dans la base existantePerformances < bases nativesSI existant sous Postgres
SQLite + vssFichier localZéro dépendance, souveraineté maxPas de scalabilité HSolo, 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 embeddings
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;
-- Politique : chaque tenant ne voit que ses propres lignes
CREATE POLICY tenant_isolation ON documents
USING (tenant_id = current_setting('app.current_tenant')::uuid);
-- À l'exĂ©cution : positionner le tenant avant chaque recherche
SET app.current_tenant = '{{tenant_uuid}}';
SELECT content, embedding <=> query_embedding AS distance
FROM 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 QdrantClient
from qdrant_client.models import Filter, FieldCondition, MatchValue
client = QdrantClient(url="http://localhost:6333")
# Recherche scopée : seuls les vecteurs du tenant courant sont comparés
results = 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ùcheMoteur recommandéMatériel
Génération de texte (LLM)vLLM, SGLangGPU (VRAM exclusive)
GĂ©nĂ©ration d’embeddingsnomic-embed-text, mxbai-embed via OllamaCPU
Transcription vocale (STT)faster-whisper (CTranslate2)10CPU
Re-ranking, scoringCrossEncoder légerCPU

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 LLM
top_chunks = vector_db.search(query_embedding, limit=3)
# Le LLM ne reçoit que le contexte pertinent — jamais la base entiùre
context = "\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 :

FenĂȘtre de terminal
# Via Ollama
ollama pull nomic-embed-text # 137M paramĂštres, 768 dim, trĂšs rapide
ollama pull mxbai-embed-large # 335M paramÚtres, 1024 dim, meilleure qualité
# Test rapide
curl 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 :

  1. 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.
  2. 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.
  3. É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.
  4. 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.
  5. Routez les tĂąches auxiliaires sur CPU. Embeddings et transcription Whisper ne consomment pas de VRAM si on utilise faster-whisper et nomic-embed-text sur CPU. La VRAM libĂ©rĂ©e multiplie la capacitĂ© d’accueil en infĂ©rence concurrente.

📚 Sources et RĂ©fĂ©rences

Footnotes

  1. 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

  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/ ↩

  3. 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 ↩

  4. Hugging Face, Agentic RAG with SmolAgents (RAG orchestration via Hugging Face light framework), 2025. https://huggingface.co/docs/smolagents/main/examples/rag ↩ ↩2

  5. 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/ ↩

  6. 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 ↩

  7. OWASP GenAI Security Project, LLM08:2025 Vector and Embedding Weaknesses. https://genai.owasp.org/llm-top-10/ ↩

  8. Crunchy Data, Row-Level Security for tenants in Postgres / pgvector. https://www.crunchydata.com/blog/row-level-security-for-tenants-in-postgres ↩

  9. Qdrant, Multitenancy — Payload-based Partitioning. https://qdrant.tech/documentation/guides/multiple-partitions/ ↩

  10. SYSTRAN, faster-whisper — High-throughput Whisper inference on CPU and GPU (CTranslate2). https://github.com/SYSTRAN/faster-whisper ↩ ↩2