Public Access
chore: Serveur 100% stable, ports corrigés, prêt pour le RAG
Build and Push Docker Image / build-and-push (push) Successful in 1m50s
Build and Push Docker Image / build-and-push (push) Successful in 1m50s
This commit is contained in:
1 parent
7125842853
commit
ffe820b00f
20 files changed
+7772
-198
No files matched your search
@@ -0,0 +1,63 @@
|
||||
import os
|
||||
import re
|
||||
from modules.logger import log_event
|
||||
|
||||
RAG_BASE_DIR = "rag_data"
|
||||
THEMATIQUES = ["minecraft", "droit", "serveur", "general"]
|
||||
|
||||
def initialiser_structure_rag():
|
||||
"""Crée l'arborescence des dossiers RAG s'ils n'existent pas."""
|
||||
os.makedirs(RAG_BASE_DIR, exist_ok=True)
|
||||
for theme in THEMATIQUES:
|
||||
os.makedirs(os.path.join(RAG_BASE_DIR, theme), exist_ok=True)
|
||||
|
||||
def indexer_document(thematique: str, nom_fichier: str, contenu: str):
|
||||
"""Enregistre un document dans la thématique correspondante."""
|
||||
initialiser_structure_rag()
|
||||
if thematique not in THEMATIQUES:
|
||||
thematique = "general"
|
||||
chemin = os.path.join(RAG_BASE_DIR, thematique, nom_fichier)
|
||||
try:
|
||||
with open(chemin, "w", encoding="utf-8") as f:
|
||||
f.write(contenu)
|
||||
log_event("INFO", "RAG", f"Document {nom_fichier} indexé dans {thematique}.")
|
||||
return True
|
||||
except Exception as e:
|
||||
log_event("ERROR", "RAG", f"Échec d'indexation pour {nom_fichier} : {e}")
|
||||
return False
|
||||
|
||||
def rechercher_contexte_rag(requete: str, thematique: str = None, top_k: int = 3) -> str:
|
||||
"""
|
||||
Recherche les passages les plus pertinents dans la base documentaire.
|
||||
Filtre par thématique si spécifiée, sinon cherche globalement.
|
||||
"""
|
||||
initialiser_structure_rag()
|
||||
dossiers_cibles = [os.path.join(RAG_BASE_DIR, thematique)] if thematique in THEMATIQUES else [os.path.join(RAG_BASE_DIR, t) for t in THEMATIQUES]
|
||||
|
||||
mots_cles = set(re.findall(r'\w+', requete.lower()))
|
||||
resultats = []
|
||||
|
||||
for dossier in dossiers_cibles:
|
||||
if not os.path.exists(dossier):
|
||||
continue
|
||||
for fichier in os.listdir(dossier):
|
||||
chemin = os.path.join(dossier, fichier)
|
||||
if os.path.isfile(chemin):
|
||||
try:
|
||||
with open(chemin, "r", encoding="utf-8", errors="ignore") as f:
|
||||
contenu = f.read()
|
||||
paragraphes = contenu.split("\n\n")
|
||||
for p in paragraphes:
|
||||
texte_p = p.strip()
|
||||
if not texte_p:
|
||||
continue
|
||||
mots_p = set(re.findall(r'\w+', texte_p.lower()))
|
||||
score = len(mots_cles.intersection(mots_p))
|
||||
if score > 0:
|
||||
resultats.append((score, fichier, texte_p))
|
||||
except Exception as e:
|
||||
log_event("WARNING", "RAG", f"Erreur lecture {chemin} : {e}")
|
||||
|
||||
resultats.sort(key=lambda x: x[0], reverse=True)
|
||||
extraits = [f"[{res[1]}] {res[2]}" for res in resultats[:top_k]]
|
||||
return "\n---\n".join(extraits)
|
||||
Reference in new issue
Block a user