Retour aux projets
IA | Stage (Café Crème) · 2026

Assistant RAG interne 🧠

TypeScript
Preact
Vite
Node.js
Mistral API
RAG
PostgreSQL
Neon
SSE (streaming)
Vercel
Render
Code non public · projet entreprise

Contexte

Assistant conversationnel interne, réservé à l'équipe commerciale. Il répond aux questions sur une offre de portage entrepreneurial en s'appuyant sur deux sources documentaires : l'argumentaire produit interne, et l'historique des appels commerciaux transcrits, lus dans un data warehouse PostgreSQL (Neon) en lecture seule. Projet mené pendant mon stage IA & Automatisation chez Café Crème.

La particularité : le bot ne se contente pas de lire une documentation figée, il s'entraîne. Il pose des questions sur les points encore flous de l'offre, l'équipe répond, et ces réponses validées deviennent sa mémoire.

Fonctionnalités clés

  • Deux modes dans la même application : poser une question (chat), ou entraîner le bot (c'est lui qui interroge, l'équipe répond).
  • Réponses générées en streaming, avec les sources citées sous chaque réponse (fichier d'argumentaire, appel, réponse déjà validée par l'équipe).
  • Boucle d'apprentissage : une réponse validée est enregistrée, puis réinjectée en priorité dans le contexte des questions suivantes.
  • Feedback pouce haut / pouce bas sur chaque réponse ; un pouce bas accompagné d'une correction devient directement une entrée d'entraînement.
  • Garde-fous : le bot répond uniquement depuis le contexte fourni, distingue ce qui est validé de ce qui reste à clarifier, et dit quand il ne sait pas.
  • Règle anti-embellissement : les extraits d'appels sont balisés « non vérifié » (ce sont des transcriptions automatiques), et le bot ne peut ni fabriquer une citation, ni reprendre un chiffre entendu dans un appel, ni conclure sur l'issue d'un deal.
  • Questions de suivi générées à partir du contexte réellement disponible, pour ne proposer que des sujets que le bot sait traiter.
  • Sauvegarde et restauration de la mémoire d'entraînement (export / import), avec amorçage depuis un fichier versionné quand l'instance repart à vide.

Approche technique

Le front est une page de chat plein écran construite avec Vite, TypeScript (strict) et Preact. Le backend est un service Node.js / TypeScript en ESM, sans framework (module http natif), qui expose une poignée d'endpoints : le chat en SSE, le feedback, l'entraînement, l'export/import de la mémoire et un point de santé. Il porte aussi une liste d'origines autorisées (CORS) et un rate limiting par IP, pour éviter les appels LLM en rafale. La clé Mistral et l'accès à la base vivent uniquement côté serveur, le front ne contient aucun secret.

Le cœur du projet est la récupération de contexte. Une même fonction agrège trois sources par ordre de priorité : les questions/réponses validées par l'équipe (la mémoire construite en mode entraînement), l'argumentaire découpé en fichiers markdown thématiques (recherche locale par recouvrement de mots, déterministe et sans appel LLM), puis les appels pertinents. Elle renvoie à la fois le texte à injecter dans le prompt et la liste structurée des sources affichées dans l'UI.

Côté appels, l'extension pgvector n'était pas disponible sur la base : la recherche n'est donc pas vectorielle mais plein texte PostgreSQL (configuration french, colonne tsvector déjà indexée, classement par ts_rank). J'ai construit la requête en OR plutôt qu'en AND, parce que les lignes de transcript sont courtes : exiger tous les mots sur une même ligne ne renvoyait presque rien, alors qu'un OR classé par pertinence fait remonter les bons appels. Pour chaque appel retenu, un extrait lisible est reconstitué à partir des lignes qui matchent plus quelques lignes de contexte autour, afin de garder un morceau de dialogue compréhensible. L'accès à la base est strictement en lecture (rôle dédié, aucune écriture) : tout ce que le bot produit est stocké à part, en JSONL, en append-only.

La génération passe par l'API Mistral en streaming SSE, avec un AbortController et un délai maximum pour ne pas laisser une requête traîner. Les questions de suivi sont un second appel court, volontairement non bloquant : si elles échouent, la réponse part quand même. Déploiement : le front sur Vercel (avec des en-têtes de non-indexation, l'outil n'a rien à faire dans un moteur de recherche), le backend sur Render via un blueprint versionné, avec health check et région choisie près de la base.

Résultats

Un outil interne fonctionnel, déployé sur une URL non indexée et prêt à être utilisé par l'équipe, qui répond avec ses sources et s'enrichit de chaque réponse validée. La partie la plus intéressante du projet n'est pas le chat, mais la discipline autour : ce que le bot dit est traçable, ce qu'il ignore est assumé, et une correction humaine devient immédiatement de la connaissance réutilisable.

Sur le plan technique, c'est un RAG monté sans base vectorielle, avec les moyens du bord (recherche plein texte native, stockage fichier, hébergement gratuit), et une contrainte de lecture seule respectée de bout en bout sur le data warehouse.

Le code source n'est pas public (projet d'entreprise).

Afouanee.dev

© 2026 Afouane MOUHAMAD