Menguasai keterampilan paling sering dipakai AI engineer: menulis prompt yang konsisten. Dibahas system/user/assistant roles, teknik zero-shot dan few-shot, prinsip iterasi, hingga cara mengoptimasi prompt agar hemat token dan stabil di produksitype: text

Setelah di episode 3 kalian memanggil LLM API dengan benar, episode ini mengasah keterampilan yang menentukan kualitas produk AI: prompt engineering. Banyak yang menganggapnya "menulis kalimat", padahal di produksi prompt adalah kode — ia harus deterministik, bisa diuji, dan bisa diiterasi.
Mengapa episode ini penting? Karena prompt adalah antarmuka utama antara kalian dan model. Satu perbedaan kecil — penempatan instruksi, format contoh, atau kata yang ambigu — bisa mengubah kualitas jawaban secara drastis. Dan karena prompt dikirim berulang kali, prompt yang boros token adalah biaya yang membayar berulang kali.
Struktur messages di API memungkinkan kalian menempatkan konteks di lapisan yang tepat:
messages = [
{"role": "system", "content": "Kamu adalah analis keuangan. Jawab ringkas, "
"sertakan angka, dan sebutkan asumsi jika datanya kurang."},
{"role": "user", "content": "Analisis pertumbuhan pendapatan kuartal ini."},
]Prinsipnya: konteks yang tetap masuk system, permintaan yang berubah masuk user. Ini membuat prompt mudah dikelola dan diuji per komponen.
import json
from openai import OpenAI
client = OpenAI()
examples = [
{"user": "Beli kopi 25 ribu di kedai sebelah.",
"assistant": json.dumps({"jenis": "belanja", "nominal": 25000})},
{"user": "Gaji bulanan masuk 8 juta.",
"assistant": json.dumps({"jenis": "pemasukan", "nominal": 8000000})},
]
messages = [{"role": "system", "content": "Ekstrak transaksi ke JSON. "
"Hanya balas JSON, tanpa penjelasan."}]
for ex in examples:
messages.append({"role": "user", "content": ex["user"]})
messages.append({"role": "assistant", "content": ex["assistant"]})
messages.append({"role": "user", "content": "Transfer ke teman 150 ribu."})
r = client.chat.completions.create(model="gpt-4o-mini", messages=messages)
print(r.choices[0].message.content)Contoh di atas adalah pola yang sangat umum di produksi: ekstraksi terstruktur dengan few-shot. Di episode 5 kita ganti pendekatan ini dengan structured output yang lebih andal.
Empat prinsip yang berlaku di semua model:
System: Kamu adalah asisten pencarian. Tugasmu menjawab dari fakta yang
diberikan dalam <context> saja.
Aturan:
- Jika fakta tidak ada di context, jawab "Tidak diketahui".
- Maksimal 3 kalimat.
- Selalu sebutkan sumber dari context.Catatan: di series ini kita menghindari penanda yang ditulis dengan karakter kurung sudut — gunakan penanda yang aman seperti [context] dan [end] agar tidak bentrok dengan markup.
Prompt yang bagus tidak lahir sekali jadi. Alur iterasi yang benar:
def test_prompt(question: str) -> str:
messages = [{"role": "system", "content": PROMPT}, {"role": "user", "content": question}]
r = client.chat.completions.create(model="gpt-4o-mini", messages=messages, temperature=0)
return r.choices[0].message.content
cases = [
"Fakta yang tidak ada di context.",
"Apa isi context nomor satu?",
"Jawab dengan format salah, tolak.",
]
for c in cases:
print(f"Q: {c}\nA: {test_prompt(c)}\n")Tip
Gunakan temperature=0 saat menguji prompt — ini menghilangkan faktor acak sehingga perbedaan hasil benar-benar berasal dari perubahan prompt, bukan dari keacakan sampling.
Token adalah uang. Cara menghemat tanpa menurunkan kualitas:
Inti yang harus dibawa pulang:
temperature=0.Di episode 5 selanjutnya kita membahas langkah berikutnya yang membuat prompt jadi bisa dipakai mesin: structured output & tool use — JSON mode, function calling, dan membangun agent sederhana yang bisa memanggil tools. Sampai jumpa di episode 5!