Modular RAG
iaDéfinition
Modular RAG est une architecture RAG avancee decrite par Gao et al. (2023) qui decompose le pipeline RAG en modules independants et interchangeables, permettant de composer des workflows differents selon le type de question, le domaine, ou les ressources disponibles. C'est une evolution naturelle de l'Advanced RAG vers plus de flexibilite architecturale. Les modules fondamentaux du Modular RAG : (1) Query Processor — reformulation, decomposition, expansion des requetes, (2) Retriever — dense (vectorstore), sparse (BM25), hybride, web, SQL, APIs, (3) Reranker — cross-encoder, cohere API, custom model, (4) Context Processor — compression, filtrage, deduplication, (5) Generator — LLM de generation, (6) Validator — verification de la reponse, critiques. L'innovation est le routing adaptatif : selon le type de question (factuelle vs analytique vs creative), la complexite, et le domaine, different modules sont actives et combines. Une question factuelle simple peut aller directement retriever→generator, tandis qu'une analyse complexe peut activer query decomposition→multi-path retrieval→reranking→synthesis. LlamaIndex Workflows (depuis v0.10) et LangGraph sont les frameworks les plus adaptes au Modular RAG : ils permettent de definir des graphes de modules avec des conditions de routing, des boucles de feedback, et du parallelisme. Le code du workflow est explicitement lisible et testable. L'avantage pratique du Modular RAG en entreprise : chaque module peut etre optimise independamment, remplace par une meilleure implementation, ou desactive selon les besoins. Un retriever BM25 peut etre remplace par un retriever vectoriel ou hybride sans changer le reste du pipeline. Cela facilite la maintenance et l'evolution des systemes RAG en production.
Architecture Modular RAG
from llama_index.core.workflow import Workflow, StartEvent, StopEvent, step
class ModularRAGWorkflow(Workflow):
@step
async def route_query(self, ev: StartEvent) -> RoutingEvent:
query_type = classify_query(ev.query) # factual/analytical/creative
return RoutingEvent(query=ev.query, type=query_type)
@step
async def retrieve(self, ev: RoutingEvent) -> RetrievalEvent:
if ev.type == 'factual':
docs = await dense_retriever.aretrieve(ev.query)
else:
docs = await hybrid_retriever.aretrieve(ev.query) # Dense+sparse
return RetrievalEvent(docs=docs, query=ev.query)
@step
async def generate(self, ev: RetrievalEvent) -> StopEvent:
response = await llm.acomplete(ev.query, context=ev.docs)
return StopEvent(result=response)
Articles liés
Expert en cybersécurité offensive et intelligence artificielle. Pentest, audit et développement IA sur-mesure.
Services
- Audit Infrastructure
- Audit Kubernetes
- Audit Microsoft 365
- Audit Sécurité Réseau
- Analyse de Risques
- Audit Active Directory
- Audit Application Web
- Audit Cloud (AWS/Azure/GCP)
- Audit Messagerie
- Audit API (OWASP Top 10)
- Audit DevSecOps & CI/CD
- Audit Code Source (SAST)
- Audit Postes de Travail
- Audit Sauvegarde & Résilience
- Audit OT/SCADA (IEC 62443)
- Développement IA
- Formations
Ressources
Projets & Outils
© 2026 Ayi NEDJIMI Consultants. Tous droits réservés.
Un projet cybersécurité ?
Expert dispo · Réponse 24h