Pipeline détaillé
Pré-LLM (synchrone, coût LLM zéro)
-
StudentModelService.getSnapshot(userId, courseId)
- Charge ConceptMastery (distribution Beta par concept)
- Charge les misconceptions actives/en résolution (avec trace de preuves)
- Charge EpisodicMemory (ce qui a fonctionné auparavant)
- Charge quizContext (avgScore, passRate, totalAttempts, weakAreas)
- Charge l'historique ChatSession (fenêtre glissante de 10 messages)
-
RetrievalAgent.retrieve(query, studentModel)
- Reformule la requête en utilisant le contexte (remplace "ça", "cela" par les concepts actuels)
- Recherche pgvector avec filtres (tenantId, courseId)
- Boost par zones faibles dans les quiz (
quizWeakAreasdu studentModel) - Top-K avec re-classement sémantique
-
PedagogicalAgent.select(studentModel, query)
- Évalue la maîtrise moyenne + la maîtrise spécifique à la requête
- Applique des ajustements (divergence chat-quiz, âge, style d'apprentissage)
- Retourne la stratégie + l'ajout au system prompt
-
buildEnrichedPrompt(query, studentModel, ragChunks, strategy, misconceptions)
- Construit le system prompt avec :
- Stratégie pédagogique sélectionnée
- Contexte RAG (top-5 chunks avec attribution de source)
- Misconceptions actives (avec instructions pour les aborder)
- Tentatives de quiz récentes (mémoire inter-tours)
- Contexte de déclenchement de quiz inline (s'il y a eu un quiz récent)
- Construit le system prompt avec :
LLM principal (streaming, SSE)
router.stream(taskType: "chat_tutor", messages, options) résout le provider via TenantTaskModelConfig :
- Claude (primary) → OpenAI → xAI Grok → Google Gemini (chaîne de fallback)
- Circuit breaker par provider (état Redis)
- Middleware de comptage : limite de débit + vérification de crédit + calculateur de coût
- Streaming via Server-Sent Events vers le client
Le LLM peut émettre des appels d'outils spéciaux :
[INLINE_QUIZ]{...}[/INLINE_QUIZ]— quiz interactif rendu dans le chatpresent_quiztool call — format Vercel AI SDK
Post-LLM (background via after(), fire-and-forget)
-
EvaluationAgent.evaluate(turn, studentModel) — Haiku, ~$0.001
- Classifie la compréhension : correct | partial | incorrect | unclear
- Détecte StudentMisconception avec :
- source : "chat"
- sourceSessionId
- contextSnippet (max 500 caractères)
- concepts[] (mappés vers ConceptMastery)
- Met à jour ConceptMastery (mise à jour bayésienne via beta(alpha+success, beta+failure))
- Appelle MisconceptionResolutionService.checkAndTransition (machine à états)
-
ContentAgent.preGenerate(studentModel, conceptId) — Haiku, ~$0.001
- Génère un exercice de suivi basé sur les concepts faibles
- Stocke dans Redis (TTL 30min) pour servir au tour suivant
- Réduit la latence perçue par l'apprenant
-
SessionSummarizer (toutes les 10 tours) — Haiku, ~$0.001
- Résume l'historique long
- Remplace les anciens messages dans la fenêtre glissante
- Préserve les insights pédagogiques pertinents
-
SupervisorAgent.run(turn, courseContext) — Haiku, ~$0.001
- Classifie la sévérité (5 niveaux) + catégorie (8 types)
- Crée AiSupervisorIncident si severity != "none"
- Applique les strikes / quarantaine / safety cooldown selon les règles
Configuration par l'admin
TenantTaskModelConfig
L'admin choisit le provider+modèle par type de tâche :
chat_tutor → Claude Sonnet 4.6 (ou GPT-4o, ou Grok-3, etc)
chat_evaluation → Claude Haiku
chat_summarization → Claude Haiku
chat_supervisor → Claude Haiku
content_generation → Claude Haiku
course_review → Claude Sonnet
gamification_agent → Claude Sonnet
course_agent → Claude Sonnet
PedagogicalConfig
Configurabilité pédagogique par tenant :
- masteryThresholds : seuils pour changer de stratégie (défaut 0.3, 0.5, 0.7, 0.9)
- domainOverrides : ajustement par domaine (ex : les mathématiques utilisent un scaffolding plus agressif)
- ageOverrides : ajustement par tranche d'âge (enfant = direct_instruction plus fréquent)
- learningStyleOverrides : visuel, auditif, kinesthésique
Personnalisation du template de prompt
L'admin institutionnel peut modifier le system prompt du tuteur via PromptTemplate (en base de données) :
- Par taskType (chat_tutor)
- Par provider (Anthropic, OpenAI, Google, xAI — variantes optimisées)
- Par locale (pt-BR, en-US, es-ES, fr-FR)
- Par tenant (ou null = global)
- Par cours (override par cours)
Limitations techniques
- Latence premier token : 800-1500ms (incluant le pipeline pré-LLM)
- Latence totale du tour : 2-8s pour une réponse moyenne (~300 mots)
- Fenêtre de contexte : limitée par le provider (Claude Sonnet 4.6 = 200K, GPT-4o = 128K)
- Langues : le tuteur répond dans la langue de l'apprenant mais en interne le pipeline est bilingue (en/pt)
- Images : le tuteur accepte les images en entrée (multimodal Claude/GPT/Gemini) mais le RAG est text-only
- Avatar parlant + voix (sortie) : disponible en opt-in par cours — avatar parlant en temps réel avec voix TTS via HeyGen LiveAvatar ou D-ID (BYO key). Voir Avatar & TTS.
- Voix en entrée (STT) : parler au tuteur (parole de l'apprenant → speech-to-text → chat) n'est pas encore implémenté (roadmap).