0Pricing
AI Prompt Engineering · Leçon

Techniques de substitution de variables

Découvrez les chaînes f, .format() et les bibliothèques de modèles pour générer des invites.

Techniques de substitution de variables est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.

Quatre approches Python du rendu des modèles

Python propose plusieurs façons de générer le rendu de modèles d'instructions avec substitution de variables. Chacune présente des avantages et des compromis :

  • chaînes f — intégrées, immédiates, sans import nécessaire
  • str.format() — espaces réservés nommés, validation facilitée
  • string.Template — substitution sûre avec le signe dollar, remplissage partiel pris en charge
  • Jinja2 — moteur complet de modèles : conditions, boucles, filtres et héritage

Le choix de l'approche dépend de la complexité du modèle, des compétences de l'équipe et de la nécessité d'utiliser des fonctionnalités avancées comme les conditions et les boucles.

Approche 1 : chaînes f de Python

Les chaînes f constituent l'approche la plus simple pour les modèles d'instructions lorsque toutes les variables sont disponibles au moment du rendu :

import openai

client = openai.OpenAI(api_key='sk-...')

def generate_linkedin_post(company, topic, tone, word_count):
    prompt = (
        f'Write a LinkedIn post for {company} about {topic}. '
        f'Tone: {tone}. '
        f'Length: {word_count} words. '
        'Professional but conversational. '
        'End with one question to engage readers. '
        'No hashtags. Active voice.'
    )

    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return response.choices[0].message.content

print(generate_linkedin_post(
    company='DataStream Analytics',
    topic='how AI is changing data pipelines',
    tone='enthusiastic but grounded',
    word_count=180
))

Approche 2 : str.format()

str.format() convient bien lorsque vous souhaitez stocker les chaînes de modèle séparément du code qui les complète, notamment pour charger des modèles depuis des fichiers :

import openai

client = openai.OpenAI(api_key='sk-...')

# Template stored as a module-level constant or loaded from a file
SUPPORT_REPLY_TEMPLATE = '''You are a customer support agent for {company_name}.

Respond to this customer message:
---
{customer_message}
---

Tone: {tone}.
Keep the response under {max_words} words.
Do not offer refunds unless the customer explicitly asks.
Always close by asking if there is anything else you can help with.'''

def generate_support_reply(company, message, tone='empathetic and helpful', max_words=150):
    prompt = SUPPORT_REPLY_TEMPLATE.format(
        company_name=company,
        customer_message=message,
        tone=tone,
        max_words=max_words
    )

    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return response.choices[0].message.content

Approche 3 : string.Template

string.Template, issu de la bibliothèque standard de Python, utilise des espaces réservés avec le signe dollar ($variable ou ${variable}). Son principal avantage : safe_substitute() laisse les variables manquantes sous forme de texte littéral au lieu de lever une erreur, ce qui permet un remplissage partiel :

from string import Template
import openai

client = openai.OpenAI(api_key='sk-...')

# $ placeholders — safe with code that contains curly braces
BASE_TEMPLATE = Template(
    'Write a $format_type for $audience about $topic. '
    'Tone: $tone. Length: $word_count words. '
    'Active voice. No jargon.'
)

def generate(format_type, audience, topic, tone='professional', word_count=200):
    prompt = BASE_TEMPLATE.substitute(
        format_type=format_type,
        audience=audience,
        topic=topic,
        tone=tone,
        word_count=word_count
    )

    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return response.choices[0].message.content

# Partial fill example — safe_substitute leaves $word_count as-is
partial = BASE_TEMPLATE.safe_substitute(
    format_type='blog post', audience='developers', topic='API design'
)
print(partial)  # $tone and $word_count remain as placeholders

Approche 4 : notions de base de Jinja2

Jinja2 est un moteur complet de modèles. Il prend en charge les conditions, les boucles, les filtres et l'héritage des modèles, bien au-delà de la simple substitution de chaînes :

from jinja2 import Template
import openai

client = openai.OpenAI(api_key='sk-...')

