Initial commit
This commit is contained in:
280
diagnostic_faiss.py
Executable file
280
diagnostic_faiss.py
Executable file
@@ -0,0 +1,280 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Diagnostic de l'index FAISS - Vérifie l'état et le contenu de l'index.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import pickle
|
||||
from pathlib import Path
|
||||
|
||||
# Ajouter le chemin du projet
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'geniusia2'))
|
||||
|
||||
def check_faiss_installation():
|
||||
"""Vérifie si FAISS est installé."""
|
||||
print("\n1. Vérification de l'installation FAISS")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
import faiss
|
||||
print(f"✓ FAISS installé: version {faiss.__version__ if hasattr(faiss, '__version__') else 'inconnue'}")
|
||||
return True
|
||||
except ImportError:
|
||||
print("✗ FAISS n'est pas installé")
|
||||
return False
|
||||
|
||||
|
||||
def check_index_files():
|
||||
"""Vérifie la présence des fichiers d'index."""
|
||||
print("\n2. Vérification des fichiers d'index")
|
||||
print("=" * 60)
|
||||
|
||||
index_path = Path("geniusia2/data/faiss_index")
|
||||
index_file = index_path / "embeddings.index"
|
||||
metadata_file = index_path / "metadata.pkl"
|
||||
|
||||
results = {}
|
||||
|
||||
# Vérifier le répertoire
|
||||
if index_path.exists():
|
||||
print(f"✓ Répertoire d'index existe: {index_path}")
|
||||
results['dir'] = True
|
||||
else:
|
||||
print(f"✗ Répertoire d'index manquant: {index_path}")
|
||||
results['dir'] = False
|
||||
return results
|
||||
|
||||
# Vérifier le fichier d'index
|
||||
if index_file.exists():
|
||||
size = index_file.stat().st_size
|
||||
print(f"✓ Fichier d'index existe: {index_file}")
|
||||
print(f" Taille: {size:,} octets ({size / 1024:.2f} KB)")
|
||||
results['index'] = True
|
||||
else:
|
||||
print(f"✗ Fichier d'index manquant: {index_file}")
|
||||
results['index'] = False
|
||||
|
||||
# Vérifier le fichier de métadonnées
|
||||
if metadata_file.exists():
|
||||
size = metadata_file.stat().st_size
|
||||
print(f"✓ Fichier de métadonnées existe: {metadata_file}")
|
||||
print(f" Taille: {size:,} octets ({size / 1024:.2f} KB)")
|
||||
results['metadata'] = True
|
||||
else:
|
||||
print(f"✗ Fichier de métadonnées manquant: {metadata_file}")
|
||||
results['metadata'] = False
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def check_index_content():
|
||||
"""Vérifie le contenu de l'index FAISS."""
|
||||
print("\n3. Vérification du contenu de l'index")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
import faiss
|
||||
|
||||
index_file = Path("geniusia2/data/faiss_index/embeddings.index")
|
||||
|
||||
if not index_file.exists():
|
||||
print("✗ Impossible de charger l'index (fichier manquant)")
|
||||
return False
|
||||
|
||||
# Charger l'index
|
||||
index = faiss.read_index(str(index_file))
|
||||
|
||||
print(f"✓ Index FAISS chargé avec succès")
|
||||
print(f" Type d'index: {type(index).__name__}")
|
||||
print(f" Dimension des vecteurs: {index.d}")
|
||||
print(f" Nombre de vecteurs: {index.ntotal}")
|
||||
print(f" Index entraîné: {'Oui' if index.is_trained else 'Non'}")
|
||||
|
||||
if index.ntotal == 0:
|
||||
print("\n⚠ L'index est vide (aucun embedding stocké)")
|
||||
else:
|
||||
print(f"\n✓ L'index contient {index.ntotal} embeddings")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"✗ Erreur lors du chargement de l'index: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def check_metadata_content():
|
||||
"""Vérifie le contenu des métadonnées."""
|
||||
print("\n4. Vérification des métadonnées")
|
||||
print("=" * 60)
|
||||
|
||||
metadata_file = Path("geniusia2/data/faiss_index/metadata.pkl")
|
||||
|
||||
if not metadata_file.exists():
|
||||
print("✗ Fichier de métadonnées manquant")
|
||||
return False
|
||||
|
||||
try:
|
||||
with open(metadata_file, 'rb') as f:
|
||||
metadata = pickle.load(f)
|
||||
|
||||
print(f"✓ Métadonnées chargées avec succès")
|
||||
print(f" Type: {type(metadata).__name__}")
|
||||
print(f" Nombre d'entrées: {len(metadata)}")
|
||||
|
||||
if len(metadata) == 0:
|
||||
print("\n⚠ Aucune métadonnée stockée")
|
||||
else:
|
||||
print(f"\n✓ {len(metadata)} métadonnées stockées")
|
||||
|
||||
# Afficher un exemple
|
||||
if metadata:
|
||||
first_key = list(metadata.keys())[0]
|
||||
first_entry = metadata[first_key]
|
||||
print(f"\n Exemple de métadonnée (ID {first_key}):")
|
||||
for key, value in first_entry.items():
|
||||
if isinstance(value, str) and len(value) > 50:
|
||||
value = value[:50] + "..."
|
||||
print(f" {key}: {value}")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"✗ Erreur lors du chargement des métadonnées: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def check_embeddings_manager():
|
||||
"""Vérifie que l'EmbeddingsManager peut être initialisé."""
|
||||
print("\n5. Vérification de l'EmbeddingsManager")
|
||||
print("=" * 60)
|
||||
|
||||
try:
|
||||
# Importer sans initialiser complètement (éviter de charger les modèles lourds)
|
||||
from geniusia2.core.embeddings_manager import EmbeddingsManager
|
||||
print("✓ Module EmbeddingsManager importé avec succès")
|
||||
|
||||
# Vérifier les dépendances
|
||||
try:
|
||||
import open_clip
|
||||
print("✓ OpenCLIP disponible")
|
||||
except ImportError:
|
||||
print("✗ OpenCLIP non disponible")
|
||||
|
||||
try:
|
||||
import faiss
|
||||
print("✓ FAISS disponible")
|
||||
except ImportError:
|
||||
print("✗ FAISS non disponible")
|
||||
|
||||
try:
|
||||
import torch
|
||||
print(f"✓ PyTorch disponible (version {torch.__version__})")
|
||||
except ImportError:
|
||||
print("✗ PyTorch non disponible")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"✗ Erreur lors de l'import de l'EmbeddingsManager: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def check_usage_in_code():
|
||||
"""Vérifie où FAISS est utilisé dans le code."""
|
||||
print("\n6. Utilisation de FAISS dans le code")
|
||||
print("=" * 60)
|
||||
|
||||
files_to_check = [
|
||||
"geniusia2/core/suggestion_manager.py",
|
||||
"geniusia2/core/embeddings_manager.py",
|
||||
"geniusia2/core/learning_manager.py"
|
||||
]
|
||||
|
||||
for file_path in files_to_check:
|
||||
if os.path.exists(file_path):
|
||||
with open(file_path, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Chercher les références à FAISS
|
||||
if 'faiss' in content.lower() or 'embeddings_manager' in content.lower():
|
||||
print(f"✓ {file_path}")
|
||||
|
||||
# Compter les occurrences
|
||||
faiss_count = content.lower().count('faiss')
|
||||
embeddings_count = content.count('embeddings_manager')
|
||||
search_similar_count = content.count('search_similar')
|
||||
|
||||
if faiss_count > 0:
|
||||
print(f" - Mentions de 'faiss': {faiss_count}")
|
||||
if embeddings_count > 0:
|
||||
print(f" - Mentions de 'embeddings_manager': {embeddings_count}")
|
||||
if search_similar_count > 0:
|
||||
print(f" - Appels à 'search_similar': {search_similar_count}")
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
"""Fonction principale."""
|
||||
print("\n" + "=" * 60)
|
||||
print("DIAGNOSTIC DE L'INDEX FAISS")
|
||||
print("=" * 60)
|
||||
|
||||
results = []
|
||||
|
||||
# 1. Installation FAISS
|
||||
results.append(check_faiss_installation())
|
||||
|
||||
# 2. Fichiers d'index
|
||||
file_results = check_index_files()
|
||||
results.append(all(file_results.values()))
|
||||
|
||||
# 3. Contenu de l'index
|
||||
if file_results.get('index', False):
|
||||
results.append(check_index_content())
|
||||
else:
|
||||
print("\n3. Vérification du contenu de l'index")
|
||||
print("=" * 60)
|
||||
print("⊘ Ignoré (fichier d'index manquant)")
|
||||
results.append(False)
|
||||
|
||||
# 4. Métadonnées
|
||||
if file_results.get('metadata', False):
|
||||
results.append(check_metadata_content())
|
||||
else:
|
||||
print("\n4. Vérification des métadonnées")
|
||||
print("=" * 60)
|
||||
print("⊘ Ignoré (fichier de métadonnées manquant)")
|
||||
results.append(False)
|
||||
|
||||
# 5. EmbeddingsManager
|
||||
results.append(check_embeddings_manager())
|
||||
|
||||
# 6. Usage dans le code
|
||||
results.append(check_usage_in_code())
|
||||
|
||||
# Résumé
|
||||
print("\n" + "=" * 60)
|
||||
print("RÉSUMÉ")
|
||||
print("=" * 60)
|
||||
|
||||
passed = sum(results)
|
||||
total = len(results)
|
||||
|
||||
print(f"Vérifications réussies: {passed}/{total}")
|
||||
|
||||
if passed == total:
|
||||
print("\n✓ FAISS est correctement installé et configuré!")
|
||||
elif passed >= total - 2:
|
||||
print("\n⚠ FAISS est installé mais l'index est peut-être vide")
|
||||
print(" Ceci est normal si aucune tâche n'a encore été apprise.")
|
||||
else:
|
||||
print("\n✗ Des problèmes ont été détectés avec FAISS")
|
||||
print(" Exécute './geniusia2/install_faiss.sh' pour réinstaller")
|
||||
|
||||
return 0 if passed >= total - 2 else 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user