|
| 1 | +# 🤖 Chatbot RAG avec LLM |
| 2 | + |
| 3 | +Un chatbot intelligent construit avec **FastAPI**, utilisant la technique **RAG (Retrieval-Augmented Generation)** combinant la recherche sémantique et la génération de texte par LLM (Large Language Model). |
| 4 | + |
| 5 | +## ✨ Fonctionnalités |
| 6 | + |
| 7 | +- 🔍 **Retrieval Engine** : Recherche sémantique dans la FAQ avec SentenceTransformers |
| 8 | +- 🧠 **LLM Generation** : Génération de réponses naturelles avec Groq LLM (gratuit) |
| 9 | +- 💾 **Memory Management** : Gestion de l'historique de conversation par utilisateur |
| 10 | +- 🌐 **Interface Web** : Interface web moderne et conviviale |
| 11 | +- 📊 **Hybrid Matching** : Combinaison de recherche dans les questions et réponses |
| 12 | +- ⚡ **Caching** : Cache des embeddings pour optimiser les performances |
| 13 | +- 🔄 **FAQ Dynamique** : Sauvegarde automatique des nouvelles questions et gestion |
| 14 | +- 🎯 **Confidence Scoring** : Évaluation de la fiabilité des réponses |
| 15 | + |
| 16 | +## 🏗️ Architecture |
| 17 | + |
| 18 | +``` |
| 19 | +┌─────────────┐ |
| 20 | +│ Client │ (Interface Web) |
| 21 | +└──────┬──────┘ |
| 22 | + │ |
| 23 | + ▼ |
| 24 | +┌─────────────┐ |
| 25 | +│ FastAPI │ (main.py) |
| 26 | +└──────┬──────┘ |
| 27 | + │ |
| 28 | + ├──► RetrievalEngine ──► SentenceTransformer ──► Base de données FAQ |
| 29 | + │ |
| 30 | + ├──► MemoryManager ──► Historique de conversation |
| 31 | + │ |
| 32 | + └──► LLMManager ──► API Groq |
| 33 | +``` |
| 34 | + |
| 35 | +## 📋 Prérequis |
| 36 | + |
| 37 | +- Python 3.8+ |
| 38 | +- pip |
| 39 | +- Clé API depuis [Groq Console](https://console.groq.com) (gratuit) |
| 40 | + |
| 41 | +## 🚀 Installation |
| 42 | + |
| 43 | +### 1. Cloner le repository |
| 44 | + |
| 45 | +```bash |
| 46 | +git clone <repository-url> |
| 47 | +cd ChatBot |
| 48 | +``` |
| 49 | + |
| 50 | +### 2. Créer un environnement virtuel |
| 51 | + |
| 52 | +```bash |
| 53 | +# Windows |
| 54 | +python -m venv venv |
| 55 | +venv\Scripts\activate |
| 56 | + |
| 57 | +# Linux/Mac |
| 58 | +python3 -m venv venv |
| 59 | +source venv/bin/activate |
| 60 | +``` |
| 61 | + |
| 62 | +### 3. Installer les dépendances |
| 63 | + |
| 64 | +```bash |
| 65 | +pip install -r requirements.txt |
| 66 | +``` |
| 67 | + |
| 68 | +### 4. Configurer la clé API |
| 69 | + |
| 70 | +Créer un fichier `.env` à la racine : |
| 71 | + |
| 72 | +```bash |
| 73 | +# Copier depuis .env.example |
| 74 | +cp .env.example .env |
| 75 | +``` |
| 76 | + |
| 77 | +Ou créer manuellement et ajouter : |
| 78 | + |
| 79 | +```env |
| 80 | +GROQ_API_KEY=votre_clé_api_ici |
| 81 | +``` |
| 82 | + |
| 83 | +**Obtenir une clé API :** |
| 84 | +1. S'inscrire sur [Groq Console](https://console.groq.com) |
| 85 | +2. Aller dans **API Keys** dans le tableau de bord |
| 86 | +3. Copier la clé et la coller dans le fichier `.env` |
| 87 | + |
| 88 | +### 5. Lancer l'application |
| 89 | + |
| 90 | +```bash |
| 91 | +python main.py |
| 92 | +``` |
| 93 | + |
| 94 | +Ou utiliser uvicorn directement : |
| 95 | + |
| 96 | +```bash |
| 97 | +uvicorn main:app --reload --host 127.0.0.1 --port 8000 |
| 98 | +``` |
| 99 | + |
| 100 | +Accéder à : http://127.0.0.1:8000 |
| 101 | + |
| 102 | +## 📁 Structure du projet |
| 103 | + |
| 104 | +``` |
| 105 | +ChatBot/ |
| 106 | +├── main.py # Application FastAPI principale |
| 107 | +├── llm_manager.py # Gestion des providers LLM (Groq) |
| 108 | +├── retrieval_engine.py # Moteur de recherche sémantique |
| 109 | +├── memory_manager.py # Gestion de l'historique de conversation |
| 110 | +├── requirements.txt # Dépendances Python |
| 111 | +├── .env.example # Modèle pour les variables d'environnement |
| 112 | +├── README.md # Ce fichier |
| 113 | +│ |
| 114 | +├── data/ |
| 115 | +│ ├── faq.json # Base de données FAQ |
| 116 | +│ └── new_questions.json # Questions nouvelles non encore ajoutées à la FAQ |
| 117 | +│ |
| 118 | +├── templates/ |
| 119 | +│ └── index.html # Interface web |
| 120 | +│ |
| 121 | +├── static/ |
| 122 | +│ ├── css/ |
| 123 | +│ │ ├── chatbot.css # Styles pour le chatbot |
| 124 | +│ │ └── theme.css # Thème général |
| 125 | +│ └── js/ |
| 126 | +│ └── chatbot.js # JavaScript pour le frontend |
| 127 | +│ |
| 128 | +└── test/ |
| 129 | + └── test_retrieval.py # Tests unitaires |
| 130 | +``` |
| 131 | + |
| 132 | +## 🔧 Configuration |
| 133 | + |
| 134 | +### Changer le modèle d'embedding |
| 135 | + |
| 136 | +Dans `main.py`, vous pouvez changer le modèle SentenceTransformer : |
| 137 | + |
| 138 | +```python |
| 139 | +retriever = RetrievalEngine( |
| 140 | + faq_path="data/faq.json", |
| 141 | + model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" |
| 142 | +) |
| 143 | +``` |
| 144 | + |
| 145 | +Modèles populaires : |
| 146 | +- `paraphrase-multilingual-MiniLM-L12-v2` (multilingue, rapide) |
| 147 | +- `all-MiniLM-L6-v2` (anglais, très rapide) |
| 148 | +- `paraphrase-multilingual-mpnet-base-v2` (multilingue, plus précis mais plus lent) |
| 149 | + |
| 150 | +### Changer le provider LLM |
| 151 | + |
| 152 | +Par défaut utilise Groq. Pour changer dans `main.py` : |
| 153 | + |
| 154 | +```python |
| 155 | +llm_manager = LLMManager(preferred_provider="groq") |
| 156 | +``` |
| 157 | + |
| 158 | +### Ajuster le seuil (Threshold) |
| 159 | + |
| 160 | +Dans `retrieval_engine.py`, la fonction `get_best_match()` a un paramètre `threshold` (par défaut 0.45) : |
| 161 | +- **Plus élevé** (0.6+) : Retourne uniquement les résultats très certains, plus de questions utiliseront le LLM |
| 162 | +- **Plus bas** (0.3-) : Retourne plus de résultats, moins d'utilisation du LLM |
| 163 | + |
| 164 | +## 📡 Points d'accès API |
| 165 | + |
| 166 | +### Endpoints Chat |
| 167 | + |
| 168 | +- `POST /chat` - Envoyer un message et recevoir une réponse |
| 169 | + ```json |
| 170 | + { |
| 171 | + "message": "Comment créer un compte ?", |
| 172 | + "user_id": "user123", |
| 173 | + "use_llm": true |
| 174 | + } |
| 175 | + ``` |
| 176 | + |
| 177 | +- `GET /` - Interface web |
| 178 | + |
| 179 | +### Endpoints LLM |
| 180 | + |
| 181 | +- `GET /llm/status` - Vérifier le statut des providers LLM |
| 182 | +- `POST /llm/switch/{provider}` - Changer de provider LLM |
| 183 | + |
| 184 | +### Endpoints Admin |
| 185 | + |
| 186 | +- `GET /admin/new-questions` - Voir les nouvelles questions |
| 187 | +- `POST /admin/add-to-faq/{question_index}` - Ajouter une question à la FAQ |
| 188 | + |
| 189 | +### Endpoints Système |
| 190 | + |
| 191 | +- `GET /health` - Vérification de santé |
| 192 | +- `GET /metrics` - Statistiques du système |
| 193 | + |
| 194 | +## 🧪 Tests |
| 195 | + |
| 196 | +Lancer les tests : |
| 197 | + |
| 198 | +```bash |
| 199 | +pytest test/test_retrieval.py -v |
| 200 | +``` |
| 201 | + |
| 202 | +## 🎯 Fonctionnement |
| 203 | + |
| 204 | +1. **Phase Retrieval** : |
| 205 | + - L'utilisateur envoie une question |
| 206 | + - Le système recherche dans la FAQ par similarité sémantique |
| 207 | + - Calcul du score de confiance |
| 208 | + |
| 209 | +2. **Phase Generation** : |
| 210 | + - Si confidence < 0.45 : Utiliser le LLM pour répondre à une nouvelle question |
| 211 | + - Si confidence >= 0.45 : Utiliser le LLM pour améliorer la réponse de la FAQ (si activé) |
| 212 | + - Si pas de LLM : Retourner la réponse directement de la FAQ |
| 213 | + |
| 214 | +3. **Mémoire** : |
| 215 | + - Sauvegarder l'historique de conversation par user_id |
| 216 | + - Conserver un maximum de 5 messages récents (configurable) |
| 217 | + |
| 218 | +## 📊 Métriques et Monitoring |
| 219 | + |
| 220 | +Accéder à `/metrics` pour voir : |
| 221 | +- Nombre de requêtes traitées |
| 222 | +- Distribution des scores de confiance |
| 223 | +- Taux de réussite du cache |
| 224 | +- Nombre d'utilisateurs actifs |
| 225 | +- Statut des providers LLM |
| 226 | + |
| 227 | +## 🔒 Sécurité |
| 228 | + |
| 229 | +- ✅ Les clés API sont stockées dans `.env` (pas commitées dans git) |
| 230 | +- ✅ CORS configuré (peut être restreint aux origines en production) |
| 231 | +- ✅ Validation des entrées avec Pydantic |
| 232 | +- ⚠️ **Production** : Devrait ajouter authentication/authorization |
| 233 | + |
| 234 | +## 🚀 Déploiement |
| 235 | + |
| 236 | +### Avec Docker (à venir) |
| 237 | + |
| 238 | +```bash |
| 239 | +docker build -t chatbot-rag . |
| 240 | +docker run -p 8000:8000 --env-file .env chatbot-rag |
| 241 | +``` |
| 242 | + |
| 243 | +### Avec Gunicorn |
| 244 | + |
| 245 | +```bash |
| 246 | +pip install gunicorn |
| 247 | +gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 |
| 248 | +``` |
| 249 | + |
| 250 | +## 🤝 Contribution |
| 251 | + |
| 252 | +1. Fork le projet |
| 253 | +2. Créer une branche feature (`git checkout -b feature/AmazingFeature`) |
| 254 | +3. Committer les changements (`git commit -m 'Add some AmazingFeature'`) |
| 255 | +4. Pousser vers la branche (`git push origin feature/AmazingFeature`) |
| 256 | +5. Ouvrir une Pull Request |
| 257 | + |
| 258 | +## 📝 Licence |
| 259 | + |
| 260 | +Ce projet est publié sous licence MIT. |
| 261 | + |
| 262 | +## 🙏 Remerciements |
| 263 | + |
| 264 | +- [FastAPI](https://fastapi.tiangolo.com/) |
| 265 | +- [SentenceTransformers](https://www.sbert.net/) |
| 266 | +- [Groq](https://groq.com/) - API LLM gratuite |
| 267 | +- [Uvicorn](https://www.uvicorn.org/) |
| 268 | + |
| 269 | +## 📞 Support |
| 270 | + |
| 271 | +Si vous rencontrez un problème : |
| 272 | +1. Vérifier que le fichier `.env` contient `GROQ_API_KEY` correctement |
| 273 | +2. Vérifier les logs dans la console |
| 274 | +3. Lancer le health check : `GET /health` |
| 275 | +4. Vérifier le statut LLM : `GET /llm/status` |
| 276 | + |
| 277 | +## 🎓 Pour en savoir plus |
| 278 | + |
| 279 | +- [Pattern RAG](https://www.promptingguide.ai/techniques/rag) |
| 280 | +- [Sentence Transformers](https://www.sbert.net/docs/usage/semantic_textual_similarity.html) |
| 281 | +- [Documentation FastAPI](https://fastapi.tiangolo.com/) |
| 282 | + |
| 283 | +--- |
| 284 | + |
| 285 | +Fait avec ❤️ en utilisant Python & FastAPI |
0 commit comments