Aller au contenu principal

Quiz - Construction d'API pour les modeles d'IA

Quiz 25 Questions 30 min

Section A — Concepts des API REST (8 questions)

Question 1

Dans l'analogie du restaurant pour les API, que represente le serveur (waiter) ?

  • A) L'application cliente
  • B) Le serveur API
  • C) Le modele ML
  • D) La base de donnees
Voir la reponse

B) Le serveur API

Le serveur (API) prend les commandes (requetes) du client (le consommateur), les apporte a la cuisine (modele) et sert le resultat (reponse) en retour. Le serveur n'a pas besoin de savoir cuisiner — tout comme l'API n'expose pas la logique interne du modele.


Question 2

Quelle methode HTTP devriez-vous utiliser pour un endpoint de prediction qui recoit des features d'entree et retourne une prediction ?

  • A) GET
  • B) POST
  • C) PUT
  • D) DELETE
Voir la reponse

B) POST

POST est utilise car :

  1. Les features d'entree peuvent etre complexes (objets imbriques, tableaux) — trop volumineux pour les parametres d'URL
  2. La requete inclut un corps (payload JSON)
  3. Les predictions peuvent avoir des effets de bord (journalisation, facturation)

GET est reserve pour recuperer des donnees sans corps de requete.


Question 3

Quelle est la difference entre les codes de statut HTTP 400 et 422 ?

  • A) 400 = erreur serveur, 422 = erreur client
  • B) 400 = syntaxe JSON malformee, 422 = JSON valide mais les donnees echouent a la validation
  • C) 400 = erreur d'authentification, 422 = erreur d'autorisation
  • D) Ils sont interchangeables
Voir la reponse

B) 400 = syntaxe JSON malformee, 422 = JSON valide mais les donnees echouent a la validation

  • 400 Bad Request : Le JSON lui-meme est casse (crochets manquants, syntaxe invalide)
  • 422 Unprocessable Entity : Le JSON est syntaxiquement correct, mais les donnees ne passent pas les regles metier (ex. age = -5, champ obligatoire manquant)

FastAPI utilise 422 par defaut pour les erreurs de validation Pydantic.


Question 4

Quel code de statut indique que le serveur API limite le debit du client ?

  • A) 401 Unauthorized
  • B) 403 Forbidden
  • C) 429 Too Many Requests
  • D) 503 Service Unavailable
Voir la reponse

C) 429 Too Many Requests

429 indique au client qu'il a depasse le nombre de requetes autorisees dans une fenetre de temps. La reponse devrait inclure un en-tete Retry-After indiquant quand le client peut reessayer.


Question 5

Que signifie le principe REST de l'absence d'etat (statelessness) ?

  • A) Le serveur stocke toutes les donnees client en memoire
  • B) Chaque requete doit contenir toutes les informations necessaires pour la traiter
  • C) L'API ne retourne aucune donnee
  • D) Le client doit s'authentifier a chaque requete
Voir la reponse

B) Chaque requete doit contenir toutes les informations necessaires pour la traiter

L'absence d'etat signifie que le serveur ne se souvient pas des requetes precedentes. Chaque requete de prediction doit inclure l'ensemble complet des features d'entree. Cela rend l'API evolutive (n'importe quelle instance serveur peut gerer n'importe quelle requete) et fiable (pas d'etat de session a perdre).


Question 6

Laquelle des propositions suivantes est la convention de nommage d'endpoint correcte pour une API REST ?

  • A) /api/v1/makePrediction
  • B) /api/v1/PREDICT
  • C) /api/v1/predictions
  • D) /api/v1/prediction_endpoint
Voir la reponse

C) /api/v1/predictions

Conventions REST :

  • Utiliser des noms, pas des verbes (predictions, pas makePrediction)
  • Utiliser des noms au pluriel (predictions, pas prediction)
  • Utiliser des minuscules avec kebab-case pour les chemins multi-mots
  • Inclure la version (/api/v1/)

Question 7

Qu'est-ce que CORS et pourquoi est-il necessaire ?

  • A) Un protocole de securite qui chiffre les reponses API
  • B) Un mecanisme du navigateur qui controle quels sites web peuvent appeler votre API
  • C) Une bibliotheque Python pour construire des API REST
  • D) Une strategie de mise en cache pour les reponses API
Voir la reponse

B) Un mecanisme du navigateur qui controle quels sites web peuvent appeler votre API

