Setiap keputusan fine-tuning dimulai dari dua pilihan: model apa yang disesuaikan, dan data apa yang dipakai. LLM sungguhan bermiliar-miliar parameter dan tidak mungkin dilatih pada CPU dalam hitungan detik, jadi proyek ini memakai padanan konseptual: model bahasa mini level karakter dengan 27257 parameter. Struktur intinya meniru LLM — token masuk menjadi vektor embedding, diproses berlapis, lalu diproyeksikan kembali ke kosakata untuk memprediksi token berikut — persis pola yang dibahas pada chapter Pengenalan LLM . Dataset-nya pun meniru skenario nyata: korpus umum sebagai bahan pra-latih, lalu korpus domain kopi yang jauh lebih kecil sebagai bahan fine-tuning.

Membaca Korpus Tiga Subset #

Berkas data/korpus.txt memuat 30 kalimat bahasa Indonesia yang ditulis oleh skrip data/generate_data.py. Skrip tersebut deterministik: seluruh kalimat tersimpan sebagai daftar Python, sehingga menjalankan ulang skrip selalu menghasilkan berkas identik.

python data/generate_data.py — tiga kelompok kalimat
KORPUS_UMUM = [
    "saya suka membaca buku setiap sore.",
    "kami berjalan ke taman kota bersama.",
    # ... 18 kalimat tema sehari-hari lainnya
]

KORPUS_KOPI_LATIH = [
    "kopi hitam panas disajikan pagi hari.",
    "barista menuang susu ke gelas kopi.",
    # ... 6 kalimat domain kopi lainnya
]

KORPUS_KOPI_VALIDASI = [
    "kopi panas dibuat dengan biji pilihan.",
    "gelas kopi diletakkan di atas meja.",
]

Jalankan skripnya dari folder proyek untuk memeriksa isi korpus:

bash
python3 data/generate_data.py

Output yang Dihasilkan:

text
korpus ditulis     : korpus.txt
jumlah kalimat     : 30
jumlah karakter    : 1160
jumlah huruf unik  : 26
karakter unik      : 
 -.abcdefghijklmnoprstuwy
pembagian          : 20 umum + 8 kopi latih + 2 kopi validasi

Baris “karakter unik” memuat 26 tanda karena karakter baris baru ikut terhitung di berkas; kosakata model nanti berisi 25 token karena dibangun dari kalimat yang sudah dipisah per baris. Pemisahan tiga subset menjadi ketentuan proyek ini: 20 kalimat umum melatih model dasar, 8 kalimat kopi menjadi data fine-tuning, dan 2 kalimat kopi terakhir hanya dipakai untuk validasi — pola pembagian latih/validasi yang diulas pada chapter Pembagian Data Training, Validasi, dan Testing .

Kenapa Domain Kopi #

Domain kopi dipilih karena dua sifatnya yang cocok untuk demonstrasi. Pertama, kosakatanya sempit dan berulang — kata “kopi” muncul pada setiap kalimat subset — sehingga pergeseran perilaku model setelah fine-tuning terlihat jelas pada generasi teks di Bagian 5. Kedua, ukurannya sengaja kecil (8 kalimat latih) agar efek penyesuaian terjadi dalam 60 epoch tanpa menunggu lama; skenario dataset kecil inilah yang di dunia nyata menjadi alasan utama memakai LoRA alih-alih full fine-tuning, sebagaimana dibahas pada chapter Parameter-Efficient Fine-Tuning .

Anatomi Model Padanan Konseptual #

Model ModelBahasa di src/model_bahasa.py terdiri atas tiga komponen: nn.Embedding berdimensi 32, sel LSTM manual dengan state tersembunyi 64, dan kepala nn.Linear ke kosakata. Hasil pemeriksaan anatomi dari eksekusi python3 src/model_bahasa.py:

text
jumlah karakter kosakata : 25
karakter                 :  -.abcdefghijklmnoprstuwy
dimensi embedding        : 32
dimensi state tersembunyi: 64
parameter embedding      : 800
parameter lstm.gab       : 24576 + bias 256
parameter kepala         : 1600 + bias 25
total parameter          : 27257

Dua angka layak dicermati. Lapisan lstm.gab menampung 24576 bobot karena satu nn.Linear gabungan menghitung keempat gerbang LSTM sekaligus — struktur gerbang input, forget, cell, dan output yang dibedah pada chapter Long Short-Term Memory . Lapisan inilah yang nanti dibekukan dan diberi adapter LoRA, bersama kepala proyeksi, karena keduanya menyumbang 26457 dari 27257 parameter.

Model dan korpus kini sudah dikenal: 25 token karakter, 27257 parameter, tiga subset teks. Bagian berikutnya mengubah korpus tersebut menjadi jendela latih 32 token yang siap masuk training loop.