Guillaumedbx commited on
Commit
b7de8bc
·
1 Parent(s): baeaaf2

déplcement des scripts

Browse files
setup_vectorstore.py DELETED
@@ -1,166 +0,0 @@
1
- # setup_vectorstore.py
2
- import os
3
- from langchain_community.document_loaders import DirectoryLoader
4
- from langchain_community.vectorstores import Chroma
5
- from langchain_text_splitters import RecursiveCharacterTextSplitter
6
- from src.utils.load_embeddings import get_local_embeddings
7
- from tqdm import tqdm
8
-
9
- # Fonction améliorée pour construire la base vectorielle
10
- # Ajoute : création dossier, logs détaillés, split conditionnel, barre de progression, vérification, nettoyage
11
-
12
- def build_vectorstore():
13
- # Chemin de persistance (adapté pour Windows et Linux)
14
- persist_directory = os.path.abspath("./data/db")
15
- # Suppression complète du contenu du dossier db (y compris sous-dossiers UUID)
16
- import shutil
17
- if os.path.exists(persist_directory):
18
- print(f"🗑️ Suppression complète du contenu de {persist_directory} ...")
19
- shutil.rmtree(persist_directory)
20
- os.makedirs(persist_directory, exist_ok=True)
21
- print(f"📁 Persist directory : {persist_directory}")
22
- print(f"📂 Contenu du dossier data : {os.listdir('./data')}")
23
-
24
- # Chargement des fichiers dans le dossier 'data'
25
- loader = DirectoryLoader("./data", glob="**/*.txt")
26
- documents = loader.load()
27
- print(f"📄 Nombre de documents chargés : {len(documents)}")
28
-
29
- # Split conditionnel selon la taille du document
30
- MIN_LEN_NO_SPLIT = 1000
31
- splitter = RecursiveCharacterTextSplitter(
32
- chunk_size=1000,
33
- chunk_overlap=120,
34
- separators=["\n\n", "\n", ".", " ", ""]
35
- )
36
- chunks = []
37
- for doc in documents:
38
- if len(doc.page_content) < MIN_LEN_NO_SPLIT:
39
- chunks.append(doc)
40
- else:
41
- chunks.extend(splitter.split_documents([doc]))
42
- print(f"📚 Nombre de chunks créés : {len(chunks)}")
43
-
44
- # Embeddings
45
- print("🔍 Création des embeddings...")
46
- embeddings = get_local_embeddings()
47
-
48
- # Création ou mise à jour de la base vectorielle avec barre de progression
49
- print("🔄 Création ou mise à jour de la base vectorielle...")
50
- vectordb = Chroma.from_documents(
51
- list(tqdm(chunks, desc="Indexation des chunks", unit="chunk")),
52
- embedding=embeddings,
53
- persist_directory=persist_directory
54
- )
55
- print("📦 Base vectorielle créée avec succès.")
56
-
57
- # Persistance
58
- print("💾 Persistance de la base vectorielle en cours...")
59
- vectordb.persist()
60
- vectordb = None # Libération de la mémoire
61
- print("💾 Base vectorielle persistée avec succès.")
62
-
63
- # Détection du sous-dossier UUID généré par Chroma
64
- uuid_subdirs = [d for d in os.listdir(persist_directory) if os.path.isdir(os.path.join(persist_directory, d))]
65
- if len(uuid_subdirs) == 1:
66
- uuid_dir = os.path.join(persist_directory, uuid_subdirs[0])
67
- print(f"🆔 Sous-dossier UUID détecté : {uuid_dir}")
68
- else:
69
- print(f"⚠️ Problème : nombre de sous-dossiers UUID dans db = {len(uuid_subdirs)}")
70
- uuid_dir = persist_directory # fallback
71
-
72
- # Upload sur Hugging Face Hub : upload fichier par fichier à plat dans db/
73
- try:
74
- from huggingface_hub import HfApi, upload_file
75
- repo_id = os.getenv("HF_REPO_ID")
76
- token = os.getenv("HF_TOKEN") or os.getenv("HUGGINGFACEHUB_API_TOKEN")
77
- if repo_id and token:
78
- print(f"⬆️ Upload fichier par fichier du sous-dossier {uuid_dir} vers le repo Hugging Face Hub {repo_id} à plat dans db/")
79
- api = HfApi()
80
- # Suppression des anciens fichiers sur le Hub
81
- remote_files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)
82
- uuid_prefix = "db/"
83
- to_delete = [f for f in remote_files if f.startswith(uuid_prefix)]
84
- print(f"Nombre de fichiers à supprimer sur le Hub : {len(to_delete)}")
85
- for f in to_delete:
86
- print(f"🗑️ Suppression sur le Hub : {f}")
87
- api.delete_file(path_in_repo=f, repo_id=repo_id, repo_type="dataset", token=token)
88
- print("✅ Suppression des anciens fichiers terminée.")
89
- # Upload fichier par fichier à plat
90
- import glob
91
- import pathlib
92
- files_to_upload = [f for f in glob.glob(os.path.join(uuid_dir, "**"), recursive=True) if os.path.isfile(f)]
93
- print(f"Nombre de fichiers à uploader : {len(files_to_upload)}")
94
- for f in files_to_upload:
95
- rel_path = os.path.basename(f) # à plat dans db/
96
- dest_path = f"db/{rel_path}"
97
- print(f"⬆️ Upload : {f} -> {dest_path}")
98
- upload_file(
99
- path_or_fileobj=f,
100
- path_in_repo=dest_path,
101
- repo_id=repo_id,
102
- repo_type="dataset",
103
- token=token,
104
- commit_message=f"Upload {rel_path}"
105
- )
106
- print("✅ Upload fichier par fichier terminé.")
107
- # Vérification post-upload
108
- remote_files_after = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)
109
- print(f"Fichiers présents sur le Hub après upload : {remote_files_after}")
110
- if len(remote_files_after) == 0:
111
- print(f"❌ ERREUR : Aucun fichier trouvé sur le Hub après upload !")
112
- else:
113
- print(f"✅ {len(remote_files_after)} fichiers présents sur le Hub après upload.")
114
- else:
115
- print("⚠️ Variables d'environnement HF_REPO_ID ou token non définies. Upload Hugging Face Hub ignoré.")
116
- except Exception as e:
117
- print(f"⚠️ Erreur lors de l'upload Hugging Face Hub : {e}")
118
-
119
- # Vérification du contenu de la base vectorielle
120
- print("🔍 Vérification du contenu de la base vectorielle...")
121
- vectordb = Chroma(persist_directory=persist_directory, embedding_function=embeddings)
122
- print(f"📊 Nombre de documents dans la base vectorielle : {len(vectordb)}")
123
- print("✅ Base vectorielle prête à l'emploi.")
124
-
125
- # Nettoyage
126
- print("🧹 Nettoyage de la mémoire en cours...")
127
- vectordb = None
128
- print("🧹 Nettoyage de la mémoire terminé.")
129
- print("✅ Processus de création de la base vectorielle terminé avec succès.")
130
-
131
- # Ajout : restauration de la base vectorielle depuis le Hugging Face Hub si elle existe
132
- try:
133
- from huggingface_hub import snapshot_download
134
- repo_id = os.getenv("HF_REPO_ID")
135
- token = os.getenv("HF_TOKEN") or os.getenv("HUGGINGFACEHUB_API_TOKEN")
136
- if repo_id and token:
137
- print(f"⬇️ Téléchargement de tous les fichiers db/* depuis le repo Hugging Face Hub {repo_id} ...")
138
- # Suppression complète du dossier local avant restauration
139
- import shutil
140
- if os.path.exists("./data/db"):
141
- print("🗑️ Suppression du dossier local ./data/db avant restauration ...")
142
- shutil.rmtree("./data/db")
143
- # Téléchargement de tous les fichiers db/*
144
- snapshot_download(
145
- repo_id=repo_id,
146
- repo_type="dataset",
147
- local_dir="./data/db",
148
- allow_patterns=["db/*"],
149
- token=token,
150
- local_dir_use_symlinks=False
151
- )
152
- print("✅ Tous les fichiers db/* restaurés depuis le Hub.")
153
- else:
154
- print("⚠️ Variables d'environnement HF_REPO_ID ou token non définies. Restauration ignorée.")
155
- except Exception as e:
156
- print(f"⚠️ Erreur lors de la restauration Hugging Face Hub : {e}")
157
-
158
- # Point d'entrée du script pour construire la base vectorielle
159
- # Cette partie du code est exécutée lorsque le script est lancé directement.
160
- # Elle appelle la fonction build_vectorstore pour initialiser la base vectorielle.
161
- # Cela permet de préparer la base vectorielle avant d'utiliser l'application principale.
162
- if __name__ == "__main__":
163
- try:
164
- build_vectorstore()
165
- except Exception as e:
166
- print(f"❌ Une erreur est survenue : {e}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
archivemails.py → src/utils/archivemails.py RENAMED
@@ -4,9 +4,9 @@ from langchain_community.vectorstores import Chroma
4
  from langchain_community.embeddings import HuggingFaceEmbeddings
5
 
6
  # Paramètres
7
- DB_PATH = os.path.abspath("./db")
8
  EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
9
- ARCHIVE_DIR = os.path.abspath("./data/archives_mails")
10
 
11
  print("[INFO] Chargement des mails depuis :", ARCHIVE_DIR)
12
  mail_files = [f for f in os.listdir(ARCHIVE_DIR) if os.path.isfile(os.path.join(ARCHIVE_DIR, f))]
 
4
  from langchain_community.embeddings import HuggingFaceEmbeddings
5
 
6
  # Paramètres
7
+ DB_PATH = os.path.abspath("../../db")
8
  EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
9
+ ARCHIVE_DIR = os.path.abspath("../../data/archives_mails")
10
 
11
  print("[INFO] Chargement des mails depuis :", ARCHIVE_DIR)
12
  mail_files = [f for f in os.listdir(ARCHIVE_DIR) if os.path.isfile(os.path.join(ARCHIVE_DIR, f))]
codetravail.py → src/utils/codetravail.py RENAMED
@@ -8,7 +8,7 @@ import time
8
  # Paramètres
9
  CHUNK_SIZE = 500
10
  CHUNK_OVERLAP = 100
11
- DB_PATH = os.path.abspath("./db") # Chemin racine du projet
12
  EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
13
 
14
  print("[INFO] Chargement du dataset Code du Travail...")
 
8
  # Paramètres
9
  CHUNK_SIZE = 500
10
  CHUNK_OVERLAP = 100
11
+ DB_PATH = os.path.abspath("../../db") # Chemin racine du projet
12
  EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
13
 
14
  print("[INFO] Chargement du dataset Code du Travail...")
jurisprudence.py → src/utils/jurisprudence.py RENAMED
@@ -7,7 +7,7 @@ from langchain_community.embeddings import HuggingFaceEmbeddings
7
  # Paramètres
8
  CHUNK_SIZE = 500
9
  CHUNK_OVERLAP = 100
10
- DB_PATH = os.path.abspath("./db")
11
  EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
12
  ARCHIVE_DIR = os.path.abspath("./data/archives_mails")
13
  JURIS_DIR = os.path.abspath("./data/jurisprudence")
 
7
  # Paramètres
8
  CHUNK_SIZE = 500
9
  CHUNK_OVERLAP = 100
10
+ DB_PATH = os.path.abspath("../../db") # Chemin racine du projet
11
  EMBEDDING_MODEL = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
12
  ARCHIVE_DIR = os.path.abspath("./data/archives_mails")
13
  JURIS_DIR = os.path.abspath("./data/jurisprudence")