Prompt Engineering

L'art des prompts système : Concevoir un comportement IA cohérent

Lors du développement d'applications basées sur les grands modèles de langage (LLM), la différence entre un prototype et un système prêt pour la production réside souvent dans un élément spécifique : le prompt système. Contrairement aux prompts utilisateur, qui sont transitoires et contextuels, les prompts système servent de cadre constitutionnel pour le comportement de l'IA. Ils définissent la persona, les contraintes et les limites opérationnelles qui garantissent la cohérence à travers des milliers d'interactions.

Pour les développeurs intermédiaires à avancés, il est crucial d'aller au-delà des simples instructions « Agis en tant que X ». Un prompt système robuste doit gérer les cas limites, imposer des formats de sortie stricts et atténuer les hallucinations. Cet article explore les composants architecturaux des prompts système efficaces et fournit des modèles pratiques pour leur implémentation.

Définir l'identité et le périmètre

La première étape consiste à établir une identité claire. Cependant, il ne s'agit pas seulement de jeu de rôle ; il s'agit de délimiter les limites de connaissances et de comportement du modèle. Vous devez explicitement indiquer ce que le modèle est et, tout aussi important, ce qu'il n'est pas.

Considérez un bot de support. Sans une définition stricte du périmètre, le modèle peut dériver vers des conseils généraux ou même des recommandations financières, ce qui peut présenter des risques juridiques. En définissant des contraintes négatives, vous réduisez la surface d'erreur.


SYSTEM_PROMPT = """
Vous êtes un agent de support technique expert pour le SDK Python d'Acme Corp.

## Identité
- Ton : Professionnel, empathique et concis.
- Rôle : Dépannage des problèmes de code et explication de l'utilisation de l'API.

## Contraintes
- Vous ne devez discuter QUE du SDK Python d'Acme Corp.
- Si un utilisateur pose des questions sur d'autres langages ou bibliothèques, refusez poliment et suggérez de consulter la documentation officielle.
- N'inventez jamais de codes d'erreur ou de points de terminaison d'API. Si vous ne connaissez pas la réponse, indiquez-le clairement et transférez à un agent humain.
"""

Structurer pour la prévisibilité

Les LLM sont sensibles à la structure. L'utilisation d'en-têtes markdown, de listes à puces et de délimiteurs clairs au sein du prompt système aide le modèle à analyser les instructions plus efficacement. Cela est particulièrement important lorsque des formats de sortie spécifiques, tels que le JSON, sont requis.

Si votre application repose sur l'analyse de données structurées, le prompt système doit explicitement définir le schéma. L'ambiguïté à ce niveau entraîne des erreurs d'analyse dans votre backend. Incluez toujours un exemple « few-shot » dans le prompt système si le format de sortie est complexe.


SYSTEM_PROMPT = """
Analysez l'entrée de journal de l'utilisateur et classez le problème.

## Format de sortie
Retournez UNIQUEMENT du JSON valide avec le schéma suivant :
{
  "severity": "low" | "medium" | "high",
  "category": "auth" | "database" | "network" | "unknown",
  "summary": "Un résumé bref en une phrase du problème"
}

## Exemples
Entrée : "Échec de la connexion à la base de données sur le port 5432"
Sortie : {"severity": "high", "category": "database", "summary": "Délai d'attente de connexion au port de la base de données."}

Entrée : "Tentative de connexion de l'utilisateur 1234 refusée"
Sortie : {"severity": "medium", "category": "auth", "summary": "Échec d'authentification pour l'utilisateur 1234."}
"""

Contexte dynamique et chaînage

Les prompts système statiques sont puissants, mais les prompts dynamiques sont plus flexibles. Dans les applications complexes, vous pouvez injecter des variables dynamiques dans le prompt système à l'aide de moteurs de modèles (comme Jinja2 en Python). Cela vous permet d'ajuster le comportement du modèle en fonction des niveaux d'utilisateurs, de l'heure actuelle ou du contexte récupéré (RAG).


from string import Template

template_str = """
Vous êtes un assistant pour $user_role.
Date actuelle : $current_date
Contexte : $retrieved_documents

Répondez à la requête de l'utilisateur en utilisant le contexte fourni. Si le contexte ne contient pas la réponse, dites "Je ne sais pas."
"""

def build_system_prompt(user_role, current_date, retrieved_docs):
    template = Template(template_str)
    return template.safe_substitute(
        user_role=user_role,
        current_date=current_date,
        retrieved_documents=retrieved_docs
    )

Conclusion

Les prompts système sont la colonne vertébrale des applications LLM fiables. Ce ne sont pas simplement du texte ; ce sont du code qui façonne le chemin de raisonnement du modèle. En définissant rigoureusement l'identité, en utilisant des formats structurés et en exploitant les modèles dynamiques, les développeurs peuvent considérablement réduire les hallucinations et améliorer l'expérience utilisateur. Lorsque vous développerez votre prochaine fonctionnalité IA, traitez votre prompt système avec la même rigueur que vos contrats d'API : clairement, spécifiquement et itérativement.

Share: