Assistant RAG Sécurisé du Portfolio
Architecture RAG · LangChain · ReAct · Groq API · Pinecone
Ce projet présente le développement et la mise en production du chatbot intégré à ce portfolio. Conçu pour répondre de manière fluide et précise aux questions des visiteurs sur mes projets et mon parcours, l’assistant s’appuie sur une architecture agentique RAG (Retrieval-Augmented Generation) combinant une gestion stricte des ressources cloud gratuites et des mécanismes de sécurité et de résilience.
Contexte
Ce chatbot a avant tout été conçu comme une vitrine pour illustrer des compétences clés en ingénierie logicielle et en IA, acquises lors de mes stages et durant ma formation académique, mais qui n’avaient pas été directement mises en valeur dans mes autres projets.
- Objectif : Mettre en pratique un agent autonome complet capable de gérer des contraintes de production réelles : gestion stricte des limites et des quotas d’API, interception des causes d’erreurs potentielles, résilience face aux pannes, communication multiplateforme (web, API) et isolation des sessions utilisateurs.
- Besoin métier : Fournir un assistant interactif sur le portfolio capable d’orienter les recruteurs et visiteurs dans l’exploration de mes réalisations sans nécessiter l’intervention d’un serveur payant permanent.
Architecture Cloud & Contraintes
Le principal défi d’ingénierie a consisté à délivrer un service performant avec un temps de réponse court tout en restant exclusivement sur des offres cloud gratuites (free-tier).
- Render (Backend FastAPI) : Hébergement de l’API Python. Les limites imposent 512 Mo de RAM, une mise en veille après 15 minutes d’inactivité (cold start) et un stockage temporaire réinitialisé à chaque redémarrage.
- Pinecone (Base Vectorielle) : Indexation serverless pour le stockage des vecteurs et la recherche par similarité cosinus.
- Groq (Inférence LLM) : Exploitation des LPU (Language Processing Units) de Groq pour l’inférence des modèles, nécessitant de respecter des plafonds stricts de requêtes par minute (RPM) et de tokens par minute (TPM).
- Pinecone Inference API (Embeddings) : Pour contourner l’impossibilité de charger un modèle d’embedding lourd dans la RAM restreinte du conteneur Render (512 Mo), la vectorisation est déléguée à l’API de pinecone avec le modèle
multilingual-e5-large, garantissant une empreinte mémoire quasi-nulle sur le backend.
Méthodologie & Pipeline Agentique
Le pipeline repose sur le framework LangChain pour orchestrer le flux d’informations, l’état de la conversation et les prises de décision agentiques.
1. Découpage Stratégique des Projets en 3 Chunks
Pour éviter d’inonder le LLM avec du contexte superflu et réduire drastiquement la taille des prompts, chaque projet du portfolio est découpé stratégiquement en exactement 3 chunks distincts et typés :
- Chunk 1 - Synthèse & Contexte : Présentation générale, problème métier et environnement.
- Chunk 2 - Données & Méthodologie : Préparation des données, choix d’architecture et algorithmes.
- Chunk 3 - Résultats & Bilan : Performances obtenues, métriques clés et conclusions.
2. Gestion des Chunks par Dictionnaire
Pour maximiser l’économie de tokens face aux contraintes strictes des API gratuites :
- Recherche ciblée : L’indexation vectorielle est couplée à une table de hachage (dictionnaire de correspondance). La recherche vectorielle identifie le projet ou la section exacte concernée et n’extrait que le chunk strictement nécessaire avec un paramètre top-k = 1.
- Limitation stricte des tokens : Ce ciblage précis évite d’envoyer plusieurs blocs volumineux au LLM, réduisant la consommation de tokens au minimum et éliminant les risques de dépasser les quotas TPM de Groq.
3. Modèle Agentique ReAct à 2 Passes
L’assistant fonctionne selon le motif ReAct (Reasoning + Acting) exécuté en deux passes distinctes via LangGraph :
- Passe 1 (Analyse & Récupération) : Le modèle analyse la question de l’utilisateur, évalue si une recherche documentaire est nécessaire, identifie l’intention et extrait le chunk contextuel approprié via la recherche vectorielle ciblée.
- Passe 2 (Raisonnement & Synthèse) : Le modèle reçoit le chunk contextuel précis injecté dans un prompt système structuré, applique les garde-fous, formate la réponse et génère la synthèse finale pour l’utilisateur.
Sécurité, Robustesse & Interception d’Erreurs
L’exposition publique d’un chatbot nécessite un contrôle rigoureux pour éviter le DoS, les fuites de quota et l’injection de scripts.
1. Interception des Erreurs et Mode Dégradé
- Gestion des Quotas & Pannes : Interception globale des exceptions de requêtes HTTP (timeouts, erreurs 429 Rate Limit de Groq ou Render). En cas d’indisponibilité de l’API d’inférence, le système bascule de façon transparente vers un mode dégradé avec des messages d’erreur explicites.
2. Protection Anti-DoS & Rate Limiting
- Token Bucket : Contrôle du débit de requêtes par adresse IP pour prévenir les abus.
- Plafond Quotidien de Tokens : Suivi fin de la consommation de tokens par IP imposant une limite quotidienne stricte afin de garantir que l’usage d’un visiteur malveillant ne bloque pas l’accès pour les autres.
3. Isolation des Sessions (Anti-IDOR)
- Tokens UUIDv4 Côté Client : Un identifiant unique
UUIDv4est généré dans lelocalStoragedu navigateur. - Protection IDOR : L’historique de conversation reste scellé à cet UUIDv4, interdisant à toute personne de consulter la session d’un autre utilisateur sans jeton valide.
4. Sanitization XSS
- Échappement Strict : Tout le contenu Markdown généré par le LLM est nettoyé et assaini (côté backend et frontend) avant d’être inséré dans le DOM pour neutraliser les attaques par injection HTML/JS.
Résultats
L’assistant offre un temps de réponse réactif, tout en garantissant un coût d’infrastructure nul. La stratégie de découpage en 3 chunks et de sélection k = 1 permet de respecter scrupuleusement les quotas d’API gratuites, faisant de ce chatbot une démonstration complète et robuste d’ingénierie logicielle appliquée aux LLM.