Un Prompt Template transforme des variables en texte ou messages destinés au modèle. Son intérêt n’est pas d’ajouter une couche décorative, mais de rendre le contrat visible, réutilisable et testable. Les instructions stables, les données utilisateur et le contexte récupéré doivent rester distincts.
Choisir texte ou messages
Pour une complétion simple, un template textuel suffit. Pour un modèle de chat, utilisez des messages système, utilisateur et éventuellement exemples avec leurs rôles. Ne concaténez pas aveuglément une conversation complète dans une chaîne : le format des messages et la chat template du fournisseur influencent le comportement.
Déclarer les variables
Donnez des noms métier, validez les champs obligatoires et définissez clairement les valeurs facultatives. Un template ne remplace pas un schéma d’entrée. Échappez ou encapsulez les données non fiables et indiquez qu’un document est une source, pas une instruction. Ne placez jamais de secrets dans le prompt.
Versionner et évaluer
Conservez les templates avec le code ou dans un registre versionné. Pour chaque changement, lancez un dataset de cas normaux, ambigus, hostiles et longs. Mesurez qualité, format, tokens et latence. Modifiez un seul élément à la fois afin d’attribuer les régressions.
Composition
Un template peut être composé avec un modèle et un parser via les primitives Runnable. Gardez cependant les étapes lisibles et typées. Si le parcours comporte boucles, outils et état durable, un graphe ou workflow est plus adapté qu’un template toujours plus complexe.
FAQ
Un template protège-t-il contre l’injection ?
Non. Il aide à séparer les rôles, mais les permissions et validations doivent être appliquées dans le code.
Faut-il tout mettre dans le message système ?
Non. Conservez seulement les règles stables et placez contexte et demande dans des champs distincts.
Peut-on partager un template entre modèles ?
Oui comme point de départ, mais retestez format, outils et comportement pour chaque modèle.
Template de messages avec historique borné
~~~python from langchain_core.prompts import ( ChatPromptTemplate, MessagesPlaceholder, )
prompt = ChatPromptTemplate.from_messages([ ("system", "Réponds à partir du contexte fourni. Cite les sources."), MessagesPlaceholder("history", optional=True), ("human", "Contexte :\n{context}\n\nQuestion : {question}"), ])
messages = prompt.invoke({ "context": "[doc-12] Les jetons expirent après 30 minutes.", "question": "Quand dois-je renouveler le jeton ?", "history": [], }) ~~~
N’utilisez pas une interpolation pour fabriquer un rôle système à partir du texte utilisateur. Vérifiez que toutes les variables attendues sont présentes et bornez historique et contexte avant le rendu. Pour tester le template, inspectez les messages produits — rôles, ordre et contenu — plutôt qu’une simple chaîne finale. Versionnez les modifications importantes du prompt avec les résultats d’évaluation associés.