Memahami kapan perlu fine-tuning dibanding prompt/RAG, lalu menguasai PEFT (LoRA & QLoRA) untuk menyesuaikan model open-weight secara hemat. Episode ini juga membahas dasar RLHF & DPO serta memandu praktik fine-tune Llama/Qwen/Gemma untuk domain spesifik dengan dataset kecil.

Hingga episode 11, semua aplikasi yang kalian bangun memakai model apa adanya — perilaku diatur lewat prompt, pengetahuan lewat RAG. Episode ini membuka jalur ketiga: mengubah model itu sendiri lewat fine-tuning. Kemampuan ini yang membedakan "memakai AI" dari "membangun solusi AI yang khas perusahaan".
Mengapa penting? Karena ada hal yang tidak bisa dicapai prompt maupun RAG: gaya output yang konsisten dan khas (nada perusahaan, format laporan), latensi & biaya rendah (model kecil yang sudah dilatih berperilaku seperti model besar), dan pengetahuan yang tertanam untuk akses offline. Namun fine-tuning juga termahal dan paling mudah disalahgunakan — jadi episode ini mengajarkan kapan tidak melakukannya.
Ini keputusan paling penting dan paling sering salah. Gunakan kerangka berikut:
| Masalah | Solusi Utama | Mengapa |
|---|---|---|
| Model tidak tahu data privat | RAG (episode 7) | Pengetahuan bisa diupdate tanpa retrain |
| Format/gaya output tidak sesuai | Prompt + few-shot (episode 3) | Murah, cepat diubah |
| Perlu style konsisten + hemat biaya/latensi | Fine-tuning | Model kecil dilatih meniru perilaku |
| Perlu pengetahuan dihafal akses offline | Fine-tuning | RAG butuh pipeline retrieval |
Aturan emas: fine-tune adalah pilihan terakhir, bukan pertama. Mulai dengan prompt → tambah RAG → baru pikirkan fine-tune. Biaya fine-tune meliputi GPU, data, dan siklus evaluasi yang panjang — jika masalah bisa diselesaikan retrieval, jangan fine-tune.
PEFT (Parameter-Efficient Fine-Tuning) mengubah hanya sebagian kecil parameter model. Dua teknik utamanya:
Mengapa ini penting? Karena fine-tune penuh (full fine-tuning) model 70B butuh puluhan GPU; dengan LoRA/QLoRA, hasil yang sebanding bisa dicapai di satu GPU. Pada 2026, PEFT adalah cara default menyesuaikan model open-weight.
pip install transformers datasets peft bitsandbytes accelerateFine-tuning modern (SFT, supervised fine-tuning) memakai dataset berbentuk instruction-response. Kualitas dataset menentukan segalanya — dataset jelek malah merusak model.
[
{"instruction": "Ringkas memo berikut",
"input": "Rapat Q3: keputusan migrasi database ke Postgres, target selesai Desember...",
"output": "Migrasi database ke Postgres ditargetkan selesai Desember."},
{"instruction": "Tulis balasan email singkat",
"input": "Pelanggan komplain pengiriman telat 3 hari",
"output": "Mohon maaf atas keterlambatan. Kami kirim ulang hari ini dengan resi berikut."},
{"instruction": "Klasifikasi tiket",
"input": "Tidak bisa login setelah update",
"output": "KATEGORI: account; URGENSI: high"}
]Aturan dataset: minimal ratusan–ribuan contoh, format konsisten, dan sesuai dengan pola yang akan dihadapi di produksi — model hanya bisa meniru apa yang dilihatnya.
Warning
Jangan fine-tune dengan data yang berisi hallucination atau informasi tidak valid — model akan mengukir kesalahan itu ke bobotnya. Berbeda dengan RAG yang bisa diperbaiki dengan mengganti dokumen, kesalahan fine-tune butuh retrain untuk diperbaiki. Audit data dulu.
Untuk produksi, tool seperti Unsloth dan TRL (Transformers Reinforcement Learning) memangkas kerumitan. Contoh dengan TRL + QLoRA:
from datasets import load_dataset
from peft import LoraConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import SFTTrainer, DataCollatorForCompletionOnly
model_id = "Qwen/Qwen2.5-3B-Instruct" # model open-weight kecil
tokenizer = AutoTokenizer.from_pretrained(model_id)
lora = LoraConfig(
r=16, # rank matriks adaptor
lora_alpha=32,
lora_dropout=0.05,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)
trainer = SFTTrainer(
model=model_id,
args=TrainingArguments(output_dir="ft-qwen", per_device_train_batch_size=1,
gradient_accumulation_steps=4, num_train_epochs=1),
train_dataset=load_dataset("json", data_files="dataset.json")["train"],
peft_config=lora,
dataset_text_field="prompt", # kolom dengan instruksi+output
)
trainer.train()Catatan penting dari kode ini:
r=16: rank LoRA — trade-off kapasitas vs ukuran file (16 cukup untuk banyak domain).Setelah training, simpan adaptor (bukan model penuh) dan gabungkan saat inferensi:
from peft import PeftModel
trainer.model.save_pretrained("ft-qwen-adaptor")
# gabungkan ke model asal saat dipakai
base = AutoModelForCausalLM.from_pretrained(model_id)
model = PeftModel.from_pretrained(base, "ft-qwen-adaptor")Adaptor LoRA biasanya hanya ratusan MB — beda jauh dengan full model puluhan GB. Inilah mengapa LoRA cocok disimpan, di-version, dan di-deploy dengan mudah.
SFT mengajarkan model meniru, tapi tidak memilih respons terbaik. RLHF (Reinforcement Learning from Human Feedback) dan turunannya DPO (Direct Preference Optimization) melatih model dengan preferensi: pasangan respons (dipilih vs ditolak) dari manusia/LLM judge.
[
{
"prompt": "Jelaskan cara reset password",
"chosen": "Buka halaman akun, pilih 'Lupa kata sandi'...",
"rejected": "Reset password itu rumit, mungkin harus beli paket premium."
}
]Kapan memakai DPO? Saat kalian punya data preferensi (feedback pengguna, evaluasi) dan ingin model cenderung memilih respons yang disukai. Framework seperti TRL mendukungnya dengan DPOTrainer — tetapi untuk sebagian besar aplikasi, SFT saja sudah cukup; DPO menambah kompleksitas.
Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita akan membahas Self-Hosted LLM & Ollama/vLLM — menjalankan model open-weight di infrastruktur sendiri: Ollama untuk lokal, vLLM untuk produksi, quantization (GGUF/AWQ), kebutuhan GPU, dan integrasi ke aplikasi. Sampai jumpa di episode 13!