CORS (Cross-Origin Resource Sharing) est applique par les navigateurs. Quand un frontend a https://myapp.com appelle une API a https://api.myml.com, le navigateur bloque la requete sauf si l'API envoie des en-tetes Access-Control-Allow-Origin. Note : curl et Postman n'appliquent pas CORS — seuls les navigateurs le font.


Question 8

Dans la comparaison de REST, GraphQL et gRPC, quel protocole est le mieux adapte pour les microservices internes a haut debit ?

  • A) REST
  • B) GraphQL
  • C) gRPC
  • D) SOAP
Voir la reponse

C) gRPC

gRPC utilise HTTP/2 et les Protocol Buffers (serialisation binaire), ce qui le rend significativement plus rapide que le REST base sur JSON. Il supporte le streaming bidirectionnel et est ideal pour la communication interne service-a-service ou la compatibilite navigateur n'est pas necessaire.


Section B — FastAPI (7 questions)

Question 9

Quel est le principal avantage de FastAPI par rapport a Flask pour construire des API ML ?

  • A) Il est plus ancien et plus stable
  • B) Il a plus d'extensions disponibles
  • C) Il fournit la validation automatique des donnees et la documentation API
  • D) Il ne supporte que le code synchrone
Voir la reponse

C) Il fournit la validation automatique des donnees et la documentation API

FastAPI automatiquement :

  • Valide les donnees de requete en utilisant les modeles Pydantic
  • Genere la documentation Swagger UI
  • Genere la documentation ReDoc
  • Cree le schema JSON OpenAPI

Cela elimine le code de validation manuelle et garantit que la documentation est toujours synchronisee avec le code.


Question 10

Quel est le role de Pydantic dans une application FastAPI ?

  • A) Servir les requetes HTTP
  • B) Executer le serveur ASGI
  • C) Validation et serialisation des donnees en utilisant les annotations de type Python
  • D) Gerer les connexions a la base de donnees
Voir la reponse

C) Validation et serialisation des donnees en utilisant les annotations de type Python

Les modeles Pydantic definissent la structure, les types et les contraintes attendus des donnees d'entree et de sortie. FastAPI les utilise pour valider automatiquement les requetes et formater les reponses.

class PredictionInput(BaseModel):
age: int = Field(..., ge=18, le=120)
income: float = Field(..., gt=0)

Question 11

Pourquoi devriez-vous charger votre modele ML dans l'evenement lifespan plutot qu'a l'interieur de chaque gestionnaire de requete ?

  • A) C'est requis par FastAPI
  • B) Charger le modele par requete ajoute une latence massive et gaspille de la memoire
  • C) Le modele ne peut etre charge qu'une seule fois par processus Python
  • D) Pydantic l'exige
Voir la reponse

B) Charger le modele par requete ajoute une latence massive et gaspille de la memoire

Deserialiser un modele depuis le disque (ex. joblib.load()) peut prendre des centaines de millisecondes. Si fait par requete, chaque prediction est retardee. Charger une fois au demarrage signifie que le modele est en memoire et pret pour une inference instantanee.

@asynccontextmanager
async def lifespan(app: FastAPI):
ml_service.load_model("model.joblib") # une fois au demarrage
yield

Question 12

Que se passe-t-il si vous definissez un endpoint async def dans FastAPI mais appelez une fonction bloquante comme model.predict() a l'interieur ?

  • A) FastAPI la gere automatiquement dans un pool de threads
  • B) La boucle d'evenements est bloquee, gelant toutes les autres requetes simultanees
  • C) FastAPI leve un avertissement
  • D) La prediction s'execute plus vite grace a l'optimisation async
Voir la reponse

B) La boucle d'evenements est bloquee, gelant toutes les autres requetes simultanees

Quand on utilise async def, la fonction s'execute sur la boucle d'evenements. Les appels bloquants (operations CPU-bound comme model.predict()) empechent la boucle d'evenements de gerer les autres requetes. Utilisez def (sync) pour l'inference ML CPU-bound — FastAPI l'execute automatiquement dans un pool de threads.

# Correct pour l'inference ML
@app.post("/predict")
def predict(data: PredictionInput): # sync = pool de threads
result = model.predict(...)

Question 13

Laquelle des propositions suivantes est la bonne maniere de lancer une application FastAPI ?

  • A) python app.py
  • B) flask run
  • C) uvicorn app.main:app --reload
  • D) gunicorn app:app
