"Chain-of-thought prompting" adalah buzzword yang sering disebut tapi jarang dipahami dengan benar. Saya pernah lihat developer menambahkan "think step by step" ke setiap prompt — hasilnya: lebih lambat, lebih mahal, tapi tidak lebih akurat untuk task yang tidak butuh reasoning.
Ini breakdown kapan masing-masing teknik benar-benar membantu.
Zero-Shot — Default yang Sering Cukup
Zero-shot artinya tidak ada contoh — hanya instruksi. Untuk task yang straightforward dan sudah ada di training data LLM, ini cukup dan paling efisien.
# Zero-shot — efisien untuk task sederhana
zero_shot = """Klasifikasikan sentimen kalimat berikut sebagai POSITIF, NEGATIF, atau NETRAL.
Hanya balas dengan satu kata.
Kalimat: "Pelayanannya lumayan tapi harganya terlalu mahal""""
# Output yang diharapkan: NEGATIF
# Akurat? Ya. Perlu contoh? Tidak.
# Zero-shot TIDAK cukup untuk task ini:
zero_shot_fail = """Ekstrak semua entitas dari teks berikut dalam format JSON
dengan keys: orang, organisasi, lokasi, tanggal."""
# LLM tidak tahu persis format JSON yang Anda inginkan
# → Butuh few-shot
Few-Shot — Tunjukkan, Jangan Cuma Bilang
Few-shot efektif ketika: output format sangat spesifik, task membutuhkan nuance yang susah dijelaskan dengan kata-kata, atau ketika zero-shot menghasilkan variasi yang tidak diinginkan.
few_shot_prompt = """Ekstrak entitas dari teks dan return sebagai JSON.
Input: "Budi Santoso dari PT Maju Jaya menandatangani kontrak pada 15 Januari 2025 di Jakarta."
Output: {"orang": ["Budi Santoso"], "organisasi": ["PT Maju Jaya"], "lokasi": ["Jakarta"], "tanggal": ["15 Januari 2025"]}
Input: "Pertemuan antara Direktur Utama dan perwakilan vendor berlangsung kemarin."
Output: {"orang": [], "organisasi": [], "lokasi": [], "tanggal": ["kemarin"]}
Input: "Surat ini ditujukan kepada Yth. Ibu Dewi Rahayu di Surabaya"
Output: {"orang": ["Dewi Rahayu"], "organisasi": [], "lokasi": ["Surabaya"], "tanggal": []}
Input: "{USER_INPUT}"
Output:"""
# Contoh kedua menunjukkan: LLM tidak boleh "mengisi" entitas yang tidak ada
# Contoh ketiga menunjukkan cara handle title/sapaan
Chain-of-Thought — Kapan Benar-Benar Membantu
CoT bekerja dengan meminta LLM "berpikir keras" sebelum menjawab. Ini meningkatkan akurasi untuk task yang butuh multi-step reasoning — tapi tidak semua task butuh ini.
| Task Type | CoT Membantu? | Alasan |
|---|---|---|
| Matematika, logika, code debugging | ✓ Sangat membantu | Multi-step reasoning — tiap langkah perlu benar |
| Analisis dokumen kompleks | ✓ Membantu | Perlu synthesize informasi dari berbagai bagian |
| Klasifikasi sentimen sederhana | ✗ Tidak perlu | Pattern recognition, bukan reasoning — CoT hanya tambah latency |
| Ekstraksi data terstruktur | △ Kadang | Jika formatnya kompleks, CoT bantu — kalau simpel, tidak perlu |
| Terjemahan | ✗ Tidak perlu | LLM sudah sangat baik tanpa CoT untuk bahasa yang well-represented |
cot_prompt = """Analisis apakah perusahaan ini layak sebagai mitra bisnis berdasarkan data berikut.
Data perusahaan: {company_data}
Sebelum memberikan rekomendasi akhir, pikirkan langkah demi langkah:
1. Evaluasi kondisi keuangan berdasarkan data yang ada
2. Identifikasi risiko yang terlihat
3. Pertimbangkan potensi upside
4. Synthesize semua faktor
Setelah analisis lengkap, berikan rekomendasi: LAYAK / TIDAK LAYAK / PERLU INVESTIGASI LEBIH LANJUT
beserta 3 alasan utama."""
# Bandingkan dengan tanpa CoT:
no_cot = "Apakah perusahaan ini layak sebagai mitra? Data: {company_data}"
# Lebih cepat, tapi untuk keputusan bisnis penting — akurasi lebih rendah
ReAct vs CoT vs ToT — Mana yang Kapan
Untuk CoT dalam Bahasa Indonesia, eksplisit minta LLM untuk berpikir dalam Bahasa Indonesia: "Pikirkan dalam Bahasa Indonesia, langkah demi langkah." Tanpa ini, beberapa LLM melakukan internal reasoning dalam Inggris dan "menerjemahkan" hasilnya — ini bisa introduce subtle errors untuk konten yang sangat Indonesia-specific.
Structured Output — Format yang Bisa Diparsing
Untuk aplikasi yang butuh JSON output yang konsisten, gunakan JSON mode atau function calling daripada berharap LLM selalu menghasilkan JSON yang valid dari instruksi teks:
from pydantic import BaseModel
from langchain_anthropic import ChatAnthropic
class ComplaintAnalysis(BaseModel):
category: str
priority: str # HIGH, MEDIUM, LOW
needs_more_info: bool
response: str
# Claude menghasilkan output yang guaranteed valid sesuai schema
llm = ChatAnthropic(model="claude-3-5-haiku-20241022")
structured_llm = llm.with_structured_output(ComplaintAnalysis)
result = structured_llm.invoke("Atap kamar saya bocor parah saat hujan")
# result.category, result.priority, etc. — guaranteed ada dan bertipe benar
# Tidak perlu try/except json.loads atau validasi manual
Gunakan teknik yang paling sederhana yang bekerja: zero-shot → few-shot → CoT → ReAct. Jangan langsung ke CoT hanya karena terdengar lebih canggih — untuk task sederhana, zero-shot lebih murah dan cukup akurat.
Kesimpulan
Zero-shot untuk task yang clear dan simple. Few-shot ketika format output sangat spesifik atau ada nuance yang susah dideskripsikan. CoT untuk multi-step reasoning. ReAct untuk agent dengan tools. ToT hanya untuk keputusan kritis yang butuh exhaustive exploration.