From c82e12f49a25edf7f7b03e3e20b2cb729c596219 Mon Sep 17 00:00:00 2001 From: Xavier Date: Sun, 23 Aug 2026 18:03:35 +0200 Subject: [PATCH] =?UTF-8?q?Mise=20=C3=A0=20jour=20du=20RAG=20:=20Ajout=20d?= =?UTF-8?q?'une=20cat=C3=A9gorie=20g=C3=A9n=C3=A9rale=20pour=20la=20sauveg?= =?UTF-8?q?arde=20syst=C3=A9matique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/rag_manager.py | 44 ++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/modules/rag_manager.py b/modules/rag_manager.py index c49e94a..cbe27a9 100644 --- a/modules/rag_manager.py +++ b/modules/rag_manager.py @@ -5,13 +5,15 @@ from modules.logger import log_event # Définition du chemin racine sécurisé sur ton RAID RAG_BASE_DIR = "/DATA/AppData/MULTI-IA-AETHAS38/RAG" -# Les thématiques générales pour organiser l'apprentissage +# Les thématiques pour organiser l'apprentissage (Ajout de Général et Éducation) THEMATIQUES_RAG = [ "Minecraft_KubeJS", "Juridique_Loi_Francaise", "Serveur_Debian", "Bureautique_Excel", - "Regles_Aethas38" + "Regles_Aethas38", + "Education_Nationale", + "Connaissances_Generales" ] def initialiser_arborescence_rag(): @@ -37,16 +39,18 @@ def extraire_contexte_rag(thematique): contexte_global = "" chemin_theme = os.path.join(RAG_BASE_DIR, thematique) - if not os.path.exists(chemin_theme): - return contexte_global + # Si le thème est "aucun" ou introuvable, on tape dans les connaissances générales + if thematique == "aucun" or not os.path.exists(chemin_theme): + chemin_theme = os.path.join(RAG_BASE_DIR, "Connaissances_Generales") try: - for fichier in os.listdir(chemin_theme): - if fichier.endswith(".txt") or fichier.endswith(".md"): - chemin_fichier = os.path.join(chemin_theme, fichier) - with open(chemin_fichier, 'r', encoding='utf-8') as f: - contexte_global += f"\n--- Extrait de {fichier} ---\n" - contexte_global += f.read() + "\n" + if os.path.exists(chemin_theme): + for fichier in os.listdir(chemin_theme): + if fichier.endswith(".txt") or fichier.endswith(".md"): + chemin_fichier = os.path.join(chemin_theme, fichier) + with open(chemin_fichier, 'r', encoding='utf-8') as f: + contexte_global += f"\n--- Extrait de {fichier} ---\n" + contexte_global += f.read() + "\n" except Exception as e: log_event("ERROR", "RAG", f"Erreur de lecture du contexte {thematique} : {e}") @@ -57,7 +61,6 @@ def rechercher_contexte_rag(prompt, categorie="general"): Récupère le contenu des fichiers de la thématique pour alimenter l'IA. """ try: - # On fait appel à la fonction qui lit tous les .md/.txt du dossier thématique return extraire_contexte_rag(categorie) except Exception as e: log_event("ERROR", "RAG_MANAGER", f"Erreur lors de la recherche RAG : {e}") @@ -65,26 +68,29 @@ def rechercher_contexte_rag(prompt, categorie="general"): def auto_apprendre_rag(prompt, reponse, thematique_simplifiee): """ - Sauvegarde automatiquement les réponses pertinentes pour enrichir la base de connaissances. + Sauvegarde systématiquement TOUTES les réponses pour enrichir la base de connaissances. """ - # Mapping entre le mot-clé deviné par Qwen et le vrai nom de ton dossier + # Mapping élargi mapping = { "minecraft": "Minecraft_KubeJS", "droit": "Juridique_Loi_Francaise", "serveur": "Serveur_Debian", "excel": "Bureautique_Excel", - "regles": "Regles_Aethas38" + "regles": "Regles_Aethas38", + "education_nationale": "Education_Nationale" } - theme_reel = mapping.get(thematique_simplifiee.lower()) - if not theme_reel: - return # Si Qwen n'a pas détecté de thème précis (ex: "aucun"), on n'enregistre rien pour ne pas polluer. + # Si le thème n'est pas dans le mapping (ex: "aucun", "physique", "cuisine"), + # on le force dans le dossier "Connaissances_Generales" au lieu de l'ignorer. + theme_reel = mapping.get(thematique_simplifiee.lower(), "Connaissances_Generales") try: chemin_theme = os.path.join(RAG_BASE_DIR, theme_reel) os.makedirs(chemin_theme, exist_ok=True) - nom_fichier = f"apprentissage_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md" + # On raccourcit le prompt pour créer un nom de fichier propre + sujet_court = "".join(c for c in prompt[:15] if c.isalnum() or c == " ").strip().replace(" ", "_") + nom_fichier = f"rag_{sujet_court}_{datetime.now().strftime('%H%M%S')}.md" chemin_fichier = os.path.join(chemin_theme, nom_fichier) contenu = f"## Question utilisateur\n{prompt}\n\n## Réponse de l'IA (Contexte validé)\n{reponse}\n" @@ -92,7 +98,7 @@ def auto_apprendre_rag(prompt, reponse, thematique_simplifiee): with open(chemin_fichier, 'w', encoding='utf-8') as f: f.write(contenu) - log_event("INFO", "RAG_MANAGER", f"Nouvelle connaissance acquise et sauvegardée dans {theme_reel} ({nom_fichier}).") + log_event("INFO", "RAG_MANAGER", f"Connaissance sauvegardée dans {theme_reel} ({nom_fichier}).") except Exception as e: log_event("ERROR", "RAG_MANAGER", f"Erreur lors de l'auto-apprentissage : {e}")