Fixe Models loadding
Browse files- api/main.py +14 -1
api/main.py
CHANGED
|
@@ -33,6 +33,7 @@ async def lifespan(app: FastAPI):
|
|
| 33 |
logger.info("Chargement des modèles et des données...")
|
| 34 |
try:
|
| 35 |
# Résoudre les chemins relatifs par rapport à ce fichier
|
|
|
|
| 36 |
base_dir = Path(__file__).resolve().parent
|
| 37 |
profiles_path = base_dir / "profiles.csv"
|
| 38 |
# Fallback : si le fichier n'existe pas au même niveau, essayer ../profiles.csv (pour endpoint add_profile)
|
|
@@ -40,12 +41,16 @@ async def lifespan(app: FastAPI):
|
|
| 40 |
alt = base_dir.parent / "profiles.csv"
|
| 41 |
if alt.exists():
|
| 42 |
profiles_path = alt
|
|
|
|
| 43 |
|
|
|
|
| 44 |
df_profiles = pd.read_csv(profiles_path)
|
| 45 |
ml_models["profiles"] = df_profiles
|
|
|
|
| 46 |
|
| 47 |
# Charger la cartographie des métiers du numérique
|
| 48 |
try:
|
|
|
|
| 49 |
carto_path = base_dir.parent.parent / "cartographie-metiers-numeriques.csv"
|
| 50 |
# si non trouvé, essayer le repo root
|
| 51 |
if not carto_path.exists():
|
|
@@ -57,27 +62,35 @@ async def lifespan(app: FastAPI):
|
|
| 57 |
logger.warning("⚠️ Fichier cartographie-metiers-numeriques.csv non trouvé. Fonctionnalité métiers désactivée.")
|
| 58 |
ml_models["metiers_digital"] = pd.DataFrame()
|
| 59 |
|
|
|
|
| 60 |
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
|
| 61 |
ml_models["model"] = model
|
|
|
|
| 62 |
|
|
|
|
| 63 |
profile_embeddings = model.encode(df_profiles["full_text"].tolist(), convert_to_numpy=True)
|
| 64 |
d = profile_embeddings.shape[1]
|
|
|
|
| 65 |
|
|
|
|
| 66 |
faiss.normalize_L2(profile_embeddings)
|
| 67 |
|
| 68 |
index = faiss.IndexFlatIP(d)
|
| 69 |
index.add(profile_embeddings)
|
| 70 |
ml_models["faiss_index"] = index
|
|
|
|
| 71 |
|
| 72 |
# Créer des embeddings séparés pour les compétences et l'expérience
|
|
|
|
| 73 |
skills_embeddings = model.encode(df_profiles["hard_skills"].tolist(), convert_to_numpy=True)
|
| 74 |
faiss.normalize_L2(skills_embeddings)
|
| 75 |
ml_models["skills_embeddings"] = skills_embeddings
|
|
|
|
| 76 |
|
| 77 |
logger.info(f"✅ Index FAISS construit avec {index.ntotal} profils.")
|
| 78 |
logger.info("Application démarrée avec succès.")
|
| 79 |
except Exception as e:
|
| 80 |
-
logger.error(f"Erreur lors du chargement des modèles : {e}")
|
| 81 |
# Vous pourriez vouloir arrêter l'application si les modèles ne se chargent pas
|
| 82 |
# raise HTTPException(status_code=500, detail="Impossible de charger les modèles de ML.")
|
| 83 |
|
|
|
|
| 33 |
logger.info("Chargement des modèles et des données...")
|
| 34 |
try:
|
| 35 |
# Résoudre les chemins relatifs par rapport à ce fichier
|
| 36 |
+
logger.info("Étape 1 : Résolution des chemins de fichiers...")
|
| 37 |
base_dir = Path(__file__).resolve().parent
|
| 38 |
profiles_path = base_dir / "profiles.csv"
|
| 39 |
# Fallback : si le fichier n'existe pas au même niveau, essayer ../profiles.csv (pour endpoint add_profile)
|
|
|
|
| 41 |
alt = base_dir.parent / "profiles.csv"
|
| 42 |
if alt.exists():
|
| 43 |
profiles_path = alt
|
| 44 |
+
logger.info(f"Chemin des profils : {profiles_path}")
|
| 45 |
|
| 46 |
+
logger.info("Étape 2 : Chargement du DataFrame des profils...")
|
| 47 |
df_profiles = pd.read_csv(profiles_path)
|
| 48 |
ml_models["profiles"] = df_profiles
|
| 49 |
+
logger.info(f"{len(df_profiles)} profils chargés.")
|
| 50 |
|
| 51 |
# Charger la cartographie des métiers du numérique
|
| 52 |
try:
|
| 53 |
+
logger.info("Étape 3 : Chargement de la cartographie des métiers...")
|
| 54 |
carto_path = base_dir.parent.parent / "cartographie-metiers-numeriques.csv"
|
| 55 |
# si non trouvé, essayer le repo root
|
| 56 |
if not carto_path.exists():
|
|
|
|
| 62 |
logger.warning("⚠️ Fichier cartographie-metiers-numeriques.csv non trouvé. Fonctionnalité métiers désactivée.")
|
| 63 |
ml_models["metiers_digital"] = pd.DataFrame()
|
| 64 |
|
| 65 |
+
logger.info("Étape 4 : Chargement du modèle SentenceTransformer...")
|
| 66 |
model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
|
| 67 |
ml_models["model"] = model
|
| 68 |
+
logger.info("Modèle SentenceTransformer chargé.")
|
| 69 |
|
| 70 |
+
logger.info("Étape 5 : Encodage des profils (full_text)...")
|
| 71 |
profile_embeddings = model.encode(df_profiles["full_text"].tolist(), convert_to_numpy=True)
|
| 72 |
d = profile_embeddings.shape[1]
|
| 73 |
+
logger.info("Encodage des profils terminé.")
|
| 74 |
|
| 75 |
+
logger.info("Étape 6 : Normalisation et création de l'index FAISS...")
|
| 76 |
faiss.normalize_L2(profile_embeddings)
|
| 77 |
|
| 78 |
index = faiss.IndexFlatIP(d)
|
| 79 |
index.add(profile_embeddings)
|
| 80 |
ml_models["faiss_index"] = index
|
| 81 |
+
logger.info("Index FAISS créé.")
|
| 82 |
|
| 83 |
# Créer des embeddings séparés pour les compétences et l'expérience
|
| 84 |
+
logger.info("Étape 7 : Encodage des compétences (hard_skills)...")
|
| 85 |
skills_embeddings = model.encode(df_profiles["hard_skills"].tolist(), convert_to_numpy=True)
|
| 86 |
faiss.normalize_L2(skills_embeddings)
|
| 87 |
ml_models["skills_embeddings"] = skills_embeddings
|
| 88 |
+
logger.info("Encodage des compétences terminé.")
|
| 89 |
|
| 90 |
logger.info(f"✅ Index FAISS construit avec {index.ntotal} profils.")
|
| 91 |
logger.info("Application démarrée avec succès.")
|
| 92 |
except Exception as e:
|
| 93 |
+
logger.error(f"Erreur lors du chargement des modèles : {e}", exc_info=True)
|
| 94 |
# Vous pourriez vouloir arrêter l'application si les modèles ne se chargent pas
|
| 95 |
# raise HTTPException(status_code=500, detail="Impossible de charger les modèles de ML.")
|
| 96 |
|