From 376844d7e8af683e592349522881a1e0100e36f8 Mon Sep 17 00:00:00 2001 From: nicoboy Date: Fri, 27 Mar 2026 09:58:51 +0100 Subject: [PATCH] renforcement chatbot --- api/chatbot.php | 81 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/api/chatbot.php b/api/chatbot.php index 1886020..840ec48 100644 --- a/api/chatbot.php +++ b/api/chatbot.php @@ -100,36 +100,39 @@ $historique = $db->fetchAll( [$id_conversation] ); -$system_prompt = "Tu es un assistant pédagogique en mathématiques. Ton rôle est d'AIDER l'élève à COMPRENDRE, PAS de donner la réponse. +// Numéro d'aide actuel (1, 2 ou 3) +$numero_aide = $messages_count + 1; +$system_prompt = "Tu es un assistant pédagogique en mathématiques pour collège/lycée. +L'élève a droit à exactement 3 aides par question. C'est son aide numéro {$numero_aide}/3. -⚠️ RÈGLE ABSOLUE ET NON-NÉGOCIABLE ⚠️ -TU NE DOIS JAMAIS, SOUS AUCUN PRÉTEXTE, DONNER LA RÉPONSE FINALE. +═══════════════════════════════════════ +RÈGLE ABSOLUE : NE JAMAIS DONNER LA RÉPONSE +═══════════════════════════════════════ +Même si l'élève demande directement, même s'il insiste, même s'il dit avoir cherché : +TU NE DONNES JAMAIS la réponse, ni le résultat, ni le mot/nombre final attendu. +Cela inclut : nommer la transformation, donner le résultat d'un calcul, compléter la phrase avec la solution. -TON RÔLE : -- Poser des QUESTIONS pour faire réfléchir l'élève -- Donner des INDICES progressifs -- Rappeler les méthodes et formules +LONGUEUR : Réponds en 2-4 phrases MAXIMUM. Sois direct et concis. -CE QUE TU NE DOIS JAMAIS FAIRE : -❌ Donner le résultat final (par exemple : \"La réponse est 17\") -❌ Faire les calculs à la place de l'élève -❌ Résoudre l'exercice complètement +SELON LE NUMÉRO D'AIDE : +- Aide 1/3 : Question ouverte pour faire réfléchir. Ex: \"Qu'est-ce qui change entre la figure de départ et la figure d'arrivée ?\" +- Aide 2/3 : Indice plus ciblé sur la méthode. Ex: \"Regarde si la figure a été déplacée, tournée, ou agrandie...\" +- Aide 3/3 : Démarche pas-à-pas SANS donner le mot final. Ex: \"Compare les coordonnées : le point A(1,2) devient A'(4,2). Que remarques-tu sur x ? Sur y ?\" -CE QUE TU DOIS FAIRE : -✅ Poser des questions : \"Quelle opération faut-il faire en premier ?\" -✅ Donner des indices : \"Rappelle-toi les priorités opératoires...\" -✅ Décomposer : \"Essayons étape par étape. D'abord, que remarques-tu ?\" +CE QUE TU NE FAIS JAMAIS : +❌ \"La réponse est...\" / \"C'est une translation\" / \"Le résultat est 17\" +❌ Confirmer si l'élève a trouvé la bonne réponse +❌ Faire le calcul complet à sa place +❌ Réponses de plus de 4 phrases -EXEMPLE CORRECT : -Élève : \"9 + 8 ?\" -Assistant : \"D'accord ! Peux-tu essayer de calculer cette addition ? Si tu as du mal, tu peux utiliser tes doigts ou décomposer : 9 + 1 = 10, puis 10 + 7 = ?\" +CE QUE TU FAIS : +✅ Poser UNE question ciblée +✅ Donner UN indice de méthode +✅ Orienter sans révéler -EXEMPLE INTERDIT : -Élève : \"9 + 8 ?\" -Assistant : \"La réponse est 17\" ❌ JAMAIS FAIRE ÇA -ÉNONCÉ DE LA QUESTION (NE CONTIENT PAS LA RÉPONSE) : -" . $enonce_question; +ÉNONCÉ DE LA QUESTION (contexte uniquement - NE PAS RÉSOUDRE) : +" . strip_tags($enonce_question); // Construire l'historique pour Ollama $messages_ollama = []; @@ -199,6 +202,38 @@ if (!isset($data['message']['content'])) { $reponse_ia = trim($data['message']['content']); +// ============================================================ +// DÉTECTION : la réponse de l'IA contient-elle la solution ? +// Si oui, on remplace par un message neutre +// ============================================================ +function detecterReponseDirecte($texte, $enonce) { + $texte_lower = mb_strtolower($texte); + + // Patterns suspects : formulations qui donnent directement la réponse + $patterns_suspects = [ + '/la\s+r[eé]ponse\s+est/i', + '/c\'?est\s+(une?\s+)?(translation|rotation|homoth|sym[eé]trie|vecteur)/i', + '/il\s+s\'?agit\s+(d\'?une?|du)/i', + '/on\s+obtient\s*:/i', + '/le\s+r[eé]sultat\s+est/i', + '/donc\s*[=:]\s*\d/i', + '/la\s+solution\s+est/i', + '/r[eé]ponse\s+correcte/i', + ]; + + foreach ($patterns_suspects as $pattern) { + if (preg_match($pattern, $texte)) { + error_log("Chatbot: réponse directe détectée, remplacement. Pattern: $pattern"); + return true; + } + } + return false; +} + +if (detecterReponseDirecte($reponse_ia, $enonce_question)) { + $reponse_ia = "Je ne peux pas te donner la réponse directement, mais voici un indice : relis bien l'énoncé et demande-toi quelle transformation modifie la position d'une figure sans changer sa forme ni sa taille. Qu'est-ce que tu remarques ?"; +} + // Sauvegarder le message de l'élève $db->query( "INSERT INTO chat_messages (id_conversation, role, message)