DevLog Jour 2 : comment fonctionne l'IA de CoachGPT
Plongée technique dans le système d'IA de CoachGPT : détection d'intentions, parsing structuré, streaming temps réel et contexte personnalisé.
25 février 2026 · Arsène
DevLog Jour 2 : Comment fonctionne l'IA de CoachGPT
Dans le DevLog Jour 1, j'ai raconté pourquoi j'ai créé CoachGPT. Aujourd'hui, je vous emmène dans les coulisses techniques : comment fonctionne l'IA qui alimente le coach.
Spoiler : c'est beaucoup plus compliqué que "on envoie votre message à ChatGPT et on affiche la réponse".
Le problème des chatbots fitness génériques
Quand vous posez une question fitness à ChatGPT ou Claude directement, vous obtenez une réponse conversationnelle. C'est utile pour des questions ponctuelles, mais ça ne fait pas un coach.
Pourquoi ? Parce qu'un vrai coach doit :
- Comprendre l'intention derrière votre message
- Générer du contenu structuré (un programme, pas juste du texte)
- Sauvegarder et tracker ce contenu dans votre profil
- S'adapter à votre historique et votre progression
- Répondre en temps réel sans vous faire attendre 15 secondes
Chacun de ces points est un défi technique. Voici comment on les a résolus.
L'architecture : Intent Detection → Routing → Prompt → Parser
Quand vous envoyez un message à CoachGPT, voici ce qui se passe en coulisses :
Votre message
↓
Intent Detector (détecte ce que vous voulez)
↓
Router (sélectionne le bon pipeline)
↓
Context Builder (injecte votre profil, historique, préférences)
↓
Prompt System (prompt spécialisé pour l'intent)
↓
Claude API (génération de la réponse)
↓
Parser (extrait les données structurées)
↓
Sauvegarde en base + réponse streamée
Chaque étape est un module indépendant, testable et optimisé.
Les 9 intents : la spécialisation est la clé
La première décision architecturale a été de ne pas utiliser un seul prompt générique. À la place, on a 9 systèmes spécialisés :
Intent 1 : Workout (séance unique)
Déclencheur : "fais-moi une séance haut du corps", "workout 45 min avec haltères" Sortie : JSON structuré avec exercices, séries, reps, repos, notes Tokens max : 2 000
C'est l'intent le plus utilisé. L'IA génère un workout complet que l'utilisateur peut sauvegarder d'un clic et tracker en salle.
Intent 2 : Programme (multi-semaines)
Déclencheur : "programme 8 semaines prise de masse", "plan d'entraînement mensuel" Sortie : JSON avec semaines, jours, séances, progression Tokens max : 8 000
Le plus complexe. L'IA doit planifier la périodisation, la progression des charges et la répartition des groupes musculaires sur plusieurs semaines.
Intent 3 : Nutrition (recettes + macros)
Déclencheur : "recette riche en protéines", "repas pour sèche 1800 kcal" Sortie : JSON avec ingrédients, quantités, macros par portion, instructions Tokens max : 3 000
L'intent qui différencie le plus CoachGPT des chatbots classiques. Les recettes sont structurées, avec des ingrédients qu'on trouve en France et des macros calculées.
Intent 4 : Meal Plan (plan de repas hebdomadaire)
Déclencheur : "plan de repas pour la semaine", "menu 7 jours végétarien" Sortie : JSON avec jours, repas, recettes, macros journalières, shopping list Tokens max : 4 000
L'utilisateur obtient un plan complet avec une liste de courses triée par rayon de supermarché. C'est l'une des fonctionnalités les plus appréciées.
Intent 5 : Progress (analyse de progression)
Déclencheur : "comment j'ai progressé ce mois ?", "montre mes stats" Sortie : analyse textuelle avec données et recommandations Tokens max : 800
L'IA accède à votre historique de séances, vos PRs et vos mesures pour fournir une analyse personnalisée.
Intents 6-9 : Recovery, Form Tips, Motivation, General
Des intents plus légers pour les conseils de récupération, la technique des exercices, la motivation et les questions générales. Chacun a son prompt système optimisé.
Pourquoi la détection d'intent par regex
Quand on a 9 intents, la première question est : comment savoir quel intent déclencher ?
On a commencé avec un LLM (Claude Haiku) pour la détection. Ça marchait, mais ça ajoutait 500 à 800 ms de latence à chaque message. Pour un chatbot, c'est énorme.
Solution : regex-first, LLM-fallback. On a construit un détecteur basé sur des mots-clés et des patterns :
- "séance" / "workout" / "entraînement" → workout
- "programme" / "plan d'entraînement" / "X semaines" → programme
- "recette" / "repas" / "calories" → nutrition
- "plan de repas" / "menu semaine" → meal_plan
- "progrès" / "stats" / "PR" → progress
La regex couvre 95 % des cas en 1 à 2 ms. Pour les 5 % ambigus, on bascule vers le LLM.
Le détecteur gère aussi les accents (entrainement = entraînement), les fautes de frappe courantes et les formulations naturelles en français.
Le parsing : transformer du texte en données
C'est le défi technique le plus sous-estimé. Claude génère du texte. Mais pour sauvegarder un workout dans la base de données, on a besoin de JSON structuré.
Le système fonctionne en deux temps :
1. Prompt engineering
Chaque intent a un prompt système qui spécifie le format de sortie exact. Par exemple, pour un workout :
Tu dois générer un workout au format JSON dans un bloc de code markdown.
Le JSON doit avoir cette structure :
{
"type": "workout",
"title": "...",
"exercises": [
{
"name": "...",
"sets": 4,
"reps": "8-12",
"rest": 90,
"notes": "..."
}
]
}
2. Parser robuste
Même avec un prompt précis, l'IA peut générer du JSON légèrement incorrect, ajouter du texte avant/après le bloc ou utiliser des guillemets non standards. Le parser gère tout ça :
- extraction du bloc JSON, même s'il est entouré de texte ;
- correction des erreurs de format courantes ;
- validation des champs requis ;
- valeurs par défaut pour les champs manquants.
Ce parser a été le module le plus testé du backend, avec plus de 50 cas de test couvrant les cas limites.
Le streaming : la réponse en temps réel
Personne ne veut attendre 10 secondes en fixant un écran vide. Le streaming SSE (Server-Sent Events) permet d'afficher la réponse de l'IA au fur et à mesure qu'elle est générée.
Le flux technique :
- Le frontend ouvre une connexion SSE vers
/api/v1/ai/stream. - Le backend appelle Claude en mode streaming.
- Chaque token généré est relayé au frontend via SSE.
- Le frontend affiche le texte progressivement.
- À la fin, le JSON complet est parsé et un aperçu interactif apparaît.
L'expérience utilisateur est fluide : vous voyez la réponse s'écrire en direct, puis un bouton "Sauvegarder ce workout" apparaît dès que la génération est terminée.
Le défi du JSON caché
Pendant le streaming, les tokens JSON arrivent un par un. Afficher {"type":"wo à l'écran serait une mauvaise expérience. Notre solution : cacher le JSON brut pendant le streaming et le remplacer par un placeholder animé ("Génération en cours..."), puis afficher l'aperçu complet une fois le bloc JSON terminé.
Le contexte utilisateur : ce qui rend l'IA intelligente
Un chatbot qui ne connaît pas votre historique donne des conseils génériques. CoachGPT injecte du contexte dans chaque interaction :
- Profil : âge, poids, objectifs, niveau, équipement
- Dernières séances : exercices, charges, volumes récents
- PRs actuels : records personnels sur les mouvements composés
- Préférences : aliments aimés/détestés, restrictions alimentaires
- Historique de conversation : ce dont vous avez déjà parlé
Ce contexte est compilé et injecté dans le prompt système avant chaque appel à Claude. L'IA a toujours une vue d'ensemble de votre profil.
La gestion de la mémoire longue
Les conversations longues dépassent la fenêtre de contexte de l'IA. Solution : un service de summarisation qui compresse automatiquement les vieux messages en résumé. Au-delà de 20 messages pour les intents structurés (ou 40 pour les conversations générales), les anciens messages sont remplacés par un résumé concis généré par Haiku.
Les leçons apprises
Après des mois de développement et des centaines de tests utilisateurs, voici ce qu'on a appris :
1. La spécialisation bat la généralisation
Un seul prompt "coach fitness" donne des résultats médiocres. 9 prompts spécialisés donnent des résultats excellents. La qualité augmente drastiquement quand le système sait exactement ce qu'on lui demande.
2. Le parsing est plus dur que la génération
Faire générer du texte à une IA est facile. Extraire des données structurées fiables de cette sortie est un cauchemar d'edge cases. Prévoyez trois fois plus de temps pour le parsing que pour le prompt.
3. La latence tue l'expérience
Chaque milliseconde compte. Le passage à la regex pour la détection d'intent, le streaming SSE et l'optimisation des prompts sont des décisions critiques pour l'UX.
4. Le contexte fait toute la différence
La même question posée par un débutant de 60 kg et un pratiquant avancé de 90 kg doit donner des réponses différentes. Sans injection de contexte, l'IA ne peut pas faire cette distinction.
5. Testez avec de vrais utilisateurs
Nos 50 cas de test ne couvraient pas les formulations réelles des utilisateurs. "Fais-moi un truc pour les bras mdr" est une demande valide qu'il faut gérer.
La suite
Le système d'IA de CoachGPT continue d'évoluer. Ce qui arrive :
- Orchestrateur orienté agents : un système plus flexible où des agents spécialisés collaborent pour répondre aux demandes complexes ;
- Intégration des capteurs : adapter les recommandations en fonction des données de montres connectées ;
- Analyse de vidéo : correction de technique par caméra (recherche en cours).
Le DevLog Jour 3 portera sur le système de gamification et pourquoi les tokens changent tout pour la rétention. Rendez-vous au prochain épisode.
— Arsène
Cet article fait partie du DevLog CoachGPT. Retrouvez tous les épisodes sur coachgpt.fit/blog.