Prompt Engineering yang Sistematis
Anatomi prompt, merancang System Prompt yang efektif, empat teknik prompting utama, dan metodologi iterasi prompt yang bisa diukur.
Prompt Engineering sering disalahpahami sebagai "seni menulis pertanyaan yang bagus". Kenyataannya ia adalah proses iterasi yang bisa diukur, ada metodologi yang bisa diulang, ada teknik yang hasilnya bisa diprediksi, dan ada cara menguji apakah perubahan prompt benar-benar membuat output lebih baik.
Bab ini membahas prompt engineering sebagai disiplin teknis, bukan intuisi.
11.1 Anatomi Prompt
Setiap interaksi dengan LLM terdiri dari beberapa komponen yang berbeda peran dan posisinya. Memahami anatomi ini adalah prasyarat untuk merancang prompt yang efektif.
Semua komponen ini dikirim ke LLM dalam satu request yang sama. LLM tidak memiliki "memori" tentang System Prompt dari request sebelumnya, setiap request dimulai dari nol, dan System Prompt harus disertakan setiap kali.
11.2 Merancang System Prompt yang Efektif
System Prompt adalah bagian yang paling menentukan perilaku model. Ia mendefinisikan siapa model, apa yang boleh dan tidak boleh dilakukan, dan bagaimana format outputnya. System Prompt yang buruk adalah penyebab paling umum dari AI yang berperilaku tidak sesuai ekspektasi.
Ada lima elemen yang sebaiknya ada dalam System Prompt yang dirancang untuk sistem produksi: peran, konteks, aturan utama, batasan eksplisit, dan format output.
Contoh Buruk
Terlalu singkat, tidak ada batasan, tidak ada instruksi format. Model akan berimprovisasi dan hasilnya tidak terprediksi.
Kamu adalah asisten AI yang membantu.
# Masalah dengan system prompt ini:
# 1. "Membantu" tidak mendefinisikan domain, model bisa menjawab
# pertanyaan apapun, termasuk yang di luar konteks bisnis.
# 2. Tidak ada instruksi tentang format output.
# 3. Tidak ada batasan tentang apa yang TIDAK boleh dijawab.
# 4. Tidak ada informasi konteks yang relevan.
# 5. Tidak ada instruksi bahasa.
Contoh Baik
Mendefinisikan peran, konteks, batasan, format output, dan penanganan kasus edge secara eksplisit.
## Peran
Kamu adalah asisten layanan pelanggan digital untuk ReWork Store,
sebuah toko perlengkapan produktivitas online.
## Konteks yang Tersedia
Kamu akan diberikan potongan informasi relevan dari basis pengetahuan
toko (ditandai dengan tag [KONTEKS]). Gunakan HANYA informasi tersebut
untuk menjawab pertanyaan pelanggan.
## Aturan Utama
1. Jawab HANYA pertanyaan yang berkaitan dengan produk, pesanan,
pengiriman, dan kebijakan ReWork Store.
2. Jika jawaban tidak ada di [KONTEKS], katakan:
"Maaf, saya belum memiliki informasi mengenai hal tersebut.
Silakan hubungi tim kami di support@email.id"
3. JANGAN mengarang informasi. JANGAN menjawab pertanyaan di luar
domain ReWork Store.
4. Selalu gunakan Bahasa Indonesia yang sopan dan profesional.
## Format Output
- Jawaban singkat dan langsung ke poin utama.
- Jika langkah-langkah perlu disebutkan, gunakan daftar bernomor.
- Maksimal 3 paragraf per jawaban.
Template Lengkap
Template yang bisa langsung disesuaikan untuk berbagai use case. Ganti bagian dalam kurung kurawal dengan informasi spesifik proyekmu.
## Peran
Kamu adalah [NAMA ASISTEN] untuk [NAMA PERUSAHAAN/PRODUK],
sebuah [DESKRIPSI SINGKAT BISNIS].
## Konteks yang Tersedia
[INSTRUKSI CARA MENGGUNAKAN KONTEKS YANG DIBERIKAN]
Contoh: Kamu akan diberikan potongan dokumen relevan dalam tag [KONTEKS].
Gunakan HANYA informasi tersebut untuk menjawab.
## Aturan Utama
1. [DOMAIN YANG BOLEH DIJAWAB]
2. [RESPONS UNTUK PERTANYAAN DI LUAR DOMAIN]:
Katakan: "[PESAN FALLBACK YANG SUDAH DITENTUKAN]"
3. JANGAN [BATASAN EKSPLISIT 1]
4. JANGAN [BATASAN EKSPLISIT 2]
5. Selalu gunakan [BAHASA DAN TONE YANG DIINGINKAN]
## Format Output
- [INSTRUKSI FORMAT SPESIFIK]
- [PANJANG JAWABAN YANG DIINGINKAN]
- [STRUKTUR KHUSUS JIKA ADA]
## Contoh Respons yang Baik (opsional, few-shot)
Pertanyaan: [CONTOH PERTANYAAN 1]
Jawaban: [CONTOH JAWABAN YANG DIINGINKAN 1]
Pertanyaan: [CONTOH PERTANYAAN 2]
Jawaban: [CONTOH JAWABAN YANG DIINGINKAN 2]
11.3 Teknik-Teknik Prompting
Empat teknik berikut adalah yang paling berdampak dalam praktik. Masing-masing dirancang untuk situasi yang berbeda, memahami kapan menggunakan masing-masing lebih penting dari sekadar menghafal definisinya.
Zero-shot, Instruksi Langsung Tanpa Contoh (Tugas Sederhana & Jelas)
Model mengerjakan tugas hanya berdasarkan instruksi, tanpa contoh input-output yang diberikan. Paling efisien dalam penggunaan token.
# PROMPT
Klasifikasikan sentimen dari ulasan berikut
sebagai POSITIF, NEGATIF, atau NETRAL.
Ulasan: "Produknya bagus tapi pengirimannya
lambat sekali, hampir 2 minggu."
Jawab hanya dengan satu kata.
# Output: NEGATIF
ketika tugas memiliki nuansa yang sulit dijelaskan dalam instruksi saja, atau ketika format output yang diinginkan sangat spesifik. Dalam kasus ini, gunakan few-shot.
Few-shot, Ajarkan Melalui Contoh (Format Output Spesifik / Tugas Bernuansa)
Model diberikan beberapa contoh pasangan input-output sebelum diminta mengerjakan tugas sebenarnya.
# Prompt dengan few-shot examples
Ekstrak nama produk dan harga dari teks ulasan.
Format: {"produk": "...", "harga": "..."}
Jika tidak ada harga, isi dengan null.
Contoh 1:
Teks: "Saya beli meja belajar seharga 450 ribu"
Output: {"produk": "meja belajar", "harga": "450000"}
Contoh 2:
Teks: "Kursinya nyaman banget, recommended!"
Output: {"produk": "kursi", "harga": null}
Sekarang ekstrak dari teks ini:
Teks: "Lampu meja LED cuma 85 ribu, murah banget"
Output:
# Output: {"produk": "lampu meja LED", "harga": "85000"}
Pilih contoh yang mencakup variasi kasus edge, bukan hanya kasus normal. Contoh yang terlalu serupa tidak membantu model menggeneralisasi.
Chain-of-Thought, Paksa Model Berpikir Bertahap (Reasoning Kompleks / Kalkulasi)
Mendorong model untuk menuliskan langkah-langkah berpikirnya sebelum memberikan jawaban akhir. Terbukti secara empiris meningkatkan akurasi pada tugas yang membutuhkan reasoning multi-langkah.
# Tanpa Chain-of-Thought
Jika harga produk Rp150.000 dan diskon 20%,
lalu ada biaya pengiriman Rp15.000,
berapa total yang harus dibayar?
-> Output: Rp135.000 (salah, lupa tambah ongkir)
# Dengan Chain-of-Thought
Jika harga produk Rp150.000 dan diskon 20%,
lalu ada biaya pengiriman Rp15.000,
berapa total yang harus dibayar?
Pikirkan langkah demi langkah:
-> Langkah 1: Hitung diskon = 150.000 x 20% = 30.000
Langkah 2: Harga setelah diskon = 150.000 - 30.000 = 120.000
Langkah 3: Tambah ongkir = 120.000 + 15.000 = 135.000
Total: Rp135.000 (benar)
Cukup tambahkan frasa seperti "Pikirkan langkah demi langkah sebelum menjawab" atau "Jelaskan reasoning-mu sebelum memberikan jawaban akhir" di akhir prompt.
Structured Output, Paksa Format JSON (Integrasi Sistem Backend)
Memaksa model menghasilkan output dalam format yang bisa langsung di-parse oleh kode, biasanya JSON. Kritis untuk sistem RAG di mana output LLM perlu diproses lebih lanjut oleh backend.
# Prompt
Ekstrak informasi dari pertanyaan pengguna
dan kembalikan HANYA dalam format JSON ini,
tanpa teks tambahan apapun:
{
"intent": "cek_status_pesanan | info_produk | keluhan | lainnya",
"nomor_pesanan": "string atau null",
"produk_disebutkan": ["array string"],
"urgensi": "tinggi | sedang | rendah"
}
Pertanyaan pengguna:
"Pesanan saya nomor ORD-2024-789 sudah 3 hari belum sampai, ini darurat!"
# Output:
{
"intent": "cek_status_pesanan",
"nomor_pesanan": "ORD-2024-789",
"produk_disebutkan": [],
"urgensi": "tinggi"
}
Selalu wrap parsing JSON dalam try-catch. Meskipun diinstruksikan, model kadang masih menambahkan teks seperti "Berikut adalah output JSON:" sebelum JSON-nya. Bersihkan teks tersebut sebelum parsing.
11.4 Metodologi Iterasi Prompt
Ini adalah bagian yang paling sering dilewati dan paling membedakan antara prompt yang dibuat secara sistematis dengan prompt yang dibuat secara intuitif. Mengubah prompt tanpa metodologi yang jelas adalah seperti men-debug kode tanpa membaca pesan error: bisa beruntung, tapi tidak bisa diandalkan.
Metodologi ini terdengar sederhana tapi jarang diikuti secara disiplin. Tanpa test set yang konsisten, kamu tidak bisa tahu apakah perubahan prompt benar-benar memperbaiki output secara keseluruhan atau hanya memperbaiki satu kasus sambil merusak kasus lain.
11.5 Percakapan Multi-Turn
Sistem chatbot memerlukan pemahaman tentang bagaimana riwayat percakapan dikirim ke LLM. Tidak ada "memori" otomatis, setiap request harus menyertakan seluruh riwayat yang relevan secara eksplisit.
Implementasi percakapan multi-turn yang benar. Setiap request menyertakan seluruh riwayat percakapan, bukan hanya pesan terbaru. Riwayat ini yang memberi model "memori" tentang konteks sebelumnya.
import os
from dotenv import load_dotenv
import google.generativeai as genai
load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
# System prompt didefinisikan sekali
SYSTEM_PROMPT = \"\"\"
Kamu adalah asisten customer service ReWork Store.
Jawab hanya berdasarkan konteks yang diberikan.
Gunakan Bahasa Indonesia yang sopan.
\"\"\"
def chat_dengan_riwayat():
"""Chatbot dengan manajemen riwayat percakapan."""
model = genai.GenerativeModel(
model_name="gemini-1.5-flash",
system_instruction=SYSTEM_PROMPT
)
# Riwayat percakapan, dibangun secara inkremental
riwayat = []
print("Chatbot siap. Ketik 'keluar' untuk berhenti.\n")
while True:
pesan_user = input("Kamu: ").strip()
if pesan_user.lower() == "keluar":
break
# Tambahkan pesan user ke riwayat
riwayat.append({
"role": "user",
"parts": [pesan_user]
})
# Kirim SELURUH riwayat ke model, bukan hanya pesan terbaru
response = model.generate_content(riwayat)
jawaban = response.text
# Tambahkan jawaban model ke riwayat
riwayat.append({
"role": "model",
"parts": [jawaban]
})
print(f"\nAsisten: {jawaban}\n")
# Manajemen panjang riwayat:
# Jika terlalu panjang, potong pesan lama, pertahankan N pesan terakhir
MAX_RIWAYAT = 20 # 10 turn percakapan
if len(riwayat) > MAX_RIWAYAT:
riwayat = riwayat[-MAX_RIWAYAT:]
chat_dengan_riwayat()
Kesalahan Umum
Jika kamu mengubah instruksi peran, menambahkan contoh few-shot, dan menurunkan temperature sekaligus lalu hasilnya membaik, kamu tidak tahu mana yang berpengaruh. Ubah satu variabel per iterasi, jalankan seluruh test set, dan catat hasilnya. Ini membutuhkan lebih banyak iterasi tapi menghasilkan pemahaman yang bisa diandalkan.
Prompt yang bekerja baik untuk satu pertanyaan bisa gagal total untuk pertanyaan lain. Test set yang representatif harus mencakup pertanyaan normal, pertanyaan edge case, pertanyaan di luar domain, dan pertanyaan yang ambigu. Tanpa ini, kamu tidak bisa tahu seberapa robust prompt tersebut.
Ada titik di mana instruksi yang terlalu banyak mulai saling bertentangan atau membingungkan model. System Prompt yang efektif adalah yang paling singkat sambil tetap mencakup semua aturan yang benar-benar penting. Mulai dari yang minimal, tambahkan instruksi hanya ketika ada kasus yang benar-benar membutuhkannya.
Untuk System Prompt panjang atau prompt yang menyertakan dokumen RAG, gunakan tag XML untuk memberi batas yang jelas antar komponen: <konteks>, <pertanyaan>, <aturan>. Model (terutama Claude) sangat baik dalam mengikuti struktur XML. Ini mengurangi ambiguitas tentang mana instruksi dan mana data.
Sertakan pertanyaan yang jawabannya tidak ada dalam dokumen atau konteks yang diberikan. Model yang baik harus menjawab dengan pesan fallback yang sudah didefinisikan, bukan mengarang jawaban. Jika model mengarang, perkuat instruksi di System Prompt: "Jika informasi tidak ada dalam [KONTEKS], katakan: [PESAN FALLBACK]".
Ringkasan Bab 11
- Saya memahami tiga komponen utama prompt: System Prompt, User Message, dan Assistant Message serta peran masing-masing.
- Saya bisa merancang System Prompt yang efektif menggunakan lima elemen: peran, konteks, aturan utama, batasan eksplisit, dan format output.
- Saya tahu kapan menggunakan Zero-shot (tugas sederhana), Few-shot (format spesifik), Chain-of-Thought (reasoning kompleks), dan Structured Output (integrasi backend).
- Saya bisa membuat test set yang representatif dan menggunakannya sebagai dasar untuk mengiterasi prompt secara sistematis.
- Saya memahami aturan iterasi yang paling penting: ubah hanya satu hal per iterasi agar bisa mengetahui apa yang menyebabkan perubahan kualitas.
- Saya bisa mengimplementasikan percakapan multi-turn yang benar, menyertakan seluruh riwayat percakapan di setiap request, bukan hanya pesan terbaru.
- Saya tahu cara melakukan halucination test dan cara memperkuat System Prompt jika model mengarang jawaban di luar konteks yang diberikan.