--- title: NBA Analyst AI emoji: 🏀 colorFrom: blue colorTo: indigo sdk: docker app_port: 7860 pinned: false license: mit short_description: Chatbot NBA RAG+SQL (Streamlit,Faiss,SQL,Mistral) --- # Assistant RAG avec Mistral Ce projet implĂ©mente un assistant virtuel basĂ© sur le modĂšle Mistral, utilisant la technique de Retrieval-Augmented Generation (RAG) ou RAG + Agent SQL pour fournir des rĂ©ponses prĂ©cises et contextuelles Ă  partir d'une base de connaissances personnalisĂ©e. ## FonctionnalitĂ©s - 🔍 **Recherche sĂ©mantique** avec FAISS pour trouver les documents pertinents - 🔍 **Recherche SQL** pour interroger une base de donnĂ©es PostgreSQL - đŸ€– **GĂ©nĂ©ration de rĂ©ponses** avec les modĂšles Mistral (Small ou Large) - ⚙ **ParamĂštres personnalisables** (modĂšle, taille des chunks, nombre de Retrieved Documents, tempĂ©rature, etc.) - 📊 **Évaluation des performances** du RAG ou du RAG+SQL avec Ragas (Context Precision, Context Recall, Answer Relevancy, Faithfulness) - đŸ§‘â€đŸ’» **Interface utilisateur** avec Streamlit pour une interaction facile ## Installation en local - PrĂ©requis - Ubuntu 22.04+ ou n'importe quel systĂšme d'exploitation compatible - Python 3.11+ - PostgreSQL (Agent SQL) - ClĂ© API Mistral (obtenue sur [console.mistral.ai](https://console.mistral.ai/)) - ClĂ© API Logfire (obtenue sur [logfire.com](https://logfire.com/)) ### Installation 1. **Cloner le dĂ©pĂŽt** ```bash git clone https://framagit.org/dapa/oc_mlops_projet_3.git cd oc_mlops_projet_3 ``` 2. **CrĂ©er un environnement virtuel** ```bash # CrĂ©ation de l'environnement virtuel python -m venv mon_venv # Activation de l'environnement virtuel source mon_venv/bin/activate ``` 3. **Installer les dĂ©pendances** ```bash pip install -r requirements_local.txt ``` 4. **Configurer les clĂ©s API et mots de passe** CrĂ©ez un fichier `.env` Ă  la racine du projet avec le contenu suivant : ``` # ClĂ©s API MISTRAL_API_KEY="votre_clĂ©_api_mistral" LOGFIRE_TOKEN="votre_clĂ©_api_logfire" # URL du stockage distant des donnĂ©es d'entrĂ©e (si applicable) INPUT_DATA_URL="" # Configuration PostgreSQL PG_ADMIN_PASSWORD=mot de passe admin PG_USER_1_PASSWORD=mot de passe user_1 ``` 5. **Installer et configurer PostgreSQL** ```bash # Installation de PostgreSQL (exemple pour Ubuntu) sudo apt update sudo apt install postgresql -y # Chargement des variables d'environnement source .env # CrĂ©ation de la base de donnĂ©es et des utilisateurs sudo -u postgres psql \ -c "CREATE ROLE admin WITH LOGIN PASSWORD '$PG_ADMIN_PASSWORD' CREATEROLE;" \ -c "CREATE DATABASE oc_mlops_projet_3 OWNER admin;" psql -h localhost -p 5432 -U admin -d oc_mlops_projet_3 \ -c "CREATE ROLE user_1 WITH LOGIN NOINHERIT PASSWORD '$PG_USER_1_PASSWORD';" \ -c "GRANT CONNECT ON DATABASE oc_mlops_projet_3 TO user_1;" \ -c "GRANT USAGE ON SCHEMA public TO user_1;" \ -c "GRANT SELECT ON ALL TABLES IN SCHEMA public TO user_1;" ``` 6. **CrĂ©er le schĂ©ma relationnel de la base de donnĂ©es** ExĂ©cutez le script SQL suivant en vous connectant avec l'utilisateur `admin` pour crĂ©er les tables et les clĂ©s Ă©trangĂšres : ```bash psql -h localhost -p 5432 -U admin -d oc_mlops_projet_3 -f SQL_db/schema_relationnel_sql.sql ``` Ce script va : 1. CrĂ©er les 6 tables (`teams`, `players`, `analyse_joueurs_une_equipe`, `analyse_nbr_joueurs_et_points_par_equipe`, `analyse_top_15_joueurs_nombre_points`, `stats_joueurs_saison_reguliere`) 2. Ajouter les contraintes de clĂ©s Ă©trangĂšres entre les tables 3. Ajouter les commentaires sur les colonnes > ⚠ **Cette Ă©tape est indispensable avant de lancer `load_excel_to_db.py`**, sans quoi les tables cibles n'existent pas encore. ## Structure du projet ``` . ├── .gitignore # Fichier pour ignorer les fichiers et dossiers non pertinents dans le dĂ©pĂŽt Git ├── .env # Fichier pour stocker les variables d'environnement (clĂ©s API, mots de passe, etc.) ├── Dockerfile # Image Docker combinĂ©e PostgreSQL + Streamlit (port 7860) ├── evaluate_ragas.py # Script pour Ă©valuer les performances du RAG ou du RAG+SQL avec Ragas ├── indexer.py # Script pour indexer les documents ├── load_excel_to_db.py # Script pour charger les donnĂ©es Excel dans la base de donnĂ©es PostgreSQL ├── MistralChat.py # Application Streamlit principale ├── Notebook_Eval_Ragas.ipynb # Jupyter Notebook pour l'Ă©valuation des performances du RAG ou du RAG+SQL avec Ragas ├── README.md # Documentation du projet ├── requirements_docker.txt # DĂ©pendances Python pour le dĂ©ploiement Docker (HF Spaces) ├── requirements_local.txt # DĂ©pendances Python pour l'installation locale ├── start.sh # Script d'initialisation PostgreSQL et de dĂ©marrage des services ├── Docs/ # Diagrammes fonctionnels et schĂ©ma relationnel de la base de donnĂ©es ├── inputs/ # Dossier pour les documents sources (PDF, XLSX, etc.) ├── Ragas_results/ # Dossier pour les rĂ©sultats d'Ă©valuation du RAG ou du RAG+SQL avec Ragas ├── SQL_db/ # Scripts SQL de crĂ©ation du schĂ©ma relationnel ├── vector_db/ # Dossier pour l'index FAISS et les chunks vectorisĂ©s └── utils/ # Modules utilitaires ├── config.py # Configuration de l'application ├── data_loader.py # Extraction et prĂ©traitement des documents pour l'indexation ├── langgraph_app.py # Routeur d'aiguillage vers Rag ou agent SQL selon la requĂȘte utilisateur ├── sql_tool.py # Construction de l'outil de traduction de requĂȘtes en SQL └── vector_store.py # Gestion de l'index vectoriel ``` ## Utilisation ### 1. Ajouter des documents Placez vos documents dans le dossier `inputs/`. Les formats supportĂ©s sont : - PDF - TXT - DOCX - XLSX - CSV Vous pouvez organiser vos documents dans des sous-dossiers pour une meilleure organisation. ### 2. Indexer les documents ExĂ©cutez le script d'indexation pour traiter les documents et crĂ©er l'index FAISS : ```bash python indexer.py ``` Ce script va : 1. Charger les documents depuis le dossier `inputs/` 2. DĂ©couper les documents en chunks 3. GĂ©nĂ©rer des embeddings avec Mistral 4. CrĂ©er un index FAISS pour la recherche sĂ©mantique 5. Sauvegarder l'index et les chunks dans le dossier `vector_db/` ### 3. Charger les documents dans la base de donnĂ©es PostgreSQL ExĂ©cutez le script pour charger les donnĂ©es Excel dans la base de donnĂ©es PostgreSQL : ```bash sudo systemctl start postgresql python load_excel_to_db.py ``` Ce script va : 1. Charger les fichiers Excel depuis le dossier `inputs/` 2. Se connecter Ă  la base de donnĂ©es PostgreSQL 3. Effacer les donnĂ©es existantes dans les tables concernĂ©es 4. InsĂ©rer les nouvelles donnĂ©es dans les tables correspondantes ### 4. Evaluation des performances du RAG ou du RAG+SQL avec Ragas Si vous souhaitez faire l'Ă©valuation du **Rag uniquement**, mettez dans le fichier `utils/config.py` la variable **'DATABASE_STATUS' Ă  0** et **lancez le script 'utils/indexer.py' pour indexer tous les documents**. Puis lancez le script d'Ă©valuation : ```bash sudo systemctl start postgresql python evaluate_ragas.py ``` Ce script va : 1. Tokenizer/vectoriser les questions d'Ă©valuation avec Mistral Embedding 2. Interroger l'index FAISS pour rĂ©cupĂ©rer les k=5 chunks les plus pertinents 3. Soumettre le prompt final au modĂšle llm de Mistral pour gĂ©nĂ©rer une rĂ©ponse 4. A l'aide des rĂ©ponses gĂ©nĂ©rĂ©es, des contextes rĂ©cupĂ©rĂ©s et des questions d'Ă©valuation, calculer les mĂ©triques (Context Precision, Context Recall, Answer Relevancy et Faithfulness) 5. Sauvegarder les rĂ©sultats d'Ă©valuation dans un fichier CSV `Ragas_results/ragas_results_initial.csv` **Note** : - Une fois avoir lancĂ© 3 Ă©valuations sur le Rag ou Rag+SQL, vous pouvez visualiser les rĂ©sultats d'Ă©valuation dans le Jupyter Notebook `Notebook_Eval_Ragas.ipynb`. - Si vous voulez optimiser les performances du Rag ou Rag+SQL, pensez Ă  supprimer les fichiers dans le dossier `Ragas_results/` avant de relancer une nouvelle Ă©valuation... Si vous souhaitez faire **l'Ă©valuation du Rag et Agent SQL**, mettez dans le fichier `utils/config.py` la variable **'DATABASE_STATUS' Ă  1** et **lancez le script 'utils/indexer.py' pour indexer sans les documents Excel**. Par contre, vous devez **lancer le script 'utils/load_excel_to_db.py' pour charger les donnĂ©es Excel dans la base de donnĂ©es PostgreSQL.** Puis lancez le script d'Ă©valuation : ```bash sudo systemctl start postgresql python evaluate_ragas.py ``` Ce script va : 1. Tokenizer/vectoriser les questions d'Ă©valuation avec Mistral Embedding 2. Pour chaque question d'Ă©valuation, dĂ©terminer Ă  l'aide du llm si une recherche RAG est nĂ©cessaire ou si une requĂȘte SQL doit ĂȘtre construite 3. Si une recherche RAG est nĂ©cessaire, interroger l'index FAISS pour rĂ©cupĂ©rer les k=5 chunks les plus pertinents 3. Si une requĂȘte SQL doit ĂȘtre construite, utiliser l'outil de traduction de requĂȘtes en SQL pour construire la requĂȘte SQL correspondante et l'exĂ©cuter sur la base de donnĂ©es PostgreSQL 4. Soumettre le prompt final au modĂšle llm de Mistral pour gĂ©nĂ©rer une rĂ©ponse 5. A l'aide des rĂ©ponses gĂ©nĂ©rĂ©es, des contextes rĂ©cupĂ©rĂ©s (RAG) et des questions d'Ă©valuation, calculer les mĂ©triques (Context Precision, Context Recall, Answer Relevancy et Faithfulness) 6. Sauvegarder les rĂ©sultats d'Ă©valuation dans un fichier CSV `Ragas_results/ragas_results_final.csv` **Note** : - Une fois avoir lancĂ© 3 Ă©valuations sur le Rag ou Rag+SQL, vous pouvez visualiser les rĂ©sultats d'Ă©valuation dans le Jupyter Notebook `Notebook_Eval_Ragas.ipynb`. - Si vous voulez optimiser les performances du Rag ou Rag+SQL, pensez Ă  supprimer les fichiers dans le dossier `Ragas_results/` avant de relancer une nouvelle Ă©valuation... ### 5. Lancer l'application ```bash sudo systemctl start postgresql streamlit run MistralChat.py ``` L'application sera accessible Ă  l'adresse http://localhost:8501 dans votre navigateur. **Note** : - Pour une utilisation en mode RAG uniquement, assurez-vous que la variable `DATABASE_STATUS` dans `utils/config.py` est dĂ©finie Ă  0 et que l'indexation a Ă©tĂ© rĂ©alisĂ©e avec tous les documents (y compris les Excel). - Pour une utilisation en mode RAG + Agent SQL, assurez-vous que la variable `DATABASE_STATUS` dans `utils/config.py` est dĂ©finie Ă  1, que l'indexation a Ă©tĂ© rĂ©alisĂ©e sans les documents Excel et que les donnĂ©es Excel ont Ă©tĂ© chargĂ©es dans la base SQL. ## Modules principaux ### `utils/data_loader.py` Extraction et prĂ©traitement des documents pour l'indexation : - Chargement de documents multi-formats (PDF, DOCX, XLSX, CSV, JSON, TXT) - Nettoyage du texte (suppression des feuilles avec trop peu de caractĂšres, normalisation des espaces) - DĂ©coupage en chunks avec chevauchement configurable - PrĂ©paration des donnĂ©es pour la vectorisation ### `utils/langgraph_app.py` Routeur d'aiguillage entre le RAG et l'agent SQL : - Analyse de la requĂȘte utilisateur pour dĂ©terminer la source Ă  interroger - Orchestration du pipeline RAG ou SQL via LangGraph - Retour de la rĂ©ponse finale du modĂšle Mistral ### `utils/sql_tool.py` Construction et exĂ©cution de requĂȘtes SQL : - Traduction des questions en langage naturel vers du SQL - ExĂ©cution des requĂȘtes sur la base de donnĂ©es PostgreSQL - Retour des rĂ©sultats structurĂ©s ### `utils/vector_store.py` GĂšre l'index vectoriel FAISS et la recherche sĂ©mantique : - Chunking des documents - GĂ©nĂ©ration des embeddings avec Mistral - CrĂ©ation et interrogation de l'index FAISS ## Personnalisation Vous pouvez personnaliser l'application en modifiant les paramĂštres dans `utils/config.py` : - ModĂšles Mistral utilisĂ©s - Taille des chunks et chevauchement - Nombre de documents renvoyĂ©s par le RAG - TempĂ©rature et Top-p pour la gĂ©nĂ©ration de rĂ©ponses - les prompts utilisĂ©s pour le RAG et l'agent SQL - etc. ## DĂ©ploiement sur HuggingFace Spaces Cette application est dĂ©ployable en un seul **Docker Space** qui embarque Ă  la fois le serveur PostgreSQL et le dashboard Streamlit. ### Architecture du conteneur HF Spaces ``` ┌─────────────────────────────────────────┐ │ HF Docker Space │ │ │ │ ┌─────────────┐ ┌─────────────────┐ │ │ │ PostgreSQL │ │ Streamlit │ │ │ │ port 5432 │◄───│ port 7860 │ │ │ │ (interne) │ │ (HF exposĂ©) │ │ │ └─────────────┘ └─────────────────┘ │ │ │ │ start.sh : init PG → dĂ©marre PG → exec │ │ streamlit │ └─────────────────────────────────────────┘ ``` ### Fichiers ajoutĂ©s pour HF Spaces | Fichier | RĂŽle | |---------|------| | `Dockerfile` | Image combinĂ©e PostgreSQL + Streamlit (port 7860) | | `start.sh` | Init cluster PG, crĂ©ation schĂ©ma/utilisateurs, dĂ©marrage des services | ### ProcĂ©dure de dĂ©ploiement 1. **CrĂ©er un nouveau Space** sur [huggingface.co/spaces](https://huggingface.co/spaces) : - SDK : **Docker** - VisibilitĂ© : Public ou Private 2. **Pousser le dĂ©pĂŽt** vers le Space HF : ```bash # Ajouter le remote HF git remote add hf https://huggingface.co/spaces// git push hf main ``` 3. **Configurer les Secrets** dans *Settings → Repository secrets* : | Secret | Description | |--------|-------------| | `MISTRAL_API_KEY` | ClĂ© API Mistral (obligatoire) | | `POSTGRES_PASSWORD` | Mot de passe du superutilisateur PostgreSQL `admin` | | `PG_USER_1_PASSWORD` | Mot de passe de l'utilisateur read-only `user_1` | | `LOGFIRE_TOKEN` | Token Logfire (optionnel) | 4. **Attendre le build** (~3-5 min) : HF Spaces construit l'image et dĂ©marre les services automatiquement. > ⚠ **Persistance des donnĂ©es** : HF Spaces (tier gratuit) ne garantit pas la persistance des volumes. Les donnĂ©es PostgreSQL sont recréées Ă  chaque redĂ©marrage du Space via `start.sh`. Pour la persistance, utilisez le [stockage persistant HF](https://huggingface.co/docs/hub/spaces-storage) ou un service PostgreSQL externe (ex. [Supabase](https://supabase.com), [Neon](https://neon.tech)). ---