Files
aethas-free/modules/rag_manager.py
T
xavier 9a454dd15e
Build and Push Docker Image / build-and-push (push) Successful in 34s
Activation de l'injection RAG et mise à jour de la base de connaissances
2026-08-23 15:38:26 +02:00

100 lines
3.9 KiB
Python

import os
from datetime import datetime
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
THEMATIQUES_RAG = [
"Minecraft_KubeJS",
"Juridique_Loi_Francaise",
"Serveur_Debian",
"Bureautique_Excel",
"Regles_Aethas38"
]
def initialiser_arborescence_rag():
"""Crée les dossiers RAG physiques sur le disque s'ils n'existent pas."""
try:
if not os.path.exists(RAG_BASE_DIR):
os.makedirs(RAG_BASE_DIR)
log_event("INFO", "RAG", "Création du dossier racine RAG.")
for theme in THEMATIQUES_RAG:
chemin_theme = os.path.join(RAG_BASE_DIR, theme)
if not os.path.exists(chemin_theme):
os.makedirs(chemin_theme)
log_event("INFO", "RAG", f"Création du sous-dossier thématique : {theme}")
except Exception as e:
log_event("ERROR", "RAG", f"Erreur lors de l'initialisation de l'arborescence : {e}")
def extraire_contexte_rag(thematique):
"""
Lit tous les fichiers .txt ou .md d'une thématique donnée
et les concatène pour les injecter dans le prompt de l'IA.
"""
contexte_global = ""
chemin_theme = os.path.join(RAG_BASE_DIR, thematique)
if not os.path.exists(chemin_theme):
return contexte_global
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"
except Exception as e:
log_event("ERROR", "RAG", f"Erreur de lecture du contexte {thematique} : {e}")
return contexte_global
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}")
return ""
def auto_apprendre_rag(prompt, reponse, thematique_simplifiee):
"""
Sauvegarde automatiquement les réponses pertinentes pour enrichir la base de connaissances.
"""
# Mapping entre le mot-clé deviné par Qwen et le vrai nom de ton dossier
mapping = {
"minecraft": "Minecraft_KubeJS",
"droit": "Juridique_Loi_Francaise",
"serveur": "Serveur_Debian",
"excel": "Bureautique_Excel",
"regles": "Regles_Aethas38"
}
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.
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"
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"
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}).")
except Exception as e:
log_event("ERROR", "RAG_MANAGER", f"Erreur lors de l'auto-apprentissage : {e}")
# On s'assure que les dossiers existent dès l'import du module
initialiser_arborescence_rag()