Spaces:
Sleeping
Sleeping
File size: 7,151 Bytes
3e98f81 411e952 3e98f81 411e952 3e98f81 411e952 3e98f81 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 | ---
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 <url>
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/<username>/<space-name>`
- 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://<username>-<space-name>.hf.space/docs`
- Endpoint `/ask` : `https://<username>-<space-name>.hf.space/ask`
- Health : `https://<username>-<space-name>.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
|