BAB 02

02 - Prompt Engineering Mastery: Chain-of-Thought, Few-Shot, dan Structured Output

Estimasi Waktu: 40 menit
Level: Intermediate


Mengapa Prompt Engineering adalah “Software Engineering” Baru?

Banyak orang mengira prompt engineering hanyalah menulis kata-kata di ChatGPT. Di dunia industri (dan karir jangka panjang), prompt engineering adalah teknik terstruktur untuk menjamin prediktabilitas, keandalan, dan struktur data yang dihasilkan oleh LLM.

Hingga tahun 2045, meskipun model semakin cerdas, mengarahkan penalaran LLM/LMM secara terprogram (programmatic prompting) akan tetap menjadi pilar utama untuk mengintegrasikan model kognitif dengan sistem perangkat lunak tradisional.


1. Zero-Shot vs. Few-Shot Prompting

User:
Klasifikasikan ulasan produk berikut:
Ulasan: "Barangnya cepet sampe, kualitasnya oke banget!" -> SENTIMEN: POSITIF
Ulasan: "Beli warna merah malah dikirim biru, kecewa." -> SENTIMEN: NEGATIF
Ulasan: "Biasa aja sih, sesuai harga." -> SENTIMEN: NETRAL
Ulasan: "Ukuran kekecilan tapi bahan tebal." -> SENTIMEN:

2. Chain-of-Thought (CoT) & Reasoning

Chain-of-Thought (CoT) memaksa model menuliskan langkah-langkah penalaran secara eksplisit sebelum memberikan jawaban akhir. Ini sangat meningkatkan akurasi pada tugas logika dan matematika.

Contoh Prompt Tanpa CoT (Sering Salah):

Q: Roger punya 5 tenis bola. Dia beli 2 kaleng tenis bola lagi. Setiap kaleng berisi 3 bola. Berapa bola Roger sekarang?
A: 11 bola.
(Model langsung menjawab, terkadang salah jika angkanya rumit)

Contoh Prompt Dengan CoT:

Q: Roger punya 5 tenis bola. Dia beli 2 kaleng tenis bola lagi. Setiap kaleng berisi 3 bola. Berapa bola Roger sekarang?
Mari kita berpikir langkah demi langkah:
1. Roger mulai dengan 5 bola.
2. Dia membeli 2 kaleng, masing-masing berisi 3 bola. Total bola baru = 2 * 3 = 6 bola.
3. Total bola sekarang = 5 + 6 = 11 bola.
A: 11 bola.

3. Structured Output: Pydantic & Instructor

Dalam aplikasi produksi, Anda tidak bisa membiarkan LLM membalas dengan teks bebas seperti “Menurut saya, sentimennya positif karena…”. Anda memerlukan format terstruktur seperti JSON yang divalidasi oleh skema tipe data.

Pustaka seperti Instructor (menggunakan Pydantic di Python) memungkinkan LLM mengembalikan object Pydantic secara native menggunakan Function Calling.

import instructor
from openai import OpenAI
from pydantic import BaseModel, Field
from enum import Enum

# 1. Definisikan Schema Output menggunakan Pydantic
class SentimentEnum(str, Enum):
    POSITIVE = "positif"
    NEGATIVE = "negatif"
    NEUTRAL = "netral"

class UserProfile(BaseModel):
    name: str = Field(description="Nama pengguna")
    sentiment: SentimentEnum = Field(description="Sentimen dari teks")
    confidence: float = Field(description="Tingkat keyakinan dari 0.0 sampai 1.0")

# 2. Inisialisasi client Instructor
client = instructor.from_openai(OpenAI())

# 3. Minta LLM mengisi schema
response: UserProfile = client.chat.completions.create(
    model="gpt-4o-mini",
    response_model=UserProfile,
    messages=[
        {"role": "user", "content": "Halo, nama gw Ojan. Gila ya ini aplikasi keren banget sumpah!"}
    ]
)

print(response.name)       # Output: Ojan
print(response.sentiment)  # Output: SentimentEnum.POSITIVE
print(response.confidence) # Output: 0.95 (contoh)

4. DSPy: Pergeseran dari Manual Prompting ke Programmatic Compilation

Tantangan terbesar prompt engineering manual adalah kerapuhan (fragility). Saat Anda mengganti model dari GPT-4 ke Llama 3, seluruh prompt manual Anda sering kali hancur dan harus ditulis ulang.

Stanford memperkenalkan DSPy (Declarative Self-improving Python). DSPy membuang penulisan prompt manual. Sebagai gantinya, Anda mendefinisikan Signature dan Pipeline, lalu menggunakan optimizer DSPy untuk menyusun prompt dan contoh Few-Shot terbaik secara otomatis berdasarkan dataset latih kecil.

# Konsep dasar DSPy
import dspy

# 1. Definisikan input dan output (Signature)
class SentimentClassifier(dspy.Signature):
    """Klasifikasikan sentimen dari ulasan pengguna."""
    review = dspy.InputField(desc="Ulasan produk dari pengguna")
    sentiment = dspy.OutputField(desc="Sentimen: POSITIF, NEGATIF, atau NETRAL")

# 2. Definisikan Modul (seperti mendesain Neural Network di PyTorch)
class SentimentSystem(dspy.Module):
    def __init__(self):
        super().__init__()
        # Menggunakan Predictor sederhana atau ChainOfThought
        self.classifier = dspy.ChainOfThought(SentimentClassifier)

    def forward(self, review):
        return self.classifier(review=review)

Dengan DSPy, jika Anda mengganti LLM dasar, Anda tinggal memanggil fungsi teleprompt.compile() untuk melakukan optimasi ulang tanpa menyentuh satu pun teks prompt manual.


Latihan

  1. Gunakan OpenAI API atau Google Gemini API untuk mengekstrak informasi entitas (Nama, Alamat, Nomor HP) dari teks acak menggunakan teknik Few-Shot.
  2. Tulis skema Pydantic untuk mengekstrak data tiket bioskop (Judul Film, Bioskop, Jam Tayang, Jumlah Tiket) dan jalankan menggunakan library instructor.
  3. Uji coba apa yang terjadi jika Anda memasukkan input yang salah/tidak valid ke skema Pydantic tersebut (misal: jam tayang diisi huruf acak). Perhatikan bagaimana model melakukan self-correction.

Target: Mampu menghasilkan data terstruktur berformat JSON dari LLM secara konsisten dan andal menggunakan Pydantic.