Aller au contenu principal

Prompts système, de rôle et contextuels

Définition

Les prompts système, les prompts de rôle et les prompts contextuels sont trois types d'entrées structurées complémentaires qui guident le comportement du LLM avant que l'utilisateur ne pose une question. Ensemble, ils forment la "mise en scène" d'une interaction LLM, établissant la personnalité, les règles et les connaissances fondamentales du modèle.

Le prompt système est un message passé dans un champ spécial (le rôle system dans les API OpenAI et Anthropic) qui précède la conversation. Il définit des règles persistantes, des contraintes, des limites de sécurité ou des instructions de tâche qui s'appliquent à toute la conversation. Contrairement aux messages utilisateur, le prompt système est généralement invisible pour l'utilisateur final et ne peut pas être facilement remplacé par des instructions de conversation.

Le prompting de rôle est le sous-ensemble du prompting système qui demande au modèle d'adopter un persona spécifique — "Tu es un ingénieur DevOps expert spécialisé en Kubernetes" ou "Tu es un professeur de mathématiques du lycée patient." Assigner un rôle aligne les connaissances, le style de communication et les valeurs implicites du modèle sur la tâche cible, souvent améliorant la précision et la cohérence du ton.

Le prompting contextuel injecte des informations de base pertinentes — extraits de documents, contenu de base de connaissances, historique de conversation, résultats d'appels d'API — directement dans le prompt. C'est la colonne vertébrale de la génération augmentée par récupération (RAG) et des systèmes d'agents : le modèle ne sait que ce que vous lui dites dans le contexte plus ses connaissances de préentraînement.

Comment ça fonctionne

Prompts système

Un prompt système efficace contient généralement :

  • Persona ou rôle : qui est le modèle
  • Tâche ou domaine : ce que le modèle fait
  • Règles de comportement : ce que le modèle devrait et ne devrait pas faire
  • Instructions de format de sortie : comment le modèle devrait formater les réponses
  • Limites : ce que le modèle refuse ou redirige

Les prompts système sont persistants sur la conversation — ils définissent le comportement par défaut pour chaque tour. Gardez-les concis mais complets ; des prompts système trop longs peuvent diluer l'attention sur les messages utilisateur critiques.

Prompting de rôle

La recherche montre que les attributions de rôle affectent les sorties LLM de manière mesurable. "Tu es un expert en cybersécurité" avant de poser une question de sécurité produit des réponses différentes (souvent plus précises et nuancées) que de demander sans contexte de rôle. L'effet est plus fort pour les sujets à forte expertise où le modèle a des connaissances de domaine différenciées. Pour les tâches créatives, les attributions de rôle aident à maintenir la cohérence du ton sur de longs contenus.

Injection de contexte

L'injection de contexte est la technique de fournir des faits, des documents ou des données au modèle dans le prompt, complétant ses connaissances de préentraînement. Pour les RAG, cela signifie récupérer des passages pertinents et les inclure comme contexte avant la question. Pour les agents, cela signifie inclure les résultats d'appels d'outils précédents ou l'état de la session. Les pratiques clés : prioriser le contexte récent et le plus pertinent, tronquer les documents longs, et instruire explicitement le modèle sur la façon d'utiliser le contexte ("Réponds uniquement en utilisant les informations fournies").

Quand utiliser / Quand NE PAS utiliser

ScénarioApproche recommandéeÉviter
Chatbot d'assistance client de productionPrompt système détaillé avec restrictions + personaAucun prompt système — le comportement est imprévisible et non guidé
Tuteur éducatifRôle de persona enseignant + niveau de l'apprenant dans le prompt systèmeIgnorer l'audience cible — le style de communication sera mal adapté
QR basée sur des documentsInjecter les passages de document récupérés comme contexteDemander des faits du document sans les fournir — hallucinations garanties
Analyse de code ou révisionPrompt système avec le langage et les standards pertinentsPrompt système générique — perd les conventions spécifiques au domaine
Prototypage rapide / explorationPrompt système minimalPrompt système excessivement ingéniéré — ralentit l'itération

