Chat RAG multi-cloud
une architecture de référence où l'application ne parle jamais directement à un modèle
Ingestion de documents, recherche vectorielle, reclassement et réponses streamées avec leurs sources, chaque appel de modèle passe par un seul proxy LiteLLM qui bascule entre Bedrock, Azure AI Foundry et Vertex AI, ou tourne entièrement en local.
- Architecture, backend, infrastructure as code
- FastAPI · React · LiteLLM · Qdrant · PostgreSQL · Redis · Terraform
- Architecture de référence publique, une démo, pas un produit
Le problème
Toute équipe qui veut « un chat sur nos documents » affronte les trois mêmes décisions : comment extraire le texte des fichiers, où mettre les vecteurs, et comment ne pas se marier à un fournisseur de modèles. Je voulais un exemple petit, complet et lisible qui rende ces décisions explicites, quelque chose à montrer dans une discussion à la place d'un tableau blanc.
Ce que j'ai construit
Ingestion : PDF, DOCX, Markdown et images passent par un parseur avec OCR optionnel (Tesseract par défaut, services cloud derrière une variable), un découpage en morceaux de 512 tokens, des embeddings demandés au proxy, et une collection Qdrant ; les tâches longues peuvent partir dans un worker Celery. Une question est vectorisée, cherchée (deux fois le nombre de candidats demandés), éventuellement reclassée, assemblée en contexte, et complétée avec la réponse streamée en SSE et ses sources citées, l'historique en PostgreSQL.
Tout l'intérêt tient dans la sortie unique : un proxy LiteLLM avec des alias de modèles, des chaînes de repli déclaratives (un alias de complétion qui essaie Claude, puis GPT-4o, puis Gemini ; un alias d'embeddings sur les trois clouds), des réessais, un cache Redis et une clé maître. Le code ne voit jamais un SDK de fournisseur ni un identifiant ; un override de compose et une config LiteLLM alternative font tourner la même pile entièrement sur un serveur de modèles local. Terraform provisionne le côté AWS (VPC, EKS, RDS, ElastiCache, ECR), et des manifests Kubernetes bruts déploient les services, avec traces OpenTelemetry et Langfuse disponibles mais désactivées par défaut.
Ce que j'ai appris
Que le patron du proxy est la partie qui vaut d'être copiée, et qu'il est honnête de dire ce qu'une architecture de référence n'est pas : l'authentification, les workers, le reclassement et les traces sont des interrupteurs laissés éteints, il n'y a pas de tests, et la base vectorielle ne fait pas partie du Terraform. Ce qu'elle montre, c'est la forme, et c'est la forme qui a été reprise dans le chat multimodal venu ensuite, avec un routeur de modèles, des assistants et des outils.
“L'application connaît des alias de modèles, pas des fournisseurs ; changer de cloud est un changement de config.”Contre-Frappe