08 Prompt engineering

Contexte, source de vérité et ambiguïté

8.4 Fournir du contexte utile 📚

Définition

Le context crafting consiste à fournir à Copilot le bon contexte pour améliorer la qualité de sa réponse.

D’où Copilot tire son contexte est expliqué en 7.1 ; ici, tu décides quoi fournir et quoi omettre. GitHub recommande de supprimer les requêtes qui ne sont plus utiles dans une conversation Copilot Chat. (docs.github.com)

Contexte utile typique

Tu peux fournir :

  • langage
  • framework
  • fichier concerné
  • fonction sélectionnée
  • erreur complète
  • stack trace nettoyée
  • tests existants
  • comportement attendu
  • comportement actuel
  • convention du projet
  • règle métier
  • dépendances autorisées
  • contraintes de sécurité

Exemple sans contexte ❌

Texte
Why is this broken?

Copilot ne sait pas :

  • ce qui est cassé ;
  • quel est le comportement attendu ;
  • quelle erreur apparaît ;
  • quels fichiers sont concernés ;
  • ce qui a changé récemment.

Exemple avec contexte ✅

Texte
This Jest test fails after the recent change to UserService.

Expected behavior:
- deactivated users should not receive password reset emails.

Actual behavior:
- the service still sends a reset email.

Use:
- UserService.ts
- PasswordResetService.ts
- user.service.test.ts

Find the root cause and propose the minimal fix.
Do not change the public API.

Exemple avec stack trace

Mauvais prompt :

Texte
Fix this error.

Bon prompt :

Texte
Analyze this stack trace and the selected code.

Error:
TypeError: Cannot read properties of undefined (reading 'items')

Expected behavior:
If the order has no items, return an empty summary.

Constraints:
- Do not hide other data quality issues.
- Add a unit test for the missing items case.

Exemple avec conventions projet

Texte
Generate a new RefundService following the same structure as PaymentService.ts.

Use:
- the same logging pattern
- the same error handling style
- the same dependency injection approach
- Jest tests similar to payment.service.test.ts

Bon contexte ≠ beaucoup de contexte

Attention : donner trop de contexte peut aussi dégrader la réponse.

Mauvais :

Texte
Voici 18 fichiers, toute l’architecture, 3 anciennes versions, 2 logs non liés, et une vague demande.

Meilleur :

Texte
Voici le service, le test qui échoue, la stack trace, et le comportement attendu.

À retenir

Le bon contexte est pertinent, minimal et orienté tâche.

8.5 Référencer le bon fichier ou extrait de code 📁

Définition

Référencer le bon fichier signifie guider Copilot vers la bonne source de vérité.

Dans l’IDE, cela peut passer par :

  • ouvrir les fichiers pertinents ;
  • sélectionner le bon bloc ;
  • mentionner explicitement un fichier ;
  • utiliser les références disponibles selon l’environnement ;
  • fermer les fichiers non pertinents.

Exemple classique

Tu as trois fichiers :

Texte
PaymentService.ts
PaymentService.old.ts
PaymentService.experimental.ts

Prompt vague :

Texte
Follow the payment service style.

Risque :

Copilot peut utiliser le mauvais fichier comme inspiration.

Meilleur prompt

Texte
Use PaymentService.ts as the source of truth.
Ignore PaymentService.old.ts and PaymentService.experimental.ts.

Create RefundService.ts with the same dependency injection, logging, and error handling style.

Exemple avec sélection

Tu sélectionnes :

TypeScript
export function calculateRiskScore(user: User): number {
  let score = 0;

  if (user.failedLoginAttempts > 5) {
    score += 20;
  }

  if (user.hasNewDevice) {
    score += 15;
  }

  return score;
}

Bon prompt :

Texte
Review only the selected function.

Goal:
Improve readability and make scoring rules easier to extend.

Constraints:
- Do not change current scoring values.
- Do not add demographic or protected attributes.
- Keep return type as number.
- Suggest unit tests.

Exemple avec fichier de test

Texte
Generate tests for UserService.ts.
Follow the style and naming conventions in user.service.test.ts.
Do not create a new test framework setup.

Exemple avec README

Texte
Use the API behavior described in README.md.
Update the selected endpoint implementation to match the documented response format.

À retenir

Copilot répond mieux quand tu lui indiques explicitement la source de vérité.

8.11 Réduire l’ambiguïté 🧭

Définition

Réduire l’ambiguïté consiste à empêcher Copilot de deviner ce que tu veux dire.

Un prompt ambigu laisse trop de choix à Copilot.

Exemples de prompts ambigus

Texte
Fix this.
Improve this service.
Make it secure.
Optimize this.
Rewrite this module.

Problème :

Ces prompts ne disent pas :

  • quoi modifier ;
  • pourquoi le modifier ;
  • ce qu’il faut préserver ;
  • ce qu’il faut éviter ;
  • comment valider le résultat.

Exemples améliorés

Au lieu de :

Texte
Optimize this service.

Écris :

Texte
Optimize this service to reduce database calls.
Preserve the response format and public API.
Identify repeated queries.
Suggest caching only if it does not introduce stale data risks.
Add tests or explain what tests should be updated.

Au lieu de :

Texte
Make it secure.

Écris :

Texte
Review this Express route for authentication, authorization, input validation, SQL injection, sensitive logging, and unsafe error messages.
Return risks and recommended fixes.
Do not modify code yet.

À retenir pour le GH-300

  • Le bon contexte est pertinent, autorisé et lié à la tâche : plus de fichiers ne signifie pas automatiquement une meilleure réponse.
  • Une source de vérité explicite réduit l’ambiguïté ; un fichier obsolète ou sans rapport peut au contraire orienter Copilot dans la mauvaise direction.
  • Le contexte explique ce que Copilot peut utiliser, tandis que le prompt exprime la demande : ils se complètent sans imposer un modèle unique.