# Jinja2 uses {{ }} for variables and {% %} for logic
JINJA_PROMPT = Template('''
Write a {{content_type}} for {{audience}} about {{topic}}.
Tone: {{tone}}.
{% if include_examples %}
Include {{example_count}} concrete examples.
{% endif %}
{% if word_count %}
Length: {{word_count}} words.
{% else %}
Aim for 200-300 words.
{% endif %}
Active voice. No jargon.
''')

def generate(content_type, audience, topic, tone, include_examples=False, example_count=2, word_count=None):
    prompt = JINJA_PROMPT.render(
        content_type=content_type,
        audience=audience,
        topic=topic,
        tone=tone,
        include_examples=include_examples,
        example_count=example_count,
        word_count=word_count
    )

    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return response.choices[0].message.content

Boucles Jinja2 dans les modèles

Les boucles Jinja2 vous permettent de parcourir des listes dans votre modèle, ce qui est utile pour générer des instructions comportant plusieurs éléments à partir de structures de données :

from jinja2 import Template
import openai

client = openai.OpenAI(api_key='sk-...')

MULTI_PRODUCT_TEMPLATE = Template('''
Write a product comparison for {{audience}}.
Compare the following products:

{% for product in products %}
- {{product.name}}: {{product.description}}
{% endfor %}

Structure: one paragraph per product, then a 2-sentence recommendation.
Tone: {{tone}}. Active voice. No bullet points in paragraphs.
''')

products = [
    {'name': 'Asana', 'description': 'project management with timeline views'},
    {'name': 'Linear', 'description': 'developer-focused issue tracking'},
    {'name': 'Monday.com', 'description': 'visual work management for teams'}
]

prompt = MULTI_PRODUCT_TEMPLATE.render(
    audience='startup founders',
    products=products,
    tone='direct and practical'
)

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[{'role': 'user', 'content': prompt}]
)
print(response.choices[0].message.content)

Filtres Jinja2

Les filtres Jinja2 transforment les valeurs des variables directement lors du rendu du modèle. Voici des filtres intégrés utiles pour les instructions :

  • {{ topic | upper }} — mettre le sujet en majuscules
  • {{ word_count | default(200) }} — utiliser 200 si word_count n'est pas fourni
  • {{ audience | title }} — appliquer la casse de titre à la chaîne représentant l'audience
  • {{ items | join(', ') }} — réunir une liste en séparant ses éléments par des virgules

Les filtres maintiennent la logique de transformation dans le modèle plutôt que dans le code Python qui l'appelle, ce qui rend les modèles plus autonomes et portables.

Chargement de modèles depuis des fichiers

Pour les modèles volumineux ou complexes, les stocker dans des fichiers texte distincts permet de garder votre code Python propre. L'environnement de Jinja2 et FileSystemLoader s'en chargent efficacement :

from jinja2 import Environment, FileSystemLoader
import openai

client = openai.OpenAI(api_key='sk-...')

# Load all templates from the 'prompts/' directory
env = Environment(loader=FileSystemLoader('prompts/'))

def render_template(template_name, variables):
    '''Load and render a .j2 template file with the given variables.'''
    template = env.get_template(template_name)
    return template.render(**variables)

def generate_from_file(template_name, variables):
    prompt = render_template(template_name, variables)

    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return response.choices[0].message.content

# Usage: load prompts/blog_post.j2 and fill with variables
result = generate_from_file('blog_post.j2', {
    'topic': 'API rate limiting strategies',
    'audience': 'backend engineers',
    'tone': 'technical and direct',
    'word_count': 500
})
print(result)

Choisir la bonne approche

Adaptez l'approche de substitution à la complexité de vos modèles :

  • chaînes f — scripts rapides, automatisation ponctuelle, modèles assez courts pour être lus directement dans le code
  • str.format() — modèles stockés, bases de code d'équipe, lorsque KeyError en cas de variable manquante est souhaitable
  • string.Template — lorsque le contenu peut contenir des accolades, comme des extraits de code, ou lorsqu'un remplissage partiel est nécessaire
  • Jinja2 — modèles complexes avec conditions, boucles, plusieurs fichiers, ou équipe expérimentée en création de modèles

