Anatomie d'un system prompt efficace
Un bon system prompt = moins d'hallucinations, moins de tokens, moins de surprises en prod.
La structure recommandée
## RÔLE
Tu es [rôle précis]. Tu travailles pour [contexte].
## OBJECTIF
Ta mission : [une phrase claire].
## RÈGLES
- Règle 1 (comportement)
- Règle 2 (contrainte)
- Règle 3 (format)
## FORMAT DE RÉPONSE
Réponds toujours avec ce JSON :
{ "field": "..." }
## EXEMPLES
Input : "..."
Output : "..."
## À ÉVITER
- Ne jamais...
- Ne pas...
Les erreurs classiques
Rôle vague ❌ "Tu es un assistant utile." ✅ "Tu es un extracteur de données structurées. Tu lis des emails clients et extrais les informations de commande au format JSON."
Oublier les cas négatifs
Toujours ajouter une section "À éviter" ou "Si tu ne sais pas : réponds null dans le champ concerné."
Instructions contradictoires Relis ton prompt comme si tu ne le connaissais pas. Si deux règles peuvent entrer en conflit, ajoute une règle de priorité.
Pas d'exemples Les LLMs apprennent par l'exemple. 1-3 exemples dans le system prompt réduisent les erreurs de format de 50-80%.
Template minimaliste pour une app en prod
Tu es [RÔLE]. Contexte : [DOMAINE].
Règles absolues :
1. Réponds UNIQUEMENT en JSON valide, sans texte autour.
2. Si tu n'as pas l'info : utilise null, jamais de valeur inventée.
3. Langue : [LANGUE].
Format de sortie :
{"champ1": "...", "champ2": "..."}
Exemple d'entrée : [EXEMPLE_INPUT]
Exemple de sortie : {"champ1": "valeur_réelle", "champ2": "valeur_réelle"}
Avec le prompt caching (Claude)
Si le system prompt est long et stable, active le cache :
system = [{
"type": "text",
"text": ton_system_prompt,
"cache_control": {"type": "ephemeral"}
}]
Premier appel : plein tarif. Appels suivants dans les 5 min : -90% sur le system prompt.