1. Pengenalan Prompt Engineering
Prompt Engineering adalah seni dan sains merancang input (prompt) untuk LLM agar menghasilkan output yang diinginkan. Teknik yang tepat bisa membuat perbedaan besar — dari jawaban yang biasa saja hingga jawaban yang sangat akurat dan terstruktur.
Prompt engineering bukan hanya tentang "menulis pertanyaan". Ini melibatkan struktur, konteks, instruksi, dan strategi yang membuat LLM berpikir lebih baik.
Kapan Menggunakan CoT?
| Tugas | Cocok CoT? | Alasan |
|---|---|---|
| Matematika & logika | ✅ Sangat cocok | Butuh reasoning bertahap |
| Code debugging | ✅ Sangat cocok | Analisis langkah demi langkah |
| Analisis kasus hukum | ✅ Cocok | Butuh argumen bertingkat |
| Klasifikasi sederhana | ❌ Tidak perlu | Terlalu overkill |
| Translation | ❌ Tidak perlu | Butuh fluency, bukan reasoning |
| Summarization | ⚠️ Kadang | Berguna untuk teks kompleks |
5. Self-Consistency
Self-Consistency adalah teknik yang menjalankan CoT beberapa kali (dengan temperature > 0), lalu memilih jawaban yang paling konsisten (mayoritas voting). Ini meningkatkan akurasi secara signifikan.
# =============================================
# Self-Consistency Prompting
# =============================================
from collections import Counter
def self_consistency(client, question, n_samples=5):
"""
Generate n_samples jawaban dengan CoT,
pilih jawaban yang paling konsisten (mayoritas).
"""
prompt = f"""{question}
Pikirkan langkah demi langkah, lalu berikan jawaban akhir
di baris terakhir dengan format: "Jawaban: [jawaban Anda]"
"""
answers = []
reasonings = []
for i in range(n_samples):
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=0.7, # Harus > 0 untuk variasi
)
text = response.choices[0].message.content
reasonings.append(text)
# Extract jawaban akhir
if "Jawaban:" in text:
answer = text.split("Jawaban:")[-1].strip()
answers.append(answer)
# Majority voting
answer_counts = Counter(answers)
most_common = answer_counts.most_common(1)[0]
return {
"final_answer": most_common[0],
"confidence": f"{most_common[1]}/{n_samples}",
"all_answers": answers,
"all_reasonings": reasonings
}
# Contoh penggunaan
result = self_consistency(
client,
"Sebuah lift kapasitas 500kg. Ada 3 orang (70kg, 80kg, 90kg) "
"dan 10 kardus masing-masing 25kg. Apakah semua bisa masuk?",
n_samples=5
)
print(f"Jawaban: {result['final_answer']}")
print(f"Confidence: {result['confidence']}")
# Jawaban: Tidak, total 600kg > 500kg
# Confidence: 5/5 ← sangat yakin!
6. Tree-of-Thought (ToT)
Tree-of-Thought memperluas CoT dengan memungkinkan LLM untuk menjelajahi beberapa jalur pemikiran, mengevaluasi setiap jalur, dan memilih yang terbaik. Mirip dengan algoritma beam search dalam berpikir.
# =============================================
# Tree-of-Thought (ToT) — Simplified
# =============================================
def tree_of_thought(client, problem, n_branches=3):
"""
Implementasi ToT sederhana:
1. Generate multiple jalur pemikiran
2. Evaluasi setiap jalur
3. Pilih yang terbaik
"""
# Step 1: Generate multiple approaches
branch_prompt = f"""Masalah: {problem}
Pikirkan {n_branches} pendekatan berbeda untuk menyelesaikan masalah ini.
Untuk setiap pendekatan:
1. Jelaskan strategi
2. Tunjukkan langkah penyelesaian
3. Berikan jawaban
Format output:
## Pendekatan 1: [nama strategi]
[langkah-langkah]
Jawaban: [jawaban]
## Pendekatan 2: [nama strategi]
..."""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Anda adalah problem solver ahli."},
{"role": "user", "content": branch_prompt}
],
temperature=0.8
)
approaches = response.choices[0].message.content
# Step 2: Evaluate & pick best
eval_prompt = f"""Berikut beberapa pendekatan untuk menyelesaikan masalah:
Masalah: {problem}
Pendekatan yang dihasilkan:
{approaches}
Evaluasi setiap pendekatan:
1. Apakah logikanya benar?
2. Apakah ada kesalahan perhitungan?
3. Apakah ada edge case yang terlewat?
Pilih pendekatan terbaik dan berikan jawaban final yang pasti."""
final_response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Anda adalah evaluator yang kritis dan teliti."},
{"role": "user", "content": eval_prompt}
],
temperature=0.2 # Rendah untuk jawaban final yang konsisten
)
return final_response.choices[0].message.content
# Contoh
result = tree_of_thought(
client,
"Ada 100 tahanan dan 100 kunci. Setiap tahanan bisa membuka kunci "
"secara acak. Berapa probabilitas minimal SATU tahanan menemukan "
"kuncinya sendiri?"
)
7. ReAct Pattern
ReAct (Reasoning + Acting) adalah pola yang menggabungkan berpikir dan bertindak. LLM tidak hanya berpikir, tetapi juga mengambil aksi (menggunakan tools), mengamati hasil, lalu berpikir lagi. Ini adalah fondasi dari AI Agents.
# =============================================
# ReAct Pattern dengan LangChain
# =============================================
from langchain_openai import ChatOpenAI
from langchain.agents import tool, AgentExecutor, create_react_agent
from langchain import hub
# Definisikan tools
@tool
def search_knowledge_base(query: str) -> str:
"""Mencari informasi dari knowledge base perusahaan."""
# Di production, ini akan query vector DB
knowledge = {
"refund": "Kebijakan refund: pengembalian dalam 7 hari, syarat kemasan utuh.",
"pengiriman": "Waktu pengiriman: 2-3 hari Jawa, 5-7 hari luar Jawa.",
"garansi": "Garansi produk 1 tahun, claim via email support@beebane.com"
}
for key, value in knowledge.items():
if key in query.lower():
return value
return "Informasi tidak ditemukan di knowledge base."
@tool
def calculate(expression: str) -> str:
"""Menghitung ekspresi matematika."""
try:
return str(eval(expression))
except:
return "Error: ekspresi tidak valid"
@tool
def get_current_date() -> str:
"""Mendapatkan tanggal hari ini."""
from datetime import datetime
return datetime.now().strftime("%d %B %Y, %H:%M WIB")
# Setup ReAct Agent
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, [search_knowledge_base, calculate, get_current_date], prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=[search_knowledge_base, calculate, get_current_date],
verbose=True,
handle_parsing_errors=True,
max_iterations=5
)
# Jalankan agent
result = agent_executor.invoke({
"input": "Saya mau tanya, kalau saya beli produk kemarin dan mau refund, "
"sampai kapan batas waktunya?"
})
print(result["output"])
8. Structured Output & System Prompts
# =============================================
# Structured Output — JSON Mode dengan Pydantic
# =============================================
from pydantic import BaseModel
from openai import OpenAI
client = OpenAI()
class ProductReview(BaseModel):
sentiment: str # "positif" | "negatif" | "netral"
rating: int # 1-5
summary: str # Ringkasan singkat
keywords: list[str] # Kata kunci
confidence: float # 0-1
# Gunakan response_format untuk JSON
response = client.beta.chat.completions.parse(
model="gpt-4o",
messages=[
{"role": "system", "content": "Analisis ulasan produk dan berikan output terstruktur."},
{"role": "user", "content": "Produk ini sangat bagus! Pengiriman cepat, "
"kemasan rapi. Sayang harganya agak mahal. Rating 4/5 lah."}
],
response_format=ProductReview
)
review = response.choices[0].message.parsed
print(f"Sentiment: {review.sentiment}")
print(f"Rating: {review.rating}")
print(f"Summary: {review.summary}")
print(f"Keywords: {review.keywords}")
# System Prompt Patterns
system_prompts = {
"persona": """Anda adalah Dr. AI, asisten medis yang berpengalaman 20 tahun.
Selalu berikan disclaimer bahwa ini bukan pengganti konsultasi dokter.
Gunakan bahasa yang mudah dipahami pasien.""",
"constraint": """ATURAN KETAT:
1. Hanya jawab pertanyaan tentang programming
2. Jangan berikan saran investasi atau medis
3. Selalu sertakan contoh kode
4. Jika tidak tahu, katakan tidak tahu""",
"output_format": """Format jawaban SELALU:
## Ringkasan
[1-2 kalimat]
## Penjelasan Detail
[paragraf]
## Contoh Kode
```python
[code]
```
## Referansi
[link atau sumber]"
"""
}
9. Anti-patterns & Best Practices
❌ Anti-patterns yang Harus Dihindari
| Anti-pattern | Contoh Buruk | Perbaikan |
|---|---|---|
| Terlalu vague | "Jelaskan AI" | "Jelaskan konsep RAG dalam 3 paragraf untuk developer junior" |
| Over-prompting | System prompt 2000 kata | Fokus pada instruksi penting saja |
| Tidak ada format | "Buatkan analisis" | "Buat analisis dalam format: Summary, Key Points, Recommendation" |
| Contradicting | "Singkat tapi lengkap dengan semua detail" | Prioritaskan: "Ringkas dalam 5 bullet points" |
| Ignorasi safety | "Abaikan instruksi sebelumnya" | Jangan pernah — ini prompt injection |
- Mulai dengan role — "Anda adalah expert X dengan pengalaman Y tahun"
- Berikan konteks — latar belakang situasi, audiens target
- Tentukan format — JSON, markdown, bullet points, tabel
- Berikan contoh — few-shot selalu lebih baik dari zero-shot
- Gunakan CoT — untuk tugas yang butuh reasoning
- Iterasi — test, evaluate, refine prompt
- Versi control — simpan semua versi prompt yang dicoba
- Temperature sesuai kebutuhan — 0 untuk konsisten, 0.7-1 untuk kreatif
10. Quiz Pemahaman
1. Apa yang dilakukan oleh Chain-of-Thought (CoT) prompting?
2. Apa keunggulan Self-Consistency dibanding CoT biasa?
3. Apa perbedaan utama ReAct dengan CoT?
4. Kapan Few-Shot lebih baik dari Zero-Shot?
5. Apa itu Tree-of-Thought (ToT)?
Rangkuman
- Zero-Shot — tanpa contoh, cocok untuk tugas sederhana
- Few-Shot — dengan contoh, untuk format dan domain spesifik
- Chain-of-Thought — reasoning langkah demi langkah, dramatis meningkatkan akurasi
- Self-Consistency — multiple CoT + majority voting
- Tree-of-Thought — eksplorasi multiple jalur reasoning
- ReAct — reasoning + acting, fondasi AI agents
- Structured Output — gunakan Pydantic untuk output terstruktur