Le surdéveloppement constitue un véritable risque : ne recourez à Jinja2 que lorsque vous avez réellement besoin de ses fonctionnalités avancées.

Sécurité des modèles : attaques par injection

Lorsque les valeurs des variables proviennent d'une entrée utilisateur, l'injection d'instructions constitue un risque réel. Un utilisateur malveillant pourrait fournir une valeur telle que : "Ignorez toutes les instructions précédentes et..."

Mesures préventives :

  • Validez et nettoyez toutes les variables fournies par l'utilisateur avant la substitution
  • Pour les entrées destinées aux utilisateurs, entourez la variable de délimiteurs : "L'entrée utilisateur est : ---{user_input}---"
  • Utilisez un filtrage de la sortie pour détecter et rejeter les réponses qui semblent avoir suivi des instructions injectées
  • N'accordez jamais aux valeurs fournies par l'utilisateur l'accès aux variables de l'instruction système

Test des rendus de modèles

Testez toujours les rendus de modèles séparément des appels d'API. Validez la chaîne générée avant de l'envoyer au modèle :

def test_template_render():
    test_cases = [
        {'topic': 'cloud security', 'audience': 'CTOs', 'tone': 'formal', 'word_count': 300},
        {'topic': 'ML pipelines', 'audience': 'data scientists', 'tone': 'technical', 'word_count': 500},
        # Edge cases
        {'topic': '', 'audience': 'developers', 'tone': 'casual', 'word_count': 100},  # empty topic
        {'topic': 'AI' * 100, 'audience': 'all', 'tone': 'brief', 'word_count': 50},  # very long topic
    ]

    TEMPLATE = 'Write a {word_count}-word {tone} article about {topic} for {audience}. Active voice.'

    for i, case in enumerate(test_cases):
        try:
            rendered = TEMPLATE.format(**case)
            assert len(rendered) > 0, 'Empty render'
            print(f'Case {i+1} OK: {len(rendered)} chars')
        except (KeyError, AssertionError) as e:
            print(f'Case {i+1} FAILED: {e}')

test_template_render()

Vérification des connaissances : techniques de substitution

Vous concevez un système d'instructions dans lequel les fichiers de modèles sont stockés sur le disque, les modèles comportent des sections conditionnelles, par exemple pour inclure facultativement une section sur les tarifs selon un indicateur, et peuvent être proposés par plusieurs membres de l'équipe habitués à la création de modèles web.

Quelle approche de substitution convient le mieux à ce scénario ?

Récapitulatif : techniques de substitution de variables

Python propose quatre approches pour générer le rendu de modèles d'instructions : les chaînes f (intégrées et simples), str.format() (espaces réservés nommés, KeyError en cas de variable manquante), string.Template (syntaxe avec signe dollar, remplissage partiel sûr) et Jinja2 (moteur complet avec conditions, boucles, filtres et chargement de fichiers).

Adaptez l'approche à la complexité : utilisez les chaînes f pour les scripts rapides, str.format() pour les modèles stockés, string.Template lorsque le contenu contient des accolades et Jinja2 lorsque vous avez besoin de conditions, de boucles ou de modèles stockés dans des fichiers. Testez toujours les rendus séparément des appels d'API.

Questions Fréquemment Posées

La leçon « Techniques de substitution de variables » est-elle gratuite ?

Oui — le texte complet de « Techniques de substitution de variables » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Techniques de substitution de variables » ?

Découvrez les chaînes f, .format() et les bibliothèques de modèles pour générer des invites. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?

Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Techniques de substitution de variables » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?

Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Qu’est-ce qu’un modèle d’invite ?
  2. Créer des modèles à remplir
  3. Techniques de substitution de variables
  4. Réutiliser des modèles pour différentes tâches
← Retour à AI Prompt Engineering