Tekoälyn prompt engineering · Oppitunti

Muuttujien korvaustekniikat

f-merkkijonot, .format() ja mallikirjastot promptien muodostamiseen.

Oppitunti 3/413 vaihetta

Muuttujien korvaustekniikat on ilmainen Tekoälyn prompt engineering-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Tekoälyn prompt engineering-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Tekoälyn prompt engineering-kurssilla on yhteensä 4 oppituntia.

Neljä Python-tapaa mallineiden renderöintiin

Python tarjoaa useita tapoja renderöidä kehotemallineita ja korvata niiden muuttujia. Jokaisella tavalla on omat vahvuutensa ja kompromissinsa:

  • f-strings — rivinsisäinen ja välitön, ei vaadi tuonteja
  • str.format() — nimetyt paikanvaraajat, helppo tarkistaa
  • string.Template — turvallinen dollarimerkkikorvaaminen, tukee osittaista täyttämistä
  • Jinja2 — täysimittainen mallinnusmoottori: ehdot, silmukat, suodattimet ja periytyminen

Sopivan tavan valinta riippuu mallineiden monimutkaisuudesta, tiimin osaamisesta ja siitä, tarvitsetteko edistyneitä ominaisuuksia, kuten ehtoja ja silmukoita.

Tapa 1: Pythonin f-string-merkkijonot

F-string-merkkijonot ovat yksinkertaisin vaihtoehto kehotemallineille, kun kaikki muuttujat ovat käytettävissä renderöintihetkellä:

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

Tapa 2: str.format()

str.format() toimii hyvin, kun haluatte säilyttää mallineiden merkkijonot erillään niitä täyttävästä koodista — esimerkiksi ladatessanne mallineita tiedostoista:

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

Tapa 3: string.Template

Pythonin vakiokirjaston string.Template käyttää dollarimerkillä alkavia paikanvaraajia ($variable tai ${variable}). Sen tärkeä etu on, että safe_substitute() jättää puuttuvat muuttujat kirjaimelliseksi paikanvaraajatekstiksi virheen aiheuttamisen sijaan, joten täyttäminen voidaan tehdä osittain:

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

Tapa 4: Jinja2:n perusteet

Jinja2 on täysimittainen mallinnusmoottori. Se tukee ehtoja, silmukoita, suodattimia ja mallineiden periytymistä — siis paljon muutakin kuin yksinkertaista merkkijonojen korvaamista:

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:n silmukat mallineissa

Jinja2:n silmukoilla voitte käydä mallineessa läpi luetteloita — tämä on hyödyllistä, kun tietorakenteista luodaan useita kohteita sisältäviä kehotteita:

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:n suodattimet

Jinja2:n suodattimet muuntavat muuttujien arvoja rivinsisäisesti mallineen renderöinnin aikana. Kehotteissa hyödyllisiä sisäänrakennettuja suodattimia ovat:

  • {{ topic | upper }} — muuntaa aiheen isoiksi kirjaimiksi
  • {{ word_count | default(200) }} — käyttää arvoa 200, jos word_count-arvoa ei ole annettu
  • {{ audience | title }} — muuntaa audience-merkkijonon otsikkotyyliseksi
  • {{ items | join(', ') }} — yhdistää luettelon pilkuilla

Suodattimet pitävät muunnoslogiikan mallineessa sen sijaan, että se olisi mallinetta kutsuvassa Python-koodissa. Näin mallineista tulee itsenäisempiä ja siirrettävämpiä.

Mallineiden lataaminen tiedostoista

Suurten tai monimutkaisten mallineiden tallentaminen erillisiin tekstitiedostoihin pitää Python-koodin siistinä. Jinja2:n Environment ja FileSystemLoader soveltuvat tähän hyvin:

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)

Sopivan lähestymistavan valitseminen

