Teknik Substitusi Variabel
Pelajari f-string, .format(), dan pustaka templat untuk merender perintah.
Teknik Substitusi Variabel adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Empat Pendekatan Python untuk Merender Templat
Python menyediakan beberapa cara untuk merender templat prompt dengan substitusi variabel. Masing-masing memiliki kelebihan dan kompromi:
- f-string — sebaris, langsung, tidak memerlukan impor
- str.format() — placeholder bernama, mudah divalidasi
- string.Template — substitusi tanda dolar yang aman, mendukung pengisian sebagian
- Jinja2 — mesin templating lengkap: kondisional, perulangan, filter, pewarisan
Pemilihan pendekatan yang tepat bergantung pada kompleksitas templat, keterampilan tim, dan apakah Anda memerlukan fitur lanjutan seperti kondisional dan perulangan.
Pendekatan 1: f-string Python
f-string merupakan pendekatan paling sederhana untuk templat prompt ketika semua variabel tersedia saat perenderan:
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
))Pendekatan 2: str.format()
str.format() bekerja dengan baik ketika Anda ingin menyimpan string templat secara terpisah dari kode yang mengisinya — berguna untuk memuat templat dari file:
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.contentPendekatan 3: string.Template
string.Template dari pustaka standar Python menggunakan placeholder bertanda dolar ($variable atau ${variable}). Keunggulan utamanya: safe_substitute() membiarkan variabel yang tidak tersedia sebagai teks placeholder literal alih-alih memunculkan kesalahan, sehingga pengisian sebagian dapat dilakukan:
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 placeholdersPendekatan 4: Dasar-Dasar Jinja2
Jinja2 adalah mesin templating lengkap. Jinja2 mendukung kondisional, perulangan, filter, dan pewarisan templat — jauh melampaui substitusi string sederhana:
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.contentPerulangan Jinja2 dalam Templat
Perulangan Jinja2 memungkinkan Anda melakukan iterasi pada daftar dalam templat — berguna untuk menghasilkan prompt dengan banyak item dari struktur data:
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)Filter Jinja2
Filter Jinja2 mengubah nilai variabel secara sebaris selama perenderan templat. Filter bawaan yang berguna untuk prompt:
{{ topic | upper }}— ubah topik menjadi huruf besar{{ word_count | default(200) }}— gunakan 200 jika word_count tidak diberikan{{ audience | title }}— ubah string audience ke kapitalisasi judul{{ items | join(', ') }}— gabungkan daftar dengan koma
Filter menjaga logika transformasi tetap berada di dalam templat, bukan di kode Python yang memanggilnya, sehingga templat menjadi lebih mandiri dan portabel.
Memuat Templat dari File
Untuk templat yang besar atau kompleks, menyimpannya dalam file teks terpisah membuat kode Python Anda tetap rapi. Environment dan FileSystemLoader Jinja2 menanganinya dengan baik:
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)Memilih Pendekatan yang Tepat
Sesuaikan pendekatan substitusi dengan kompleksitas templat Anda:
- f-string — skrip cepat, otomasi sekali pakai, templat yang cukup pendek untuk dibaca langsung
- str.format() — templat tersimpan, basis kode tim, ketika KeyError untuk variabel yang tidak tersedia diinginkan
- string.Template — ketika konten mungkin mengandung kurung kurawal (cuplikan kode), atau ketika pengisian sebagian diperlukan
- Jinja2 — templat kompleks dengan kondisional, perulangan, banyak file, atau tim yang berpengalaman menggunakan templating
Rekayasa berlebihan merupakan risiko nyata — gunakan Jinja2 hanya ketika Anda benar-benar membutuhkan fitur lanjutannya.
Keamanan Templat: Serangan Injeksi
Ketika nilai variabel berasal dari input pengguna, injeksi prompt merupakan risiko nyata. Pengguna jahat mungkin memberikan nilai seperti: "Ignore all previous instructions and..."
Langkah defensif:
- Validasikan dan bersihkan semua variabel yang diberikan pengguna sebelum substitusi
- Untuk input yang ditujukan kepada pengguna, apit variabel dengan pembatas: "The user input is: ---{user_input}---"
- Gunakan pemfilteran keluaran untuk mendeteksi dan menolak respons yang tampaknya mengikuti instruksi yang disisipkan
- Jangan pernah memberikan akses nilai dari pengguna ke variabel prompt sistem
Menguji Hasil Render Templat
Selalu uji hasil render templat secara terpisah dari panggilan API. Validasikan string hasil render sebelum mengirimkannya ke model:
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()Uji Pemahaman: Teknik Substitusi
Anda sedang membangun sistem prompt dengan file templat yang disimpan di disk, templat yang memiliki bagian kondisional (misalnya, menyertakan bagian tentang harga secara opsional berdasarkan sebuah penanda), dan templat yang mungkin dibuat oleh beberapa anggota tim yang memahami templating web.
Pendekatan substitusi mana yang paling sesuai untuk skenario ini?
Ringkasan: Teknik Substitusi Variabel
Python menyediakan empat pendekatan untuk perenderan templat prompt: f-string (sebaris, sederhana), str.format() (placeholder bernama, KeyError untuk variabel yang tidak tersedia), string.Template (sintaks tanda dolar, pengisian sebagian yang aman), dan Jinja2 (mesin lengkap dengan kondisional, perulangan, filter, dan pemuatan file).
Sesuaikan pendekatan dengan kompleksitasnya: gunakan f-string untuk skrip cepat, str.format() untuk templat tersimpan, string.Template ketika konten mengandung kurung kurawal, dan Jinja2 ketika Anda memerlukan kondisional, perulangan, atau templat berbasis file. Selalu uji hasil render secara terpisah dari panggilan API.
Belajar AI Prompt Engineering dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 53
- Pelajaran
- 199
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Teknik Substitusi Variabel” gratis?
Ya — teks lengkap “Teknik Substitusi Variabel” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Teknik Substitusi Variabel”?
Pelajari f-string, .format(), dan pustaka templat untuk merender perintah. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?
Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Teknik Substitusi Variabel” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?
Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Apa Itu Templat Perintah?
- Membuat Pola Isian
- Teknik Substitusi Variabel
- Menggunakan Ulang Templat untuk Berbagai Tugas