AI-promptteknik · Lektion

Tekniker för variabelsubstitution

f-strängar, .format() och mallbibliotek för rendering av prompts.

Lektion 3 av 413 steg

Tekniker för variabelsubstitution är en gratis lektion i AI-promptteknik på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för AI-promptteknik, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-promptteknik innehåller totalt 4 lektioner.

Fyra Python-metoder för mallrendering

Python erbjuder flera sätt att rendera promptmallar med variabelsubstitution. Alla har styrkor och kompromisser:

  • f-strings — direkt i raden, omedelbara, kräver inga importer
  • str.format() — namngivna platshållare, enkla att validera
  • string.Template — säker substitution med dollartecken, stöd för partiell ifyllnad
  • Jinja2 — fullständig mallmotor: villkor, loopar, filter, arv

Valet av metod beror på mallarnas komplexitet, teamets kunskaper och om ni behöver avancerade funktioner som villkor och loopar.

Metod 1: Python-f-strängar

F-strängar är det enklaste alternativet för promptmallar där alla variabler är tillgängliga vid renderingstillfället:

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
))

Metod 2: str.format()

str.format() fungerar bra när ni vill lagra mallsträngar separat från koden som fyller i dem – användbart när mallar läses in från filer:

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

Metod 3: string.Template

string.Template från Pythons standardbibliotek använder platshållare med dollartecken ($variable eller ${variable}). Den viktigaste fördelen är att safe_substitute() lämnar saknade variabler som bokstavlig platshållartext i stället för att kasta ett fel, vilket möjliggör partiell ifyllnad:

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

Grunderna i Jinja2

Jinja2 är en fullständig mallmotor. Den har stöd för villkor, loopar, filter och mallarv – långt utöver enkel strängsubstitution:

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

Jinja2-loopar i mallar

Med Jinja2-loopar kan ni iterera över listor i mallen – användbart för att generera prompter med flera objekt utifrån datastrukturer:

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)

Jinja2-filter

Jinja2-filter omvandlar variabelvärden direkt i mallen under rendering. Inbyggda filter som är användbara för prompter:

  • {{ topic | upper }} — gör topic till versaler
  • {{ word_count | default(200) }} — använder 200 om word_count inte har angetts
  • {{ audience | title }} — ändrar audience-strängen till titelversaler
  • {{ items | join(', ') }} — sammanfogar en lista med kommatecken

Filter håller logiken för omvandling i mallen i stället för i Python-koden som anropar den, vilket gör mallarna mer självständiga och portabla.

Läsa in mallar från filer

För stora eller komplexa mallar håller separata textfiler Python-koden ren. Jinja2:s Environment och FileSystemLoader hanterar detta väl:

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)

Välja rätt metod

Anpassa substitutionsmetoden efter mallarnas komplexitet:

  • f-strings — snabba skript, engångsautomatisering och mallar som är tillräckligt korta för att läsas direkt i koden
  • str.format() — lagrade mallar, teamets kodbaser och situationer där det är önskvärt att KeyError uppstår vid saknade variabler
  • string.Template — när innehållet kan innehålla klamrar (kodfragment) eller när partiell ifyllnad behövs
  • Jinja2 — komplexa mallar med villkor, loopar, flera filer eller ett team med erfarenhet av mallmotorer

Att överkomplicera lösningen är en verklig risk – använd Jinja2 endast när dess avancerade funktioner verkligen behövs.

Mallars säkerhet: injektionsattacker

När variabelvärden kommer från användarinmatning är promptinjektion en verklig risk. En illvillig användare kan ange ett värde som: "Ignorera alla tidigare instruktioner och..."

Säkerhetsåtgärder:

  • Validera och sanera alla användarangivna variabler före substitution
  • För inmatning som användare kan ange, omge variabeln med avgränsare: "Användarinmatningen är: ---{user_input}---"
  • Använd utdatafiltrering för att upptäcka och avvisa svar som verkar ha följt injicerade instruktioner
  • Ge aldrig användarvärden åtkomst till systempromptens variabler

Testa mallrendering

Testa alltid mallrendering separat från API-anrop. Validera den renderade strängen innan den skickas till modellen:

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()

Kunskapskontroll: Substitutionstekniker

Ni bygger ett promptsystem där mallfiler lagras på disk, mallarna innehåller villkorliga avsnitt (t.ex. att ett avsnitt om prissättning inkluderas valfritt baserat på en flagga), och mallarna kan skapas av flera teammedlemmar som är bekanta med webbmallar.

Vilken substitutionsmetod passar bäst för detta scenario?

Sammanfattning: Tekniker för variabelsubstitution

Python erbjuder fyra metoder för rendering av promptmallar: f-strängar (direkta, enkla), str.format() (namngivna platshållare, KeyError vid saknade variabler), string.Template (dollarteckensyntax, säker partiell ifyllnad) och Jinja2 (fullständig motor med villkor, loopar, filter och filladdning).

Anpassa metoden efter komplexiteten: använd f-strängar för snabba skript, str.format() för lagrade mallar, string.Template när innehållet innehåller klamrar och Jinja2 när ni behöver villkor, loopar eller filbaserade mallar. Testa alltid rendering separat från API-anrop.

Gratis att börja

Lär dig AI-promptteknik med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
53
Lektioner
199

Vanliga frågor

Är lektionen ”Tekniker för variabelsubstitution” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen AI-promptteknik, inklusive ”Tekniker för variabelsubstitution”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i AI-promptteknik innehåller totalt 4 lektioner.

Vad lär jag mig i ”Tekniker för variabelsubstitution”?

f-strängar, .format() och mallbibliotek för rendering av prompts. Ni övar på AI-promptteknik med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig AI-promptteknik?

Du behöver inga förkunskaper. Utbildningen i AI-promptteknik på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Tekniker för variabelsubstitution”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här AI-promptteknik-lektionen?

Ja. Varje AI-promptteknik-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Vad är en promptmall?
  2. Skapa mönster med luckor att fylla i
  3. Tekniker för variabelsubstitution
  4. Återanvända mallar för olika uppgifter
← Tillbaka till AI-promptteknik