DevLog Jour 2 : Comment fonctionne l'IA de CoachGPT

Plongee technique dans le systeme d'IA de CoachGPT. 9 intents, parsing structure, streaming temps reel : comment on a construit un vrai coach IA.

Arsene
8 min read
Partager:

DevLog Jour 2 : Comment fonctionne l'IA de CoachGPT

Dans le DevLog Jour 1, j'ai raconte pourquoi j'ai cree CoachGPT. Aujourd'hui, je vous emmene dans les coulisses techniques : comment fonctionne l'IA qui alimente le coach.

Spoiler : c'est beaucoup plus complique que "on envoie votre message a ChatGPT et on affiche la reponse".

Le probleme des chatbots fitness generiques

Quand vous posez une question fitness a ChatGPT ou Claude directement, vous obtenez une reponse conversationnelle. C'est utile pour des questions ponctuelles, mais ca ne fait pas un coach.

Pourquoi ? Parce qu'un vrai coach doit :

  1. Comprendre l'intention derriere votre message
  2. Generer du contenu structure (un programme, pas juste du texte)
  3. Sauvegarder et tracker ce contenu dans votre profil
  4. S'adapter a votre historique et votre progression
  5. Repondre en temps reel sans vous faire attendre 15 secondes

Chacun de ces points est un defi technique. Voici comment on les a resolus.

L'architecture : Intent Detection → Routing → Prompt → Parser

Quand vous envoyez un message a CoachGPT, voici ce qui se passe en coulisses :

Votre message
    ↓
Intent Detector (detecte ce que vous voulez)
    ↓
Router (selectionne le bon pipeline)
    ↓
Context Builder (injecte votre profil, historique, preferences)
    ↓
