Gemini 2.5 – Prompt Engineering
Formuler des prompts Vertex AI efficaces pour le développement web.
Clarté & concision
Avec Gemini 2.5, un prompt utile pour un dev est spécifique, testable et court. Il impose un format exploitable par le backend (diff, JSON) et donne des bornes claires.
🎯 Objectifs de clarté
- Résultat observable (ex. “liste paginée qui passe tel test”).
- Format strict :
bloc par fichier,diff unifiéouJSON. - Bornes : taille max, étapes, “STOP & question” si dépassement.
- Auto-contrôle demandé : risques, alternatives, plan de tests.
✅ Check-list express
- 1 phrase qui décrit le livrable + critère de succès.
- Contexte minimal (stack/versions/conventions) fourni.
- Format de sortie + limites fixés.
- Exemple/few-shot si le style est important.
🧱 Patron concis (copier/coller)
OBJECTIF : <livrable concret et mesurable> (1 test ou capture)
FORMAT : <bloc par fichier | diff | JSON (schema)>
CONTRAINTES : <versions, libs, conventions (PEP8), fichiers autorisés>
BORNES : si > 120 lignes cumulées ➜ STOP et pose 1 question
AUTO-CHECK : rappelle contraintes/risques/tests en 3 puces🧨 Ambiguïtés à bannir (→ alternatives)
“améliorer / optimiser” → objectif mesuré (ex. LCP < 2.5s, -30% SQL)
“fais tout / décide” → plan en 3–5 étapes + “OK étape 1 seulement”
“exemple” → JSON valide + schema + taille max🧩 Sortie JSON typée (Vertex AI)
from vertexai.generative_models import GenerationConfig, ResponseSchema
schema = ResponseSchema(type="object", properties={
"files":{"type":"array","items":{"type":"object","properties":{
"path":{"type":"string"}, "action":{"type":"string","enum":["create","patch"]},
"content":{"type":"string"} } }},
"commands":{"type":"array","items":{"type":"string"}}
}, required=["files"])
cfg = GenerationConfig(response_mime_type="application/json", response_schema=schema)Demande : “Rends la réponse au format du schéma ci-dessus.
Si tu modifies un fichier, fournis un DIFF UNIFIÉ dans 'content'.”📌 Exemple clarifié
OBJECTIF : Formulaire Contact Django (nom, email, message) avec honeypot + rate-limit IP.
FORMAT : bloc par fichier (chemin exact) + 3 tests pytest (ok / honeypot / throttle).
CONTRAINTES : Django 5, Bootstrap 5, PEP8, fichiers autorisés uniquement.
BORNES : ≤ 120 lignes cumulées — sinon STOP & question.Contextualisation
Gemini 2.5 répond mieux quand le contexte est structuré, avec fichiers autorisés, versions et règles explicites.
📦 Context Pack — gabarit Vertex
PROJET : <nom> — <but produit>
STACK : Python 3.12, Django 5, MariaDB, Bootstrap 5
ARCHI : templates Django, static/js, CI Cloud Build, Cloud Run
CONVENTIONS : PEP8, “bloc par fichier” pour les réponses, tests pytest
FICHIERS AUTORISÉS : app/{models.py, admin.py, views.py, urls.py}, templates/app/*.html, static/js/*.js
RÉFÉRENCES : chemins/modules, snippets (few-shot) à imiter🧭 Contexte utile (vs. bruit)
- Utile : versions exactes, structure du repo, schémas de données, endpoints, contraintes légales/sécu.
- Inutile : historique long, verbiage marketing, copies d’écran non textuelles.
🧱 Repo snapshot (ex.)
accounts/ models.py, admin.py, views.py, urls.py
ia/ views.py, templates/AI/gemini_*.html
common/ templates/accounts/base_dashboard_2025.html
static/js/*.js, static/css/pages/*.css⚙️ Paramètres utiles (inférence)
- Température 0–0.3 pour le code ; 0.7 pour l’idéation.
- Sortie JSON quand le back doit parser/appliquer.
- Demandes de preuves (chemins, commandes, tests, diff) → moins d’hallucinations.
🧩 Exemple complet
PROJET : Ideo-Lab
OBJECTIF : Modèle “Article” + admin + ListView + URL + template.
STACK/CONVENTIONS : Django 5, Bootstrap 5, PEP8, bloc par fichier.
FICHIERS AUTORISÉS : blog/models.py, blog/admin.py, blog/views.py, blog/urls.py, templates/blog/article_list.html
BORNES : ≤ 120 lignes ; sinon STOP & question.
SORTIE : blocs par fichier + commandes manage.py + 1 test pytest.Progressivité (itérations courtes)
Procéder étape par étape limite la dérive et facilite les contrôles. On garde la cadence : plan → étape N → validation → étape N+1.
🗺️ Protocole d’itération
1) Demander un plan en 3–5 étapes.
2) “OK étape 1” ➜ livrer uniquement l’étape 1 (stop ensuite).
3) Exécuter les contrôles/tests proposés.
4) Valider / demander retouche.
5) Passer à l’étape suivante.✂️ Gabarit “Étape N”
"OK étape N. Donne uniquement <élément> (max 60 lignes).
Format bloc par fichier. Si dépassement ➜ STOP et propose un split."🧪 Gate review (avant d’avancer)
- Build/migration/tests OK ?
- Noms/chemins conformes, pas d’effets de bord ?
- Diff minimal + doc de tête (si modif) ?
📌 Exemple “CRUD en 3 tranches”
Étape 1 : Modèle + admin + migration (+ test modèle)
Étape 2 : ListView + URL + template (+ test liste)
Étape 3 : CreateForm + tests (OK/erreur/permission)🛑 Stop conditions
• > 120 lignes cumulées
• Changement de périmètre imprévu
• Dépendance manquante détectéeExemples concrets — bons vs mauvais prompts
Comparer “mauvais” vs “bon” montre exactement ce qui rend le prompt exploitable pour un dev & un backend Vertex.
A) Scaffold Django (CRUD + admin)
Mauvais :
"Fais un blog Django."
Bon :
RÔLE : Architecte Django senior
OBJECTIF : Modèle Article(title, slug unique, body, published_at, is_published) + admin + ListView paginée + URL + template Bootstrap 5.
FICHIERS AUTORISÉS : blog/models.py, blog/admin.py, blog/views.py, blog/urls.py, templates/blog/article_list.html
CONTRAINTES : PEP8, chemins exacts, si >120 lignes ➜ STOP & question
SORTIE : blocs par fichier + commandes manage.py + 1 test pytest (liste non vide)B) Bug avec stack trace
Mauvais :
"Ça plante, aide-moi."
Bon :
"Voici la stack trace (20 lignes) et views.py (l.10–60).
Explique la cause probable (3 points), propose 1 patch minimal (diff unifié)
et 1 test pytest qui échoue avant/passe après. Bloc par fichier."C) Function Calling (tools) côté Vertex
from vertexai.generative_models import GenerativeModel, Tool, FunctionDeclaration
tool = Tool(function_declarations=[FunctionDeclaration(
name="lookup_doc",
description="Recherche interne (titre/contenu).",
parameters={"type":"object","properties":{"query":{"type":"string"}},"required":["query"]}
)])
model = GenerativeModel("gemini-2.5-pro")
resp = model.generate_content("Donne la synthèse RGPD et cite les sources.", tools=[tool])
# Parcourir resp.candidates[0].content.parts → exécuter la fonction côté serveur → renvoyer résultat si le SDK l'exigeD) RAG & Grounding
Mauvais :
"Lis nos docs et réponds."
Bon :
"Utilise d'abord Vertex AI Search pour récupérer les 5 meilleurs passages
(cite les URLs/lignes), puis réponds en te limitant à ces sources."E) React (Next.js 14 + Tailwind)
Mauvais :
"Fais un formulaire React."
Bon :
"Crée 'ContactForm' contrôlé (nom, email, message) avec validation,
props typées, Tailwind seulement, exemple d’usage. ≤ 120 lignes.
Si plus long ➜ STOP et propose un split."F) SQL → ORM + index
Mauvais :
"Convertis cette requête."
Bon :
"Convertis la requête SQL en QuerySet Django et propose l’index à ajouter
(champ+ordre) pour optimiser le WHERE. Donne l’EXPLAIN attendu."🧯 Anti-patterns ➜ corrections
“Fais tout” → Plan 3–5 étapes + OK étape 1 seule
“Optimise” → Objectif mesurable + méthode de mesure
“Écris du code” → Format bloc par fichier + bornes + tests