Voir la reponse

C) uvicorn app.main:app --reload

FastAPI necessite un serveur ASGI. Uvicorn est le choix recommande :

  • app.main = chemin du module Python (app/main.py)
  • app = le nom de la variable de l'instance FastAPI
  • --reload = redemarrage automatique lors des changements de code (developpement uniquement)

Note : gunicorn est WSGI (pour Flask). gunicorn avec des workers uvicorn peut servir FastAPI en production.


Question 14

Que vous permet de faire le systeme d'injection de dependances de FastAPI ?

  • A) Injecter des styles CSS dans les reponses API
  • B) Partager de la logique reutilisable (authentification, connexions BD) entre les endpoints
  • C) Installer automatiquement les paquets Python
  • D) Creer des tables de base de donnees
Voir la reponse

B) Partager de la logique reutilisable (authentification, connexions BD) entre les endpoints

Les dependances sont des fonctions qui s'executent avant votre gestionnaire de route. Elles peuvent valider les cles API, fournir des sessions de base de donnees, verifier les permissions, etc.

async def verify_api_key(x_api_key: str = Header(...)):
if x_api_key not in valid_keys:
raise HTTPException(status_code=401)

@app.post("/predict", dependencies=[Depends(verify_api_key)])
def predict(data: PredictionInput):
...

Question 15

Dans FastAPI, ou pouvez-vous acceder a la documentation Swagger auto-generee ?

  • A) /swagger
  • B) /docs
  • C) /api-docs
  • D) /documentation
Voir la reponse

B) /docs

FastAPI fournit deux interfaces de documentation directement integrees :

  • Swagger UI : http://localhost:8000/docs
  • ReDoc : http://localhost:8000/redoc
  • JSON OpenAPI brut : http://localhost:8000/openapi.json

Section C — Flask (5 questions)

Question 16

Comment accedez-vous au corps JSON d'une requete POST dans Flask ?

  • A) request.json()
  • B) request.get_json()
  • C) request.body
  • D) flask.parse_json()
Voir la reponse

B) request.get_json()

from flask import request

@app.route("/predict", methods=["POST"])
def predict():
data = request.get_json() # retourne un dict ou None
if data is None:
return jsonify({"error": "JSON required"}), 400

Utilisez silent=True pour retourner None au lieu de lever une exception sur du JSON invalide : request.get_json(silent=True).


Question 17

A quoi servent les Blueprints Flask ?

  • A) Dessiner des diagrammes architecturaux
  • B) Organiser les routes en composants modulaires et reutilisables
  • C) Creer des schemas de base de donnees
  • D) Generer la documentation API
Voir la reponse

B) Organiser les routes en composants modulaires et reutilisables

Les Blueprints vous permettent de regrouper les routes associees dans des fichiers separes, similaire a l'APIRouter de FastAPI.

predictions_bp = Blueprint("predictions", __name__)

@predictions_bp.route("/predict", methods=["POST"])
def predict():
...

# Enregistrer dans l'application
app.register_blueprint(predictions_bp, url_prefix="/api/v1")

Question 18

Quel est le principal desavantage de Flask par rapport a FastAPI pour les API ML ?

  • A) Flask ne peut pas servir de requetes HTTP
  • B) Flask ne supporte pas les reponses JSON
  • C) Flask necessite une validation manuelle des donnees et ne genere pas de documentation automatiquement
  • D) Flask ne peut pas charger les modeles scikit-learn
Voir la reponse

C) Flask necessite une validation manuelle des donnees et ne genere pas de documentation automatiquement

Flask est un micro-framework — il fournit le routage et la gestion des requetes mais laisse la validation et la documentation aux extensions ou au code manuel. Cela signifie plus de code repetitif et un risque que la documentation derive du comportement reel.


Question 19

Quelle extension Flask ajoute la documentation Swagger/OpenAPI ?

  • A) Flask-SQLAlchemy
  • B) Flask-CORS
  • C) Flask-RESTX
  • D) Flask-Login
Voir la reponse

C) Flask-RESTX

Flask-RESTX (successeur de Flask-RESTPlus) ajoute la documentation Swagger aux applications Flask. Vous definissez les modeles API avec api.model() et utilisez des ressources basees sur les classes.

from flask_restx import Api, Resource, fields

