Un prompt copié dans une chaîne de caractères devient vite difficile à maintenir. Un template sépare les instructions stables des données variables et conserve les rôles des messages. Avec LangChain, ChatPromptTemplate produit la liste de messages attendue par un chat model.
Construire un template minimal
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "Tu es un rédacteur technique. Réponds en français."),
("human", "Explique {sujet} à un public {niveau}."),
])
messages = prompt.invoke({
"sujet": "les embeddings",
"niveau": "débutant",
})Les noms entre accolades forment le contrat d’entrée. Un nom explicite comme niveau ou contraintes est plus facile à tester qu’une variable générique comme data.
Séparer instructions et contenu utilisateur
Le message système décrit le comportement durable : rôle, langue, politique de réponse et contraintes générales. Le message humain transporte la demande et les données propres à l’appel. Cette séparation améliore la lisibilité, mais ne constitue pas à elle seule une protection contre l’injection de prompt : les données externes doivent rester identifiées comme telles et les actions sensibles doivent être contrôlées dans le code.
Composer le prompt avec un modèle
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
model = ChatOpenAI(model="gpt-5-mini", temperature=0)
chain = prompt | model | StrOutputParser()
texte = chain.invoke({"sujet": "les embeddings", "niveau": "débutant"})Le template reste indépendant du fournisseur. Le modèle et le traitement de sortie peuvent évoluer sans dupliquer les instructions.
Rendre le prompt testable
Vérifiez les variables requises, le rôle de chaque message et le format produit. Ajoutez des cas représentatifs dans un jeu de données : entrée normale, contenu vide, texte long, caractères spéciaux et tentative d’injection. Les tests ne doivent pas seulement comparer une phrase exacte ; ils peuvent vérifier la présence d’éléments attendus et l’absence de données interdites.
Éviter trois erreurs courantes
Première erreur : injecter directement un document non fiable dans le message système. Deuxième erreur : demander un format JSON uniquement en langage naturel alors qu’une sortie structurée est disponible. Troisième erreur : multiplier les règles contradictoires dans un seul bloc. Préférez des contraintes courtes, hiérarchisées et contrôlées par des tests.
À retenir
- Choisissez la primitive la plus simple adaptée au besoin.
- Validez les sorties avant de les transmettre à un système métier.
- Ajoutez des traces et des tests dès le prototype.
Questions fréquentes
Peut-on réutiliser un même template avec plusieurs modèles ?
Oui, si les modèles acceptent le même format de messages. Les capacités particulières, comme les outils ou le multimodal, peuvent toutefois nécessiter des adaptations.
Un template garantit-il une réponse conforme ?
Non. Il structure l’entrée. Pour une sortie exploitable par du code, utilisez un schéma, une validation et une stratégie de reprise sur erreur.