É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 :
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"]| Test | Ce qu'il protège |
|---|---|
test_images_generees | le générateur couvre bien les 5 classes, en 512 × 512 |
test_parcours_complet_avec_faux_bucket | lister → inspecter → publier, garde-fou de chemin, contenu du rapport |
test_evaluer_signale_une_piece_defectueuse_acceptee | la métrique la plus importante pour l'atelier |
test_schema_refuse_un_defaut_inconnu | la liste fermée du schéma |
cd files && pip install -r requirements.txt && pytest -qMesurer : deux chiffres, pas un
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 ?
Quand les défauts sont rares, l'exactitude globale est trompeuse. C'est pour cela que lancer.py rapporte aussi la liste des pièces défectueuses acceptées, qui serait ici de 5 sur 5.
Le run réel
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.pyRésultat obtenu
Les tests sans clé :
.... [100%]
4 passed, 1 warning in 0.55sPuis 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 :
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
gcloud storage rm -r "gs://${BUCKET}" --project "$PROJECT_ID"
gcloud storage buckets list --project "$PROJECT_ID" --filter "name=${BUCKET}" --format 'value(name)' # doit être viderm -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 ?
Le lab n'a créé qu'une ressource : le bucket. Les appels Gemini sont facturés à l'usage mais ne créent rien de persistant. Les fichiers locaux (images/, verite_terrain.json) restent sur votre poste.
Résultat obtenu (nettoyage)
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