api = Api(app, doc="/docs")
ns = api.namespace("predictions")

Question 20

Qu'est-ce que le pattern application factory de Flask ?

  • A) Un pattern de conception ou l'application Flask est creee a l'interieur d'une fonction au lieu du scope global
  • B) Un moyen de generer automatiquement des applications Flask
  • C) Un framework de test pour Flask
  • D) Une strategie de deploiement pour la production
Voir la reponse

A) Un pattern de conception ou l'application Flask est creee a l'interieur d'une fonction au lieu du scope global

def create_app(config=None):
app = Flask(__name__)
if config:
app.config.update(config)
# enregistrer les blueprints, charger le modele, etc.
return app

Avantages :

  • Tests plus faciles (creer l'application avec differentes configurations)
  • Evite les imports circulaires
  • Plusieurs instances d'application possibles

Section D — Documentation API et bonnes pratiques (5 questions)

Question 21

Qu'est-ce que la specification OpenAPI ?

  • A) Une bibliotheque Python pour construire des API
  • B) Un standard lisible par les machines pour decrire les API REST
  • C) Un framework de test pour les API
  • D) Une plateforme de deploiement pour les API
Voir la reponse

B) Un standard lisible par les machines pour decrire les API REST

La specification OpenAPI (anciennement specification Swagger) est un format agnostique du langage (YAML/JSON) qui decrit :

  • Les endpoints et operations disponibles
  • Les schemas de requete/reponse
  • Les methodes d'authentification
  • Les metadonnees de l'API

Des outils comme Swagger UI affichent cette specification sous forme de documentation interactive.


Question 22

Pourquoi l'approche FastAPI pour la documentation (auto-generation depuis le code) est-elle consideree superieure ?

  • A) Elle produit une documentation plus jolie
  • B) La documentation est une source unique de verite — le code, la validation et la documentation sont toujours synchronises
  • C) Elle supporte plus de langages
  • D) Elle ne necessite pas de serveur web
Voir la reponse

B) La documentation est une source unique de verite — le code, la validation et la documentation sont toujours synchronises

Dans FastAPI, les modeles Pydantic servent trois objectifs simultanement :

  1. Validation : Rejeter les requetes invalides
  2. Serialisation : Formater les reponses
  3. Documentation : Generer les schemas Swagger

Quand vous changez le modele, les trois se mettent a jour automatiquement. Avec la documentation manuelle, les changements sont souvent oublies.


Question 23

Quelle est la strategie de versionnage d'API recommandee ?

  • A) Parametre de requete (?version=1)
  • B) En-tete personnalise (X-API-Version: 1)
  • C) Chemin URL (/api/v1/predict)
  • D) Pas de versionnage necessaire
Voir la reponse

C) Chemin URL (/api/v1/predict)

Le versionnage par chemin URL est la strategie la plus courante et recommandee car :

  • C'est visible et explicite
  • Facile a router au niveau du repartiteur de charge
  • Peut executer plusieurs versions simultanement
  • Clair dans la documentation et les logs
/api/v1/predict  → modele v1
/api/v2/predict → modele v2 (nouvelles features)

Question 24

Que pouvez-vous generer a partir d'une specification OpenAPI en utilisant openapi-generator ?

  • A) Des modeles ML dans differents frameworks
  • B) Des SDK clients dans plusieurs langages de programmation
  • C) Des schemas de base de donnees
  • D) Des conteneurs Docker
Voir la reponse

B) Des SDK clients dans plusieurs langages de programmation

A partir d'une seule specification OpenAPI, vous pouvez generer des bibliotheques clientes pour :

  • Python, JavaScript, TypeScript, Java, Go, C#, Ruby, et bien d'autres

Cela signifie que les developpeurs frontend et mobile obtiennent du code client type-safe qui correspond exactement a votre API, sans l'ecrire manuellement.


Question 25

Laquelle des propositions suivantes n'est PAS une bonne pratique pour la documentation API ?

  • A) Inclure des exemples pour chaque endpoint
  • B) Documenter toutes les reponses d'erreur possibles
  • C) Ecrire la documentation separement du code dans un document Word
  • D) Inclure les descriptions et contraintes des champs pour tous les parametres de requete
Voir la reponse

C) Ecrire la documentation separement du code dans un document Word

