Lesson 4 — Tester, évaluer, exploiter

Évaluer, publier, supprimer

5 min read

This content is not translated yet. Showing the original version.

Évaluer, publier, supprimer

Tester sans GCP

Les tests remplacent Cloud Storage par un FauxBucket (un dictionnaire) et le modèle de vision par une fonction qui renvoie un Inspection prévisible, grâce à monkeypatch de pytest :

files/test_inspection.py
monkeypatch.setattr(agent, "_bucket", lambda: bucket)
monkeypatch.setattr(agent, "classer_image", faux_classer)
...
assert agent.lister_images() == {"nombre": 2, "images": ["images/piece-01.png", "images/piece-02.png"]}
assert agent.inspecter_image("autre/notes.txt")["erreur"]          # garde-fou du préfixe
r = agent.publier_rapport()
assert r["rejets"] == ["images/piece-02.png"]
TestCe qu'il protège
test_images_genereesle générateur couvre bien les 5 classes, en 512 × 512
test_parcours_complet_avec_faux_bucketlister → inspecter → publier, garde-fou de chemin, contenu du rapport
test_evaluer_signale_une_piece_defectueuse_accepteela métrique la plus importante pour l'atelier
test_schema_refuse_un_defaut_inconnula liste fermée du schéma
terminal
cd files && pip install -r requirements.txt && pytest -q

Mesurer : deux chiffres, pas un

files/lancer.py
def evaluer(resultats, verite):
    justes = sum(resultats.get(f"images/{nom}", {}).get("defaut") == d for nom, d in verite.items())
    manques = [n for n, d in verite.items() if d != "aucun" and resultats.get(f"images/{n}", {}).get("conforme")]
    return {"exactitude": justes / len(verite), "defectueuses_acceptees": manques}
  • Exactitude : part des pièces dont le défaut est correctement identifié.
  • Défectueuses acceptées : la liste des pièces défectueuses déclarées conformes. L'objectif est une liste vide.
flowchart LR
  R["Résultats de l'agent"] --> E["evaluer()"]
  V["verite_terrain.json"] --> E
  E --> X["exactitude"]
  E --> D["défectueuses acceptées"]
  D -->|"non vide"| A["Bloquer la mise en service, revoir la consigne ou le modèle"]

Sur 100 pièces dont 5 défectueuses, un « agent » qui déclare tout conforme obtient quelle exactitude ?

Le run réel

terminal
export GOOGLE_GENAI_USE_VERTEXAI=TRUE GOOGLE_CLOUD_PROJECT="mon-projet-gcp" GOOGLE_CLOUD_LOCATION=europe-west1
export BUCKET="lab-inspection-qualite-${GOOGLE_CLOUD_PROJECT}"
python lancer.py

Résultat obtenu

Les tests sans clé :

pytest (2026-10-15)
....                                                                     [100%]
4 passed, 1 warning in 0.55s

Puis la sortie réelle du 2026-10-15 (Vertex AI, gemini-2.5-flash, europe-west1). Un premier essai s'était arrêté sur une erreur 429 RESOURCE_EXHAUSTED (quota partagé) : c'est ce qui nous a fait ajouter les réessais au modèle de l'agent. Le second passage :

lancer.py (2026-10-15)
OUTIL  lister_images {}
OUTIL  inspecter_image {'nom': 'images/piece-01.png'}
OUTIL  inspecter_image {'nom': 'images/piece-02.png'}
OUTIL  inspecter_image {'nom': 'images/piece-03.png'}
OUTIL  inspecter_image {'nom': 'images/piece-04.png'}
OUTIL  inspecter_image {'nom': 'images/piece-05.png'}
OUTIL  inspecter_image {'nom': 'images/piece-06.png'}
OUTIL  publier_rapport {}

SYNTHESE
L'inspection du lot est terminée.
Sur un total de 6 pièces inspectées, 4 pièces sont à rejeter.
...
Il est recommandé à l'atelier de vérifier les causes de ces défauts, en particulier les fissures et les manques, pour améliorer la qualité de la production.

EVALUATION {'exactitude': 1.0, 'defectueuses_acceptees': []}

Soit 6 appels de vision et quelques appels de l'agent. Ne surinterprétez pas le 100 % : six images synthétiques aux défauts bien visibles, c'est un test de fumée (la chaîne fonctionne), pas une mesure de précision industrielle.

Supprimer le bucket

files/nettoyer.sh
gcloud storage rm -r "gs://${BUCKET}" --project "$PROJECT_ID"
gcloud storage buckets list --project "$PROJECT_ID" --filter "name=${BUCKET}" --format 'value(name)'  # doit être vide

rm -r sur le bucket supprime d'abord tous les objets (images et rapport), puis le bucket lui-même.

Après nettoyer.sh, que reste-t-il de ce lab sur Google Cloud ?

Résultat obtenu (nettoyage)

nettoyer.sh (2026-10-15)
Removing objects: ......
$ gcloud storage buckets list --project mon-projet-gcp --format="value(name)" | grep lab-inspection || echo "bucket supprimé"
bucket supprimé

Exercice

Transformez lancer.py en garde-fou de non-régression : le script doit se terminer avec un code d'erreur si l'exactitude passe sous 0,8 ou si une pièce défectueuse est acceptée, pour pouvoir le lancer avant chaque changement de consigne.

Voir la solution

À la fin de main() :

import sys

resultat = evaluer(agent._resultats, verite)
print("\nEVALUATION", resultat)
if resultat["defectueuses_acceptees"] or resultat["exactitude"] < 0.8:
    print("ÉCHEC : régression de qualité", file=sys.stderr)
    sys.exit(1)

Dans une CI, ce script ne doit tourner que sur demande (il appelle le vrai modèle et coûte quelques appels) ; les tests pytest sans clé, eux, tournent à chaque commit.

Je sais faire

  • Tester un agent qui utilise Cloud Storage et Gemini sans aucun accès réel
  • Mesurer exactitude et pièces défectueuses acceptées
  • Interpréter honnêtement un résultat sur un petit jeu synthétique
  • Supprimer un bucket et vérifier sa disparition