☀️Siang
AI & Data Science

Prompt Engineering Advanced — Chain-of-Thought, Few-Shot, Self-Consistency, Tree-of-Thought, ReAct

Kuasai teknik prompt engineering tingkat lanjut untuk memaksimalkan kemampuan LLM — dari chain-of-thought reasoning hingga ReAct pattern untuk agentic AI

Artikel: Prompt Engineering Artikel: Prompt Engineering

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 cocokButuh reasoning bertahap
Code debugging✅ Sangat cocokAnalisis langkah demi langkah
Analisis kasus hukum✅ CocokButuh argumen bertingkat
Klasifikasi sederhana❌ Tidak perluTerlalu overkill
Translation❌ Tidak perluButuh fluency, bukan reasoning
Summarization⚠️ KadangBerguna 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.

Python — Self-Consistency Implementation
# =============================================
# 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.

Python — Tree-of-Thought Implementation
# =============================================
# 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.

Diagram: ReAct Loop

Thought (Pikir) 'User tanya harga saham AAPL. S...

Thought (Pikir lagi) 'Sudah dapat data. Sekaran...

Final Answer 'Harga saham AAPL hari ini $185.50...

Action (Aksi) search_stock_price("ticker='AAPL'")

Observation (Amati) Result: AAPL = $185.50, nai...

Python — ReAct with LangChain
# =============================================
# 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

Python — Structured Output dengan Pydantic
# =============================================
# 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-promptingSystem prompt 2000 kataFokus 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
💡 Best Practices Prompt Engineering
  • 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

📝 Poin Penting
  • 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
🔍 Zoom
100%
🎨 Tema