Banyak organisasi di Indonesia ingin memanfaatkan kecerdasan buatan untuk pekerjaan sehari-hari — merangkum laporan insiden, menjawab pertanyaan seputar SOP internal, mengklasifikasikan tiket helpdesk — tetapi terbentur pada satu pertanyaan yang sulit dijawab bagian hukum: ke mana data kami pergi? Ketika sebuah dokumen internal dikirim ke layanan LLM pihak ketiga di luar negeri, organisasi bukan sekadar memindahkan teks; ia melakukan pemrosesan data yang tunduk pada Undang-Undang Nomor 27 Tahun 2022 tentang Pelindungan Data Pribadi (UU PDP), termasuk kewajiban dasar pemrosesan, pembatasan tujuan, dan ketentuan transfer data pribadi ke luar wilayah Indonesia.
Ada jalan tengah yang semakin realistis pada 2026: menjalankan dan menyesuaikan (fine-tune) model bahasa berukuran kecil hingga menengah di infrastruktur sendiri. Berkat teknik QLoRA, pekerjaan yang dulu menuntut klaster GPU kelas data center kini bisa dilakukan pada satu kartu grafis 16–24 GB. Artikel ini adalah tutorial langkah demi langkah untuk membangun asisten AI berbahasa Indonesia yang bobot, data latih, dan inferensinya tetap berada di dalam jaringan Anda.
Mengapa Fine-Tuning, dan Kapan Sebaiknya Tidak
Sebelum menulis satu baris kode, penting meletakkan ekspektasi pada tempatnya. Fine-tuning bukan obat untuk segala penyakit. Secara umum ada tiga cara menyesuaikan perilaku LLM, dengan biaya dan efek yang berbeda:
- Prompt engineering. Termurah dan tercepat. Cocok bila yang Anda butuhkan hanya perubahan gaya, format keluaran, atau instruksi peran. Selalu coba ini lebih dulu.
- RAG (Retrieval-Augmented Generation). Pilihan tepat bila masalahnya adalah pengetahuan — model perlu mengetahui isi dokumen kebijakan terbaru Anda. Pengetahuan yang sering berubah lebih baik disimpan di indeks pencarian, bukan dibekukan ke dalam bobot model.
- Fine-tuning. Paling tepat bila masalahnya adalah perilaku: model harus konsisten mengeluarkan JSON dengan skema tertentu, memakai terminologi internal, menjawab dengan register bahasa Indonesia formal yang benar, atau meniru pola klasifikasi yang sulit dijelaskan lewat instruksi.
Dalam praktik, kombinasi RAG untuk pengetahuan dan fine-tuning untuk perilaku memberi hasil terbaik. Tutorial ini fokus pada bagian kedua.
Memahami QLoRA dalam Tiga Kalimat
LoRA (Low-Rank Adaptation) membekukan seluruh bobot model asli dan hanya melatih sepasang matriks kecil berperingkat rendah yang disisipkan di samping lapisan-lapisan tertentu. Karena hanya matriks kecil itu yang dilatih, jumlah parameter yang perlu diperbarui turun drastis — pada proyeksi berukuran 4096×4096 dengan rank 16, parameter terlatih menyusut dari sekitar 16,7 juta menjadi kira-kira 131 ribu. QLoRA menambahkan satu langkah lagi: bobot dasar dikuantisasi ke 4-bit sehingga model itu sendiri muat di VRAM yang jauh lebih kecil, sementara adapter LoRA tetap dilatih dengan presisi lebih tinggi.
Hasil akhir bukan model utuh yang baru, melainkan berkas adapter berukuran puluhan hingga ratusan megabita yang dapat dipasang di atas model dasar. Ini memudahkan versioning, audit, dan rollback.
Prasyarat Perangkat Keras
Kebutuhan VRAM sangat bergantung pada ukuran model dan panjang konteks pelatihan. Sebagai gambaran kasar untuk QLoRA 4-bit dengan pustaka yang teroptimasi:
- Model kelas 2–4 miliar parameter: nyaman di GPU 8–12 GB. Ini titik awal yang baik untuk uji coba.
- Model kelas 7–9 miliar parameter: umumnya butuh 16 GB. Sweet spot untuk kebanyakan kasus produksi internal.
- Model kelas 27–30 miliar parameter: mulai realistis di kartu 24 GB dengan pengaturan agresif, tetapi lebih aman di 48 GB.
Untuk model dasar berbahasa Indonesia, Anda dapat memakai model multibahasa terbuka yang sudah kuat dalam Bahasa Indonesia, atau memulai dari ekosistem Sahabat-AI — LLM sumber terbuka hasil kolaborasi Indosat Ooredoo Hutchison dan GoTo bersama sejumlah perguruan tinggi, yang secara khusus dilatih untuk Bahasa Indonesia dan beberapa bahasa daerah, serta tersedia di Hugging Face. Periksa selalu lisensi model sebelum dipakai untuk keperluan komersial.
Langkah 1: Menyiapkan Lingkungan
Gunakan lingkungan virtual terpisah agar dependensi tidak bentrok dengan sistem.
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install unsloth trl peft transformers datasets accelerate bitsandbytes
Verifikasi bahwa GPU terdeteksi sebelum melanjutkan:
import torch
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0))
print(torch.cuda.get_device_properties(0).total_memory / 1e9, "GB")
Langkah 2: Menyiapkan Dataset — Bagian yang Paling Menentukan
Kualitas dataset menentukan 80% hasil akhir. Untuk melatih perilaku, 300–2.000 contoh yang bersih dan konsisten biasanya jauh lebih berguna daripada 50.000 contoh berantakan hasil scraping.
Format yang paling umum saat ini adalah format percakapan. Simpan sebagai JSON Lines (satu objek per baris):
{"messages": [
{"role": "system", "content": "Anda adalah asisten kepatuhan internal PT Contoh. Jawab ringkas, formal, dan sebutkan pasal rujukan bila ada."},
{"role": "user", "content": "Berapa lama kami wajib memberitahukan kebocoran data pribadi kepada subjek data?"},
{"role": "assistant", "content": "Pemberitahuan tertulis wajib disampaikan paling lambat 3 x 24 jam sejak diketahuinya kegagalan pelindungan data pribadi, kepada subjek data dan lembaga terkait, sesuai Pasal 46 UU No. 27 Tahun 2022."}
]}
Tiga rambu penting sebelum data masuk ke pelatihan:
- Sanitasi data pribadi. Model menghafal. Apa pun yang masuk ke data latih berpotensi keluar lagi di jawaban. Ganti nama, NIK, nomor telepon, dan alamat dengan token pengganti seperti
[NAMA]atau[NIK], kecuali memang ada dasar pemrosesan yang sah dan tujuan yang jelas. - Dasar pemrosesan. Jika data latih berasal dari percakapan pelanggan atau dokumen SDM, pastikan penggunaannya untuk pelatihan model tercakup dalam dasar pemrosesan dan pemberitahuan yang sudah ada, sesuai prinsip pembatasan tujuan di UU PDP.
- Konsistensi. Jika separuh contoh menjawab dengan bullet dan separuh dengan paragraf, model akan belajar bahwa keduanya sama-sama benar — dan keluarannya menjadi tidak dapat diprediksi.
Langkah 3: Memuat Model dalam 4-bit dan Memasang Adapter
from unsloth import FastLanguageModel
MODEL = "unsloth/Qwen3-4B-Instruct" # ganti sesuai model dasar pilihan Anda
MAX_SEQ = 2048
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = MODEL,
max_seq_length = MAX_SEQ,
load_in_4bit = True,
)
model = FastLanguageModel.get_peft_model(
model,
r = 16, # rank adapter
lora_alpha = 32, # umumnya 2x nilai r
lora_dropout = 0.0,
bias = "none",
target_modules = [
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",
],
use_gradient_checkpointing = "unsloth",
random_state = 42,
)
r mengatur kapasitas adapter. Nilai 16 adalah titik awal yang wajar; naikkan ke 32 atau 64 hanya jika model jelas underfitting setelah beberapa epoch. Menyertakan seluruh modul proyeksi (attention dan MLP) biasanya memberi hasil lebih baik daripada hanya q_proj dan v_proj.
Langkah 4: Konfigurasi dan Menjalankan Pelatihan
from datasets import load_dataset
from trl import SFTTrainer, SFTConfig
dataset = load_dataset("json", data_files="data/train.jsonl", split="train")
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset,
args = SFTConfig(
output_dir = "outputs",
max_seq_length = MAX_SEQ,
per_device_train_batch_size = 2,
gradient_accumulation_steps = 8, # batch efektif = 16
num_train_epochs = 3,
learning_rate = 2e-4,
warmup_ratio = 0.05,
lr_scheduler_type = "cosine",
optim = "adamw_8bit",
logging_steps = 10,
save_strategy = "epoch",
seed = 42,
),
)
trainer.train()
Beberapa catatan praktis:
- Learning rate untuk LoRA jauh lebih tinggi daripada full fine-tuning; 1e-4 hingga 2e-4 adalah rentang yang lazim.
- Gunakan
gradient_accumulation_stepsuntuk menaikkan batch efektif tanpa menambah VRAM. - Amati kurva loss. Jika turun tajam lalu mendatar di bawah 0,3 pada dataset kecil, kemungkinan besar model mulai menghafal. Kurangi epoch atau tambah variasi data.
- Sisihkan 10% data sebagai set validasi yang tidak pernah dilihat model. Tanpa itu, Anda tidak punya cara objektif menilai keberhasilan.
Langkah 5: Menguji Hasil
Uji dengan pertanyaan yang tidak ada di data latih, termasuk pertanyaan di luar cakupan untuk memeriksa apakah model tahu kapan harus menolak menjawab.
FastLanguageModel.for_inference(model)
pesan = [
{"role": "system", "content": "Anda adalah asisten kepatuhan internal PT Contoh."},
{"role": "user", "content": "Apa saja hak subjek data menurut UU PDP?"},
]
inputs = tokenizer.apply_chat_template(
pesan, add_generation_prompt=True, return_tensors="pt"
).to("cuda")
keluaran = model.generate(inputs, max_new_tokens=512, temperature=0.3)
print(tokenizer.decode(keluaran[0], skip_special_tokens=True))
Untuk evaluasi yang lebih serius, susun 50–100 pertanyaan uji beserta jawaban rujukan, lalu nilai secara manual pada tiga dimensi: kebenaran faktual, kepatuhan format, dan kesesuaian gaya bahasa. Bandingkan skor model hasil fine-tuning dengan model dasar tanpa adapter. Jika tidak ada peningkatan yang jelas, masalahnya hampir selalu ada di dataset, bukan di hiperparameter.
Langkah 6: Menyimpan dan Menyajikan Model
# Simpan adapter saja (kecil, mudah diversikan)
model.save_pretrained("adapter-kepatuhan-v1")
tokenizer.save_pretrained("adapter-kepatuhan-v1")
# Atau gabungkan ke bobot dasar untuk deployment
model.save_pretrained_merged(
"model-kepatuhan-v1", tokenizer, save_method="merged_16bit"
)
Untuk penyajian, pilih sesuai skala: Ollama atau llama.cpp (format GGUF) untuk penggunaan tim kecil dan perangkat tanpa GPU besar; vLLM bila Anda perlu melayani banyak permintaan bersamaan dengan latensi rendah.
Rambu Keamanan, Etika, dan Kepatuhan
Menjalankan model secara lokal menghilangkan risiko transfer data lintas yurisdiksi, tetapi memunculkan tanggung jawab baru yang harus dikelola:
- Bobot model adalah aset sensitif. Adapter hasil pelatihan dapat merefleksikan isi data internal. Perlakukan berkas model seperti basis data produksi: kendali akses ketat, enkripsi saat disimpan, dan pencatatan akses.
- Rantai pasok model. Unduh bobot hanya dari repositori resmi, verifikasi checksum, dan hindari memuat berkas format lama yang mengeksekusi kode saat dimuat. Gunakan format
safetensors. - Fine-tuning dapat melemahkan pengaman. Melatih model dengan dataset sempit diketahui dapat menggerus safety alignment bawaannya. Uji ulang perilaku model terhadap permintaan berbahaya setelah pelatihan, dan pertahankan lapisan filter di sisi aplikasi.
- Tetap ada risiko prompt injection. Jika asisten Anda membaca dokumen atau email, instruksi jahat yang tersembunyi di dalamnya tetap dapat membajak perilaku model. Fine-tuning bukan mitigasi untuk ini.
- Dokumentasi tata kelola. Kerangka seperti NIST AI Risk Management Framework dan ISO/IEC 42001 menyediakan struktur untuk mendokumentasikan asal data, tujuan sistem, hasil evaluasi, dan mekanisme pengawasan manusia — dokumentasi yang akan sangat berguna saat audit internal maupun pemeriksaan regulator.
Penutup
Fine-tuning lokal dengan QLoRA telah bergeser dari eksperimen laboratorium menjadi pilihan arsitektur yang masuk akal secara teknis maupun ekonomis. Bagi organisasi Indonesia yang menangani data pribadi, data nasabah, atau informasi operasional yang tidak boleh keluar dari perimeter, pendekatan ini menawarkan sesuatu yang sulit ditandingi layanan cloud mana pun: kendali penuh atas ke mana data pergi.
Mulailah kecil. Pilih satu proses berulang yang jelas — klasifikasi tiket, penyusunan ringkasan insiden, penjawab pertanyaan SOP — kumpulkan beberapa ratus contoh berkualitas, dan ukur hasilnya dengan jujur terhadap baseline. Model yang lebih besar hampir tidak pernah menjadi jawaban atas dataset yang buruk.


