Garder la main
Sommaire
02Chapitre 2·45 min·Fondamentaux

Prompt Engineering

L'anatomie d'un prompt qui tient en production

Anatomie d'un prompt qui marche, par modèle. Bibliothèque copiable par cas d'usage.

Ce que tu sauras faire
  • 01Structurer un prompt efficace : rôle, contexte, tâche, contraintes, format
  • 02Adapter le style de prompt selon le modèle (Claude, GPT, Gemini, Copilot)
  • 03Utiliser la technique du « Claude Interview »
  • 04Constituer une bibliothèque de prompts réutilisables

1. L'anatomie d'un prompt de qualité

Un prompt de développement performant tient sur cinq éléments. Sur une tâche complexe, les cinq comptent. En sauter un, c'est laisser l'IA combler le trou à ta place.

Framework R.C.T.C.F.

Prompt
[RÔLE] → Qui est l'IA dans ce contexte ? [CONTEXTE] → Quelle est la situation actuelle du code ? [TÂCHE] → Que doit-elle faire précisément ? [CONTRAINTES] → Quelles sont les limites (stack, perf, sécurité) ? [FORMAT] → Que dois-tu recevoir en sortie ?

Exemple — vague vs structuré

Prompt vague :

Prompt
Écris-moi une fonction pour valider les emails

Prompt structuré :

Prompt
[RÔLE] Tu es un senior backend engineer TypeScript. [CONTEXTE] Je travaille sur un service d'authentification NestJS (v10). On utilise class-validator pour la validation des DTOs. Voir le pattern existant dans @src/auth/dto/register.dto.ts [TÂCHE] Écris une fonction validateEmail(email: string): boolean qui respecte RFC 5322 et bloque les emails avec domaines jetables. [CONTRAINTES] - Aucune dépendance externe — regex pur TypeScript - Gérer les cas null/undefined gracieusement - Performance : < 1ms pour 1000 appels [FORMAT] - Fonction uniquement (pas de classe) - JSDoc complet - 3 exemples de test unitaire Jest inline en commentaire

Différence : le second prompt réduit à zéro les ambiguïtés. L'IA sait exactement ce qu'on attend, dans quel contexte, avec quelles contraintes.


2. Techniques avancées

2.1 La technique "Claude Interview"

Au lieu de tout spécifier toi-même, laisse l'IA identifier ce qui manque.

Prompt
Je veux implémenter [description brève]. Avant de commencer, interviewe-moi en détail. Pose des questions sur : l'implémentation technique, les edge cases, les tradeoffs, les contraintes non évidentes. Ne pose pas de questions triviales. Creuse les parties difficiles. Continue jusqu'à avoir tout ce qu'il faut, puis génère une spec dans SPEC.md.

Quand l'utiliser : pour les features nouvelles ou complexes où tu ne sais pas encore exactement ce que tu veux.

Résultat : une spec validée avant d'écrire une seule ligne de code. Commence ensuite une nouvelle session avec cette spec comme contexte.


2.2 L'injection documentaire Just-in-Time

Problème : le modèle ne connaît pas tes librairies internes ou les APIs trop récentes.

Solution : n'injecte pas toute la documentation, seulement les signatures d'interface pertinentes.

// À éviter
"Lis toute la doc de notre AuthService et implémente..."

// Bonne approche
"Voici l'interface de notre AuthService :
interface AuthService {
  login(credentials: LoginDto): Promise<TokenPair>;
  refresh(refreshToken: string): Promise<TokenPair>;
  logout(userId: string): Promise<void>;
}

Implémente maintenant le LoginController en utilisant STRICTEMENT  
ces méthodes. N'invente aucune méthode non listée ici."

2.3 La critique itérative (Reviewer Pattern)

Ne corrige pas manuellement le code généré par l'IA. Demande-lui de se relire elle-même.

Pourquoi. Si tu corriges à la main, l'IA ne voit jamais ce qui clochait : elle refera la même erreur au prompt suivant. En la forçant à se relire avec un rôle et des critères précis, toi tu comprends pourquoi son premier jet était mauvais — et tu peux mettre à jour ton prompt (ou ton fichier de contexte : CLAUDE.md / AGENTS.md / GEMINI.md) pour qu'elle ne retombe plus dedans.

Prompt
Agis maintenant en tant qu'Architecte Senior. Analyse le code que tu viens de produire selon ces critères : 1. Performance : y a-t-il des N+1, des allocations inutiles ? 2. Sécurité : injection, gestion des erreurs, exposition de données ? 3. SOLID : couplage fort ? responsabilité unique respectée ? 4. Maintenabilité : complexité cyclomatique, lisibilité ? Pour chaque problème trouvé, propose une version refactorisée.

Résultat : réduit la complexité cyclomatique et améliore la lisibilité sans effort humain supplémentaire.


2.4 Le Plan Mode (Explore sans écrire)

Avant toute implémentation sur du code existant :

