Pipeline détaillé
Pré-LLM (synchrone, zéro coût LLM)
-
StudentModelService.getSnapshot(userId, courseId)
- Charge ConceptMastery (distribution Beta par concept)
- Charge les misconceptions actives/en résolution (avec piste 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 à l'aide du contexte (remplace « ceci », « cela » par les concepts actuels)
- Recherche pgvector avec filtres (tenantId, courseId)
- Boost par zones faibles dans les quiz (
quizWeakAreasdu studentModel) - Top-K avec reranking 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 (si un quiz récent a eu lieu)
- 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 metering : 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 tool calls spéciaux :
[INLINE_QUIZ]{...}[/INLINE_QUIZ]— quiz interactif rendu dans le chatpresent_quiztool call — format Vercel AI SDK
Post-LLM (arrière-plan via after(), fire-and-forget)
-
EvaluationAgent.evaluate(turn, studentModel) — Haiku, ~$0,001
- Classe 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 d'état)
-
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 prochain tour
- Réduit la latence perçue par l'apprenant
-
SessionSummarizer (tous 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
- Classe la sévérité (5 niveaux) + la catégorie (8 types)
- Crée AiSupervisorIncident si severity != "none"
- Applique les strikes / quarantaine / cooldown de sécurité selon les règles
Configuration par l'administrateur
TenantTaskModelConfig
L'administrateur 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 (par 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équente)
- learningStyleOverrides : visuel, auditif, kinesthésique
Personnalisation des templates de prompts
L'administrateur 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 first-token : 800-1500 ms (incluant le pipeline pré-LLM)
- Latence totale du tour : 2-8 s 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 avec le tuteur (parole de l'apprenant → speech-to-text → chat) est implémenté en B2B (dictée : la parole devient du texte dans le champ de message, sans envoi automatique). Ce qui reste sur la roadmap, c'est la conversation vocale bidirectionnelle (boucle en temps réel avec l'avatar) et la note automatique de prononciation.