Prompts système
Sur cette page
Quand vous construisez un assistant pour un usage précis, il vous faut un moyen de cadrer ses réponses : pas question qu’un support AWS recommande la concurrence ou se lance dans les recettes de cuisine. Le prompt système transforme un assistant généraliste en spécialiste qui suit vos consignes, conversation après conversation.
Pourquoi pas dans le message utilisateur
L’approche naïve consiste à glisser toutes les exigences dans le message de l’utilisateur : « parle des services AWS », « ne cite pas de concurrents ». Elle a vite ses limites. Il faudrait anticiper chaque question, la liste de consignes devient ingérable, et l’utilisateur voit vos instructions internes. Les consignes de l’application n’ont rien à faire dans le canal de l’utilisateur.
Donner un rôle
Le prompt système attribue un rôle à Claude. Au lieu d’énumérer des règles, vous lui dites d’agir comme un certain professionnel, et il répond comme cette personne le ferait. Un rôle contient implicitement beaucoup de règles : « spécialiste du support cloud AWS » implique de parler d’AWS, de ne pas vanter la concurrence, de rester professionnel et de décliner le hors-sujet, sans qu’aucune de ces règles soit écrite. Le rôle généralise là où une liste de règles ne couvre que le cas prévu.
Le paramètre system
Le prompt système passe par le paramètre system de converse, séparé des messages :
system_prompt = """Vous êtes un spécialiste du support cloud AWS.
Votre rôle est de répondre aux questions des utilisateurs sur l'hébergement cloud avec AWS."""
response = client.converse(
modelId=model_id,
messages=messages,
system=[{"text": system_prompt}],
)
Comme content, system attend une liste de blocs, ici un seul bloc de texte. Cette séparation a du sens : le prompt système n’appartient pas à la conversation, l’utilisateur ne le voit pas, et il s’applique à chaque tour.
Une fonction chat plus souple
Intégrons-le à la fonction de la leçon 5, avec un dictionnaire de paramètres construit par étapes :
def chat(messages, system=None):
params = {"modelId": model_id, "messages": messages}
if system:
params["system"] = [{"text": system}]
response = client.converse(**params)
content = response["output"]["message"]["content"]
return "".join(block["text"] for block in content if "text" in block)
L’appelant passe une simple chaîne et la fonction l’emballe au bon format. Sans prompt système, le paramètre est absent de la requête et Claude répond en généraliste. Ce dictionnaire construit par étapes accueillera chaque nouvelle option : séquences d’arrêt, sorties structurées, outils.
En pratique
Demandez « Comment héberger une base Postgres ? » sans prompt système : la réponse couvre plusieurs fournisseurs cloud et l’auto-hébergement. Avec le rôle de spécialiste AWS, elle se concentre sur les solutions d’AWS, comme RDS, Aurora ou une installation sur EC2, et ne cite aucun concurrent. Plus révélateur encore, demandez une recette de pain : Claude décline poliment en restant dans son rôle. Personne ne lui a interdit les recettes ; le rôle l’implique.
Détails techniques
- Le texte d’un bloc système ne peut pas être vide : au moins un caractère.
systemattend une liste de dictionnaires, chacun avec une clé"text".- Le prompt système est lu avant tous les messages de la conversation.
- Vous pouvez changer le prompt système d’une requête à l’autre, mais pas au milieu d’une même liste de messages.
Sur l’API Claude directe, certains modèles récents acceptent aussi des messages système au milieu de la conversation. Avec l’API Converse, les consignes système passent uniquement par le paramètre system ; d’après la documentation d’Anthropic, cette fonctionnalité n’existe sur Bedrock que par l’API InvokeModel, pour certains modèles.
À vous de jouer
Avant, après. Posez les trois questions de la leçon (Postgres, une recette de pain, puis une question de votre choix) sans prompt système, puis avec celui du spécialiste AWS. Comparez les réponses.
Votre propre rôle. Écrivez le prompt système d’un assistant pour votre métier, en trois phrases au plus. Testez-le sur une question dans son domaine et sur une question hors sujet : décline-t-il comme vous le souhaitez ?
Sources officielles : System prompts (Claude Academy) · API Converse (documentation AWS) · Claude on Amazon Bedrock (Opus 4.6 and earlier) et Mid-conversation system messages (documentation Claude)
Points clés à retenir
- Les consignes de l’application vont dans le prompt système, jamais dans les messages de l’utilisateur.
- Un rôle bien choisi implique beaucoup de règles sans les écrire et généralise aux cas imprévus.
- Format Converse :
system=[{"text": ...}], ajouté à la requête seulement s’il existe. - Le prompt système se change entre deux requêtes, pas au milieu d’une liste de messages.