Tutorial Lengkap Guidance: Constrained Generation dan Structured Output dari LLM
Halo temen-temen, di tutorial kali ini aku mau ngajak kalian kenalan sama library yang menurutku sering banget kelewatan padahal powerful banget buat kerja bareng LLM, namanya Guidance. Ini library bikinan Microsoft yang fokusnya di satu hal yang bikin hidup kita jauh lebih gampang: ngontrol dan nyetir output dari model bahasa biar bener-bener sesuai sama struktur yang kita mau. Bukan cuma minta dengan sopan lewat prompt terus berdoa modelnya nurut, tapi beneran maksa outputnya ikut aturan yang kita tentuin.
Kalau kalian pernah frustrasi karena LLM kalian kadang ngasih jawaban yang formatnya berantakan, kadang nambahin kata-kata yang gak diminta, kadang milih opsi di luar daftar yang udah kita sediain, nah Guidance ini bakal jadi solusi yang elegan banget. Aku bakal bahas dari dasar banget, mulai dari kenapa constrained generation itu penting, cara instalasi, penggunaan dasar gen() dan select(), sampai ke fitur-fitur canggih kayak regex constraint, grammar atau CFG, token healing, dan bikin fungsi reusable pakai decorator @guidance. Semua bakal aku kasih contoh kode Python yang beneran bisa kalian jalanin. Yuk kita mulai.
Introduction
Sebelum masuk ke kodenya, aku mau cerita dulu masalah yang bikin library ini lahir. Bayangin temen-temen lagi bikin aplikasi yang butuh LLM buat ngeklasifikasi sentimen sebuah review jadi "positif", "negatif", atau "netral". Cara paling naif adalah kita nulis prompt kayak "Klasifikasikan sentimen review ini, jawab dengan satu kata saja: positif, negatif, atau netral." Terus kita kirim ke model dan berharap yang balik cuma satu kata dari tiga pilihan itu.
Masalahnya, LLM itu pada dasarnya generator teks yang milih token berikutnya berdasarkan probabilitas. Dia gak punya jaminan bakal nurut sama instruksi kita. Kadang dia jawab "Sentimen dari review ini adalah positif." Kadang dia jawab "Positive" pakai bahasa Inggris padahal kita minta bahasa Indonesia. Kadang dia jawab "agak positif" yang mana gak ada di daftar pilihan kita. Nah, tiap kali outputnya keluar dari jalur, kode kita yang harus parsing hasilnya jadi ikutan rapuh dan gampang error.
Pendekatan tradisional buat ngatasin ini biasanya kita nambahin instruksi yang makin panjang dan makin detail di prompt, atau kita parsing manual pakai regex, atau kita bungkus semua pakai try-except gede-gedean. Tapi ini semua rapuh. Begitu modelnya ngeluarin output yang sedikit beda, kode kita langsung jebol.
Ide di balik Guidance itu beda dari sekadar prompting. Guidance kerja di level token generation. Jadi bukan cuma minta modelnya lewat teks, tapi Guidance beneran ngebatasin token apa aja yang boleh dikeluarin model di tiap langkah. Kalau kita bilang outputnya harus salah satu dari tiga pilihan, maka Guidance secara teknis cuma ngizinin token yang mengarah ke tiga pilihan itu. Model gak punya cara buat ngeluarin output di luar itu, karena token yang gak valid probabilitasnya di-nol-in.
Selain constrained generation, Guidance juga punya konsep yang aku suka banget: kita bisa nginterleave alur kontrol program kita sama proses generasi. Jadi di dalam satu template, kita bisa ngatur bagian mana yang teks statis, bagian mana yang di-generate model, bagian mana yang dibatasi pilihan, bahkan bisa ada percabangan if-else dan looping. Ini beda banget sama cara kita biasa manggil LLM yang model request-response satu shot. Dengan Guidance, kita jadi bisa nyusun program yang lebih deterministik dan terkontrol.
Guidance ini juga hemat token dan sering lebih cepet, karena bagian yang udah kita tentuin sebagai teks statis gak perlu di-generate ulang oleh model. Model cuma fokus ngisi bagian yang emang perlu di-generate. Ini beda sama pendekatan chat biasa yang harus generate ulang semua struktur JSON atau format tiap kali.
Oke, sekarang biar gak cuma teori, kita langsung praktik ya temen-temen.
Instalasi
Instalasinya gampang banget, cukup satu baris pakai pip.
pip install guidance
Guidance secara otomatis udah bawa dependency inti yang dibutuhin. Tapi tergantung model apa yang mau kalian pakai, kalian mungkin butuh library tambahan. Kalau kalian mau pakai model dari OpenAI, install juga library openai-nya.
pip install guidance openai
Kalau kalian mau jalanin model lokal pakai transformers dari HuggingFace, install torch sama transformers.
pip install guidance transformers torch
Dan kalau kalian mau pakai model dalam format GGUF lewat llama.cpp, yang mana ini pilihan favoritku buat model lokal karena ringan dan bisa jalan di CPU, install llama-cpp-python.
pip install guidance llama-cpp-python