Prompt
[MODE ANALYSE UNIQUEMENT — N'écris aucun code] Analyse le fichier OrderService.ts. Identifie : 1. Toutes les dépendances sortantes (injections, imports) 2. Les effets de bord si je modifie la méthode processOrder() 3. Les tests existants qui couvrent cette méthode 4. Les risques de régression Livre un rapport d'analyse structuré. Si l'analyse révèle une incompréhension, arrête et signale-le.

2.5 Ne sur-explique pas à un modèle de raisonnement

Vieux réflexe à désapprendre : ajouter « réfléchis étape par étape » à la fin de chaque prompt. Ça datait de l'époque où les modèles ne raisonnaient pas tout seuls. Aujourd'hui, un modèle de raisonnement (Claude en extended thinking, GPT en mode reasoning, Gemini Deep Think) le fait déjà, en interne. Lui redemander par-dessus ne l'aide pas : au mieux c'est neutre, souvent ça brouille sa propre logique et ça coûte des tokens pour rien.

La bonne façon de faire avec ces modèles :

  • Dis le quoi et le pourquoi, pas le comment. Donne l'objectif, les contraintes, le résultat attendu. Laisse-le trouver le chemin — c'est justement ce qu'il sait faire.
  • Évite les recettes trop détaillées (« d'abord fais ci, ensuite ça, puis vérifie… »). Sur un modèle de raisonnement, ça l'enferme au lieu de l'aider.
  • Garde les instructions pas-à-pas pour les modèles rapides (sans raisonnement), qui eux en profitent vraiment.

3. Différences par modèle

Claude (Anthropic)

Style optimal : contexte riche en amont, demandes de clarification bienvenues.

Spécificités :

  • Répond mieux aux instructions procédurales étape par étape
  • Très bon pour respecter les contraintes négatives ("ne fais pas X")
  • Le tag <context>...</context> améliore la séparation signal/bruit
  • Préfixe tes règles critiques avec IMPORTANT: ou YOU MUST:
<context>
  Stack: NestJS 10, TypeScript 5.3, PostgreSQL 15
  Pattern: Repository + Service + Controller
  Voir fichier existant : @src/users/users.service.ts
</context>

IMPORTANT: N'utilise pas de raw SQL. Utilise uniquement TypeORM QueryBuilder.

Tâche : Ajoute une méthode findByEmailOrUsername(query: string) au UserRepository.

Gemini (Google)

Style optimal : structure ta demande avec des sections claires, cite tes sources.

Spécificités :

  • Très bon pour les tâches qui nécessitent de montrer son raisonnement ("show your work")
  • Supporte les très longs context windows → bon pour analyser tout un module
  • Répond bien aux demandes de comparaison et de synthèse
Prompt
## Contexte [Colle le fichier complet] ## Tâche Analyse ce service et identifie les problèmes de performance. Montre ton raisonnement étape par étape. Pour chaque problème, cite la ligne concernée. ## Format attendu Tableau : Ligne | Problème | Sévérité | Fix recommandé

ChatGPT / GPT-5.x (OpenAI)

Style optimal : format d'abord, puis contenu.

Spécificités :

  • Très réactif aux exemples de format en début de prompt
  • Bon pour les tâches structurées avec des sorties prédictibles (JSON, tables)
  • Le system prompt a un impact fort sur le ton et la forme
Prompt
Réponds uniquement en JSON avec ce format : { "issue": "description", "severity": "high|medium|low", "fix": "code corrigé", "explanation": "pourquoi" } Analyse ce code TypeScript pour les problèmes de typage : [code]

4. Bibliothèque de prompts essentiels

Analyse & debug

Prompt
# ANALYSE DE CODE Analyse ce [fichier/fonction/module]. Identifie : dépendances sortantes, effets de bord, risques. [MODE LECTURE SEULE — pas de code] # DEBUG L'erreur suivante apparaît : [stack trace] Contexte : [ce que j'essayais de faire] Fix : identifie la cause racine. Ne supprime pas l'erreur — résous-la. Vérifie que le fix n'introduit pas de régression.

Génération de code

Prompt
# NOUVEAU ENDPOINT REST Stack : [NestJS/Express/Laravel/...] Contexte : [description du service existant] Pattern : voir @[fichier existant similaire] Endpoint : [méthode] [route] → [ce qu'il fait] Contraintes : [auth, validation, perf...] Format : Controller + DTO + Service method + test unitaire

Tests

Prompt
# GÉNÉRATION DE TESTS Agis en QA Engineer senior. Génère des tests [Jest/Vitest/JUnit] pour [fonction/service]. Couvre obligatoirement : - Happy path (cas nominal) - Edge cases (null, undefined, empty, boundary values) - Gestion d'erreurs (exceptions attendues) - Cas de sécurité si pertinent Utilise des données réalistes, pas des mocks triviaux.

Revue sécurité

Prompt
# AUDIT SÉCURITÉ Agis en expert sécurité applicative (OWASP Top 10). Analyse ce code pour : 1. Injection (SQL, XSS, command injection) 2. Mauvaise gestion d'authentification/autorisation 3. Secrets codés en dur ou exposés dans les logs 4. Validation des entrées manquante 5. Exposition de données sensibles Pour chaque problème : ligne, sévérité (Critical/High/Medium), fix.

Documentation

Prompt
# DOCUMENTATION AUTO Génère la documentation JSDoc/PHPDoc/JavaDoc pour [fonction/classe]. Inclus : description, @param avec types et descriptions, @returns, @throws, @example avec un cas concret. Style : clair, concis, orienté "pourquoi" pas "quoi".

Refactoring

Prompt
# REFACTORING Ce code fonctionne mais doit être amélioré. Objectifs : [lisibilité / performance / réduction complexité / SOLID] Contraintes : ne pas changer l'interface publique, garder les tests verts. Approche : propose d'abord le plan de refactoring. Attends ma validation avant d'écrire le code.

5. Les anti-patterns de prompt

Anti-patternExemplePourquoi c'est mauvaisFix
Trop vague"améliore ce code"L'IA improvise selon ses propres critèresSpécifier les critères d'amélioration
Trop autoritaire"sois clean et SOLID"Vague, interprétation variableDonner des exemples concrets
Contexte absent"répare le bug"L'IA ne sait pas ce qui est casséColler le stack trace + contexte
Correction en boucleCorriger 3× sans changer de promptLe contexte se pollue, qualité baisse/clear + nouveau prompt enrichi
Demande trop large"réécris tout le module"Résultat imprévisible, non reviewableDécouper en étapes atomiques