Exemples de code

Prompts système et de rôle avec OpenAI

# System and role prompting with OpenAI
# pip install openai

import os
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

# --- Role + Behavioral system prompt ---
SYSTEM_DEVOPS = """You are a senior DevOps engineer with 10 years of experience
in Kubernetes, Terraform, and CI/CD pipelines.

Rules:
- Provide concrete, production-ready answers
- Always mention security considerations where relevant
- Format code examples with appropriate language tags
- If a question is ambiguous, ask one clarifying question before answering
- Never suggest deprecated tools or practices"""


def ask_devops(question: str) -> str:
resp = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": SYSTEM_DEVOPS},
{"role": "user", "content": question},
],
temperature=0.2,
max_tokens=600,
)
return resp.choices[0].message.content.strip()


# --- Contextual prompting: inject retrieved document ---
SYSTEM_QA = (
"You are a helpful assistant. Answer questions using ONLY the provided context. "
"If the answer is not in the context, say 'I don't have that information.'"
)


def answer_from_context(context: str, question: str) -> str:
user_message = f"Context:\n{context}\n\nQuestion: {question}"
resp = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": SYSTEM_QA},
{"role": "user", "content": user_message},
],
temperature=0,
max_tokens=300,
)
return resp.choices[0].message.content.strip()


if __name__ == "__main__":
# Role prompting
answer = ask_devops("What's the safest way to store Kubernetes secrets?")
print("DevOps answer:", answer[:200], "...")

# Contextual prompting
doc = (
"Our company's data retention policy states that customer PII must be "
"deleted within 90 days of account closure. Backups are retained for 30 days. "
"Logs are kept for 12 months for compliance purposes."
)
qa_answer = answer_from_context(doc, "How long are customer logs retained?")
print("\nDoc-grounded answer:", qa_answer)

Prompts système et contextuels avec Anthropic

# System and contextual prompting with Anthropic
# pip install anthropic

import os
import anthropic

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

SYSTEM_TUTOR = """You are a patient and encouraging mathematics tutor for high school students.

Guidelines:
- Always explain the underlying concept before solving
- Use simple language, avoid jargon unless you define it
- Show all steps clearly, numbered
- End every explanation with a check-for-understanding question
- If the student seems confused, offer an analogy or real-world example"""

SYSTEM_ANALYST = (
"You are a data analyst. Analyze the provided data and give concise, "
"actionable insights. Format your response as: "
"1) Key Finding, 2) Supporting Evidence, 3) Recommended Action."
)


def tutor_explain(problem: str) -> str:
resp = client.messages.create(
model="claude-opus-4-5",
max_tokens=600,
system=SYSTEM_TUTOR,
messages=[{"role": "user", "content": problem}],
temperature=0.4,
)
return resp.content[0].text.strip()


def analyze_data(data_summary: str, question: str) -> str:
resp = client.messages.create(
model="claude-opus-4-5",
max_tokens=400,
system=SYSTEM_ANALYST,
messages=[
{
"role": "user",
"content": f"Data summary:\n{data_summary}\n\nAnalysis question: {question}",
}
],
temperature=0,
)
return resp.content[0].text.strip()


if __name__ == "__main__":
explanation = tutor_explain("How do I solve a quadratic equation using the quadratic formula?")
print("Tutor explanation:\n", explanation[:300], "...\n")

data = (
"Q1 revenue: $1.2M (target $1.0M). Q2 revenue: $0.9M (target $1.1M). "
"Top product: Widget A (40% of revenue). Churn rate increased from 5% to 8%."
)
analysis = analyze_data(data, "What should leadership focus on next quarter?")
print("Analysis:\n", analysis)

Ressources pratiques

Voir aussi