La documentation separee (Word, PDF, wiki) deviendra obsolete au fur et a mesure que le code evolue. Bonnes pratiques :

  • Generer la documentation depuis le code (approche FastAPI)
  • Garder la documentation aussi proche du code que possible
  • Utiliser la specification OpenAPI comme source unique de verite
  • Automatiser les mises a jour de la documentation dans le CI/CD

Questions bonus

Question 26

Un client recoit une reponse 503 Service Unavailable de votre API ML. Quelle est la cause la plus probable ?

  • A) Le client a envoye du JSON invalide
  • B) Le modele ML n'a pas encore ete charge (le serveur demarre)
  • C) La cle API du client est expiree
  • D) L'URL de l'endpoint est incorrecte
Voir la reponse

B) Le modele ML n'a pas encore ete charge (le serveur demarre)

503 signifie que le serveur est temporairement incapable de gerer la requete. Dans les API ML, cela survient generalement quand :

  • Le modele est encore en cours de chargement au demarrage
  • Le fichier de modele n'a pas ete trouve (mode degrade)
  • Le serveur est surcharge

Le client devrait reessayer apres un court delai.


Question 27

Dans le contexte des API ML, que signifie l'idempotence ?

  • A) L'API retourne toujours la meme prediction
  • B) Faire la meme requete plusieurs fois produit le meme resultat et les memes effets de bord
  • C) L'API peut gerer plusieurs requetes simultanement
  • D) L'API necessite une authentification
Voir la reponse

B) Faire la meme requete plusieurs fois produit le meme resultat et les memes effets de bord

GET, PUT et DELETE sont idempotents — les repeter ne change pas le resultat. POST n'est generalement pas idempotent. Pour les API ML, une prediction pour la meme entree devrait retourner le meme resultat (en supposant que le modele n'a pas change), mais les requetes POST peuvent avoir des effets de bord comme la journalisation ou la facturation.


Question 28

Laquelle des propositions suivantes est la bonne maniere de gerer CORS dans une application FastAPI ?

  • A) app.add_middleware(CORSMiddleware, allow_origins=["http://localhost:3000"])
  • B) app.cors(origins=["*"])
  • C) @app.cors("http://localhost:3000")
  • D) CORS est gere automatiquement par FastAPI
Voir la reponse

A) app.add_middleware(CORSMiddleware, allow_origins=["http://localhost:3000"])

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_methods=["GET", "POST"],
allow_headers=["*"],
)

Rappelez-vous : n'utilisez jamais allow_origins=["*"] en production.


Question 29

Quel est le but d'un endpoint /health dans une API ML ?

  • A) Retourner la precision d'entrainement du modele
  • B) Permettre aux systemes de surveillance de verifier que le service fonctionne et que le modele est charge
  • C) Reentrainer le modele
  • D) Afficher la documentation API
Voir la reponse

B) Permettre aux systemes de surveillance de verifier que le service fonctionne et que le modele est charge

Un endpoint de sante est essentiel pour :

  • Repartiteurs de charge : Router le trafic uniquement vers les instances saines
  • Orchestrateurs de conteneurs (Kubernetes) : Redemarrer les pods non sains
  • Surveillance : Alerter quand le service se degrade
  • Deploiement : Verifier que les nouveaux deploiements fonctionnent
{
"status": "healthy",
"model_loaded": true,
"model_version": "v1.0"
}

Question 30

Vous construisez une API qui recoit des images pour la classification. Quelle fonctionnalite de FastAPI devriez-vous utiliser pour accepter les telechargements d'images ?

  • A) request.get_json()
  • B) Parametres Query avec encodage base64
  • C) UploadFile avec File(...)
  • D) BaseModel Pydantic avec champ bytes
Voir la reponse

C) UploadFile avec File(...)

from fastapi import UploadFile, File

@app.post("/predict/image")
async def predict_image(file: UploadFile = File(...)):
contents = await file.read()
# traiter l'image...

UploadFile est optimise pour les telechargements de fichiers :

  • Diffuse les gros fichiers en streaming (ne charge pas tout en memoire)
  • Fournit le nom de fichier, les metadonnees du type de contenu
  • Compatible async

Guide de score

ScoreNiveauRecommandation
25-30ExcellentVous etes pret pour les TP et les sujets avances
20-24BonRevisez les sections ou vous avez fait des erreurs
15-19AdequatRelisez les sections concepts et FastAPI
< 15A travaillerRevisez tout le materiel du module avant les TP