Sovittakaa korvaustapa mallineiden monimutkaisuuteen:

  • f-strings — nopeat komentosarjat, kertaluonteinen automaatio ja mallineet, jotka ovat riittävän lyhyitä luettaviksi suoraan koodissa
  • str.format() — tallennetut mallineet ja tiimien koodikannat sekä tilanteet, joissa puuttuvista muuttujista ilmoittava KeyError on toivottava
  • string.Template — kun sisältö saattaa sisältää aaltosulkeita (koodikatkelmia) tai kun tarvitaan osittaista täyttämistä
  • Jinja2 — monimutkaiset mallineet, joissa on ehtoja, silmukoita tai useita tiedostoja, tai kun tiimillä on kokemusta mallinnuksesta

Ylimitoittaminen on todellinen riski — ottakaa Jinja2 käyttöön vain, kun todella tarvitsette sen edistyneitä ominaisuuksia.

Mallineiden turvallisuus: injektiohyökkäykset

Kun muuttujien arvot tulevat käyttäjän syötteestä, kehoteinjektio on todellinen riski. Haitallinen käyttäjä voi antaa esimerkiksi arvon: "Ohita kaikki aiemmat ohjeet ja..."

Varautukaa tähän seuraavilla toimilla:

  • Tarkistakaa ja puhdistakaa kaikki käyttäjän antamat muuttujat ennen korvaamista
  • Ympäröikää käyttäjille näkyvät syötteet erottimilla: "The user input is: ---{user_input}---"
  • Käyttäkää tulosten suodatusta sellaisten vastausten havaitsemiseen ja hylkäämiseen, jotka vaikuttavat noudattaneen injektoituja ohjeita
  • Älkää koskaan antako käyttäjän antamille arvoille pääsyä järjestelmäkehotteen muuttujiin

Mallineiden renderöinnin testaaminen

Testatkaa mallineiden renderöinti aina erillään API-kutsuista. Tarkistakaa renderöity merkkijono ennen sen lähettämistä mallille:

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

Oppimistesti: Korvaustekniikat

Rakennatte kehotekokonaisuutta, jossa mallinetiedostot tallennetaan levylle, mallineet sisältävät ehdollisia osioita (esimerkiksi hinnoitteluosio voidaan sisällyttää valinnan perusteella) ja mallineita voivat tuottaa useat web-mallinnukseen perehtyneet tiimin jäsenet.

Mikä korvaustapa sopii tähän tilanteeseen parhaiten?

Kertaus: Muuttujien korvaustekniikat

Python tarjoaa neljä tapaa renderöidä kehotemallineita: f-string-merkkijonot (rivinsisäiset ja yksinkertaiset), str.format() (nimetyt paikanvaraajat, puuttuvista muuttujista ilmoittava KeyError), string.Template (dollarimerkkisyntaksi ja turvallinen osittainen täyttö) sekä Jinja2 (täysimittainen moottori, jossa on ehdot, silmukat, suodattimet ja tiedostojen lataus).

Sovittakaa tapa monimutkaisuuteen: käyttäkää f-string-merkkijonoja nopeisiin komentosarjoihin, str.format()-menetelmää tallennettuihin mallineisiin, string.Templatea, kun sisältö sisältää aaltosulkeita, ja Jinja2:ta, kun tarvitsette ehtoja, silmukoita tai tiedostopohjaisia mallineita. Testatkaa renderöinti aina erillään API-kutsuista.

Aloita maksutta

Opi Tekoälyn prompt engineering tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
53
Oppitunnit
199

Usein kysytyt kysymykset

Onko oppitunti ”Muuttujien korvaustekniikat” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Tekoälyn prompt engineering-oppimispolun 3 oppituntia, myös oppitunnin “Muuttujien korvaustekniikat”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Tekoälyn prompt engineering-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Muuttujien korvaustekniikat”?

f-merkkijonot, .format() ja mallikirjastot promptien muodostamiseen. Harjoittelet Tekoälyn prompt engineering-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Tekoälyn prompt engineering-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Tekoälyn prompt engineering-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Muuttujien korvaustekniikat”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Tekoälyn prompt engineering-oppitunnilla?

Kyllä. Jokainen Tekoälyn prompt engineering-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Mikä on promptimalli
  2. Täydennystehtävämallien luominen
  3. Muuttujien korvaustekniikat
  4. Mallien uudelleenkäyttö eri tehtävissä
← Takaisin: Tekoälyn prompt engineering