Spaces:
Sleeping
Sleeping
File size: 7,183 Bytes
2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 b36f0fe 2d887e1 | 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 | ---
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 de la FAQ au format JSON
├── embeddings.py # Gestion ChromaDB + modèle transformers
└── data/
└── faq.json # Exemple de base FAQ (intentions, formulations, réponses)
```
## 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 faq-backend-api
```
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": "Est-ce que c’est gratuit ?"
}
```
**Réponse :**
```json
{
"question": "Est-ce que c’est gratuit ?",
"formulation": "Est-ce que c’est gratuit ?",
"answer": "Oui. L’adhésion et la participation aux projets de l'association sont gratuites. Il n’y a ni frais de formation ni cotisation obligatoire pour contribuer aux projets.",
"theme": "est_ce_que_c_est_gratuit",
"similarity_score": 0.95,
"confidence": true
}
```
**Champs de réponse :**
- `question` : Question posée
- `formulation` : Formulation de la FAQ qui correspond le mieux à la question
- `answer` : Réponse trouvée dans la FAQ
- `theme` : Intention de la FAQ (`intent_key`)
- `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": 474
}
```
### 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": "Est-ce que c’est gratuit ?"}'
# 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": "Est-ce que c’est gratuit ?"})
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
Le fichier d'exemple `data/faq.json` illustre le format attendu (chemin défini par `FAQ_JSON_PATH` dans `config.py`). Il contient une liste `intents` ; chaque intent activé (`enabled: true`) comporte :
- `intent_key` : identifiant de l'intention (renvoyé comme `theme`)
- `canonical_question` et `utterances` : formulations de la question
- `response` : réponse associée
Les FAQs sont chargées et indexées au démarrage de l'application.
## Hugging Face
L'API est déployée sur Hugging Face Spaces (runtime Docker) : **https://loren-faq-backend-api.hf.space**
| Ressource | URL |
|---|---|
| Swagger UI | https://loren-faq-backend-api.hf.space/docs |
| Question (POST) | https://loren-faq-backend-api.hf.space/ask |
| Santé | https://loren-faq-backend-api.hf.space/health |
| Configuration | https://loren-faq-backend-api.hf.space/config |
Exemple :
```bash
curl -X POST "https://loren-faq-backend-api.hf.space/ask" -H "Content-Type: application/json" -d '{"question": "Comment je deviens membre ?"}'
```
### Configuration
Dans l'interface du Space, "Settings" → "Variables and secrets" permet de définir les variables d'environnement (ex : `SIMILARITY_THRESHOLD=0.6`). Les logs de build et d'exécution sont consultables depuis l'onglet "Logs".
### Démarrage
Le démarrage (~30-60s) comprend :
1. Installation des dépendances
2. Téléchargement des modèles (embeddings et cross-encoder)
3. Chargement de la FAQ
4. Génération des embeddings
Après une période d'inactivité, le Space peut être mis en veille : la première requête peut alors prendre quelques dizaines de secondes.
## 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** : 3 par défaut (`TOP_K` dans `config.py`) : nombre maximum de thèmes distincts retenus comme candidats (`list_candidates`). Peut être surchargé par requête via le champ `top_k` de `/ask`
## 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
|