--- title: API FAQ - Embeddings Multilingues description: API FastAPI pour répondre à des questions via recherche de similarité sur une base FAQ avec embeddings multilingues sdk: docker --- # API FAQ - Embeddings Multilingues API FastAPI permettant de répondre à des questions en cherchant la réponse la plus similaire dans une base FAQ via recherche d'embeddings multilingues. ## Caractéristiques - 🌍 **Multilingue** : Utilise le modèle `intfloat/multilingual-e5-small` pour supporter plusieurs langues - 🚀 **Rapide** : Recherche par similarité cosinus via ChromaDB - 📊 **Seuil configurable** : Filtrage des réponses selon un seuil de confiance - 📝 **Type-safe** : Utilise Pydantic pour la validation des données - 📚 **Documentation interactive** : Swagger UI intégrée via `/docs` ## Architecture ``` app.py # Point d'entrée FastAPI ├── models.py # Modèles Pydantic (QuestionInput, AnswerOutput) ├── config.py # Configuration centralisée ├── faq_loader.py # Chargement des fichiers CSV ├── embeddings.py # Gestion ChromaDB + modèle transformers └── data/ ├── faq_formulations.csv # Questions FAQ └── faq_responses.csv # Réponses FAQ ``` ## Installation locale ### Prérequis - Python 3.8+ - pip ou conda ### Étapes 1. **Cloner le repository** (ou télécharger les fichiers) ```bash git clone cd choupidou ``` 2. **Créer un environnement virtuel** (recommandé) ```bash python -m venv venv # Windows venv\Scripts\activate # Linux/Mac source venv/bin/activate ``` 3. **Installer les dépendances** ```bash pip install -r requirements.txt ``` 4. **Configurer les variables d'environnement** (optionnel) ```bash cp .env.example .env # Éditer .env si nécessaire ``` 5. **Lancer l'application** ```bash uvicorn app:app --reload ``` L'API sera accessible à `http://localhost:8000` ## Utilisation ### Endpoint principal : POST `/ask` Poser une question et obtenir la réponse la plus similaire **Requête :** ```json { "question": "Les parents ont-ils besoin de télécharger une application ?" } ``` **Réponse :** ```json { "question": "Les parents ont-ils besoin de télécharger une application ?", "answer": "Non. Les parents accèdent aux médias via un lien web reçu par e-mail, sans installation requise.", "theme": "need_download_family_app", "similarity_score": 0.95, "confidence": true } ``` **Champs de réponse :** - `question` : Question posée - `answer` : Réponse trouvée dans la FAQ - `theme` : Catégorie/thème de la FAQ - `similarity_score` : Score de similarité cosinus [0, 1] - `confidence` : `true` si le score ≥ seuil de confiance, `false` sinon ### Endpoint santé : GET `/health` Vérifier l'état du service et le nombre de FAQs indexées **Réponse :** ```json { "status": "ok", "faq_count": 3 } ``` ### Documentation interactive : GET `/docs` Accéder à la documentation Swagger UI interactive : ``` http://localhost:8000/docs ``` ## Tests ### Avec curl ```bash # Test question connue curl -X POST "http://localhost:8000/ask" \ -H "Content-Type: application/json" \ -d '{"question": "Les parents ont-ils besoin de télécharger une application ?"}' # Test question inconnue curl -X POST "http://localhost:8000/ask" \ -H "Content-Type: application/json" \ -d '{"question": "Comment faire des crêpes ?"}' # Health check curl "http://localhost:8000/health" ``` ### Avec Python ```python import requests url = "http://localhost:8000/ask" response = requests.post(url, json={"question": "Les parents ont-ils besoin de télécharger une application ?"}) print(response.json()) ``` ### Avec Postman ou Insomnia Importer la collection depuis `/docs` ou créer manuellement une requête POST vers `/ask` ## Configuration ### Variables d'environnement Créer un fichier `.env` (voir `.env.example`) pour configurer : ```env # Modèle d'embedding MODEL_NAME=intfloat/multilingual-e5-small # Seuil de confiance [0.0, 1.0] # 0.5 par défaut SIMILARITY_THRESHOLD=0.5 ``` ### Fichiers de données Les fichiers FAQ doivent être dans `data/` : - `faq_formulations.csv` : colonnes `formulation;theme` - `faq_responses.csv` : colonnes `theme;response` Les FAQs sont chargées et indexées au démarrage de l'application. ## Déploiement sur Hugging Face Spaces ### Étapes 1. **Créer un Hugging Face Space** - Aller sur https://huggingface.co/spaces - Cliquer sur "Create new Space" - Choisir "Docker" comme runtime (ou "Python 3" + Dockerfile) 2. **Configurer le repository** - Cloner le Space : `git clone https://huggingface.co/spaces//` - Copier les fichiers du projet 3. **Pousser le code** ```bash git add . git commit -m "Initial commit: FAQ API" git push ``` 4. **HF Spaces va automatiquement** - Déployer l'application - Générer les embeddings au démarrage - Rendre l'API publique avec HTTPS 5. **Accéder à l'API** - Swagger UI : `https://-.hf.space/docs` - Endpoint `/ask` : `https://-.hf.space/ask` - Health : `https://-.hf.space/health` ### Configuration HF Spaces Dans l'interface web du Space, vous pouvez configurer : - **Secrets** : Ajouter des variables d'env sensibles via "Settings" → "Repository Secrets" - Ex: `SIMILARITY_THRESHOLD=0.6` - **Resources** : Allouer CPU/RAM (par défaut: CPU standard) - **Logs** : Consulter les logs de déploiement et runtime ### Démarrage prévu Le démarrage (~30-60s) comprend : 1. Installation des dépendances 2. Téléchargement du modèle d'embedding (~500MB) 3. Chargement des FAQ 4. Génération des embeddings ## Architecture ChromaDB ### EphemeralClient (Option utilisée) Les embeddings sont chargés en mémoire au démarrage et recalculés à chaque redémarrage : **Avantages :** - ✓ Plus rapide (pas d'I/O disque) - ✓ Pas de dépendance de persistance - ✓ Idéal pour HF Spaces (ressources limitées) **Inconvénients :** - Les embeddings sont recalculés à chaque déploiement (~30s) ### PersistentClient (Alternative) Si vous préférez persister les embeddings sur disque, remplacer `EphemeralClient` par `PersistentClient` dans `embeddings.py`. ## Considérations de performance - **Modèle** : `multilingual-e5-small` (~50MB) - **Threshold** : Augmenter pour être plus strict, réduire pour plus de matches - **Top-k** : Actuellement set à 1 (retourne le meilleur match) - modifier dans `embeddings.py` pour en retourner plusieurs ## Troubleshooting ### "ModuleNotFoundError: No module named 'chromadb'" → Installer les dépendances : `pip install -r requirements.txt` ### Pas de réponses trouvées → Vérifier le seuil : `SIMILARITY_THRESHOLD` trop élevé ? → Augmenter : `SIMILARITY_THRESHOLD=0.3` ou vérifier que les FAQs sont bien chargées via `/health` ## Logs Les logs sont affichés au démarrage et en temps réel : - 🚀 Démarrage - 📚 Chargement FAQ - ✓ Application prête - 📝 Questions reçues - ✓/❌ Réponses trouvées