Prompt System (prompt specialise pour l'intent)
    ↓
Claude API (generation de la reponse)
    ↓
Parser (extrait les donnees structurees)
    ↓
Sauvegarde en base + reponse streamee

Chaque etape est un module independant, testable, et optimise.

Les 9 intents : la specialisation est la cle

La premiere decision architecturale a ete de NE PAS utiliser un seul prompt generique. A la place, on a 9 systemes specialises :

Intent 1 : Workout (seance unique)

Declencheur : "fais-moi une seance haut du corps", "workout 45 min avec halteres" Sortie : JSON structure avec exercices, series, reps, repos, notes Tokens max : 2 000

C'est l'intent le plus utilise. L'IA genere un workout complet que l'utilisateur peut sauvegarder d'un clic et tracker en salle.

Intent 2 : Programme (multi-semaines)

Declencheur : "programme 8 semaines prise de masse", "plan d'entrainement mensuel" Sortie : JSON avec semaines, jours, seances, progression Tokens max : 8 000

Le plus complexe. L'IA doit planifier la periodisation, la progression des charges, et la repartition des groupes musculaires sur plusieurs semaines.

Intent 3 : Nutrition (recettes + macros)

Declencheur : "recette riche en proteines", "repas pour seche 1800 kcal" Sortie : JSON avec ingredients, quantites, macros par portion, instructions Tokens max : 3 000

L'intent qui differencie le plus CoachGPT des chatbots classiques. Les recettes sont structurees, avec des ingredients qu'on trouve en France, et des macros calcules.

Intent 4 : Meal Plan (plan de repas hebdomadaire)

Declencheur : "plan de repas pour la semaine", "menu 7 jours vegetarien" Sortie : JSON avec jours, repas, recettes, macros journalieres, shopping list Tokens max : 4 000

L'utilisateur obtient un plan complet avec une liste de courses triee par rayon de supermarche. C'est l'une des fonctionnalites les plus appreciees.

Intent 5 : Progress (analyse de progression)

Declencheur : "comment j'ai progresse ce mois ?", "montre mes stats" Sortie : Analyse textuelle avec donnees et recommandations Tokens max : 800

L'IA accede a votre historique de seances, vos PRs, et vos mesures pour fournir une analyse personnalisee.

Intents 6-9 : Recovery, Form Tips, Motivation, General

Des intents plus legers pour les conseils de recuperation, la technique des exercices, la motivation, et les questions generales. Chacun a son prompt systeme optimise.

Pourquoi la detection d'intent par regex

Quand on a 9 intents, la premiere question est : comment savoir quel intent declencher ?

On a commence avec un LLM (Claude Haiku) pour la detection. Ca marchait, mais ca ajoutait 500-800ms de latence a chaque message. Pour un chatbot, c'est enorme.

Solution : regex-first, LLM-fallback. On a construit un detecteur base sur des mots-cles et des patterns :

  • "seance" / "workout" / "entrainement" → workout
  • "programme" / "plan d'entrainement" / "X semaines" → programme
  • "recette" / "repas" / "calories" → nutrition
  • "plan de repas" / "menu semaine" → meal_plan
  • "progres" / "stats" / "PR" → progress

Le regex couvre 95% des cas en 1-2ms. Pour les 5% ambigus, on fallback sur le LLM.

Le detecteur gere aussi les accents (entrainement = entraînement), les fautes de frappe courantes, et les formulations naturelles en francais.

Le parsing : transformer du texte en donnees

C'est le defi technique le plus sous-estime. Claude genere du texte. Mais pour sauvegarder un workout dans la base de donnees, on a besoin de JSON structure.

Le systeme fonctionne en deux temps :

1. Prompt engineering

Chaque intent a un prompt systeme qui specifie le format de sortie exact. Par exemple, pour un workout :

Tu dois generer 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

Meme avec un prompt precis, l'IA peut generer du JSON legerement incorrect, ajouter du texte avant/apres le bloc, ou utiliser des guillemets non-standards. Le parser gere tout ca :

  • Extraction du bloc JSON (meme si entoure de texte)
  • Correction des erreurs de format courantes
  • Validation des champs requis
  • Valeurs par defaut pour les champs manquants

Ce parser a ete le module le plus teste du backend — avec plus de 50 cas de test couvrant les cas limites.

Le streaming : la reponse en temps reel

Personne ne veut attendre 10 secondes en fixant un ecran vide. Le streaming SSE (Server-Sent Events) permet d'afficher la reponse de l'IA au fur et a mesure qu'elle est generee.

Le flux technique :

  1. Le frontend ouvre une connexion SSE vers /api/v1/ai/stream
  2. Le backend appelle Claude en mode streaming
  3. Chaque token genere est relayes au frontend via SSE
  4. Le frontend affiche le texte progressivement
  5. A la fin, le JSON complet est parse et un apercu interactif apparait

L'experience utilisateur est fluide : vous voyez la reponse s'ecrire en direct, puis un bouton "Sauvegarder ce workout" apparait des que la generation est terminee.

Le defi du JSON cache

Pendant le streaming, les tokens JSON arrivent un par un. Afficher {"type":"wo a l'ecran serait une mauvaise experience. Notre solution : cacher le JSON brut pendant le streaming et le remplacer par un placeholder anime ("Generation en cours..."), puis afficher l'apercu complet une fois le bloc JSON termine.

Le contexte utilisateur : ce qui rend l'IA intelligente

Un chatbot qui ne connait pas votre historique donne des conseils generiques. CoachGPT injecte du contexte dans chaque interaction :

  • Profil : age, poids, objectifs, niveau, equipement
  • Dernieres seances : exercices, charges, volumes recents
  • PRs actuels : records personnels sur les mouvements composes
  • Preferences : aliments aimes/detestes, restrictions alimentaires
  • Historique de conversation : ce dont vous avez deja parle

Ce contexte est compile et injecte dans le prompt systeme avant chaque appel a Claude. L'IA a toujours une vue d'ensemble de votre profil.

La gestion de la memoire longue

Les conversations longues depassent la fenetre de contexte de l'IA. Solution : un service de summarisation qui compresse automatiquement les vieux messages en resume. Au-dela de 20 messages pour les intents structures (ou 40 pour les conversations generales), les anciens messages sont remplaces par un resume concis genere par Haiku.

Les lecons apprises

Apres des mois de developpement et des centaines de tests utilisateurs, voici ce qu'on a appris :

1. La specialisation bat la generalisation

Un seul prompt "coach fitness" donne des resultats mediocres. 9 prompts specialises donnent des resultats excellents. La qualite augmente drastiquement quand le systeme sait exactement ce qu'on lui demande.

2. Le parsing est plus dur que la generation

Faire generer du texte a une IA est facile. Extraire des donnees structurees fiables de cette sortie est un cauchemar d'edge cases. Prevoyez 3x plus de temps pour le parsing que pour le prompt.

3. La latence tue l'experience

Chaque milliseconde compte. Le passage au regex pour la detection d'intent, le streaming SSE, et l'optimisation des prompts (pas trop longs) sont des decisions critiques pour l'UX.

4. Le contexte fait toute la difference

La meme question posee par un debutant de 60 kg et un avance de 90 kg doit donner des reponses differentes. 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 reelles des utilisateurs. "Fais-moi un truc pour les bras mdr" est une demande valide qu'il faut gerer.

La suite

Le systeme d'IA de CoachGPT continue d'evoluer. Ce qui arrive :

  • Orchestrateur agent-based : un systeme plus flexible ou des agents specialises collaborent pour repondre aux demandes complexes
  • Integration des capteurs : adapter les recommandations en fonction des donnees de montres connectees
  • Analyse de video : correction de technique par camera (recherche en cours)

Le DevLog Jour 3 portera sur le systeme de gamification et pourquoi les tokens changent tout pour la retention. Stay tuned.

— Arsene


Cet article fait partie du DevLog CoachGPT. Retrouvez tous les episodes sur coachgpt.fit/blog.

Articles similaires