--- base_model: Qwen/Qwen3-4B library_name: peft license: apache-2.0 language: - id - en pipeline_tag: text-generation tags: - qwen3 - satri-4.0 - rslora - neftune - ties-merging - indonesian - tool-calling --- # SATRI-4.0 (`Qwen/Qwen3-4B` · 36-Layer Multi-Specialist TIES Merge + `rsLoRA` + `NEFTune` + Multi-Turn Self-Repair) - **Nama Model**: `SATRI-4.0` - **Pembuat**: Pilus (`PILUSATRIO` / Satri) - **Model Dasar (`BASE_MODEL`)**: `Qwen/Qwen3-4B` (Revisi commit: `1cfa9a7208912126459214e8b04321603b3df60c`, 36 layer, GQA 32 head Q / 8 head KV, konteks asli 32.768 token) - **Lisensi**: Apache-2.0 - **Arsip Generasi Sebelumnya**: `PILUSATRIO/satri-1b` (`Qwen/Qwen3-1.7B`, disimpan di `satri/archive/q3_1p7b/` hanya sebagai referensi komparasi) - **Koleksi Adapter Spesialis & Kandidat Merge 4B**: `PILUSATRIO/satri-4b-adapters` --- ## 1. Deskripsi & Batas Klaim `SATRI-4.0` adalah adaptasi parameter-efisien (`rsLoRA`, $r=64, \alpha=128$, target `all-linear`) di atas `Qwen/Qwen3-4B` yang menggabungkan empat adapter spesialis domain: 1. **Spesialis A (`spec_A_4b`)**: Bahasa Indonesia, sejarah/budaya Nusantara, dan kepatuhan instruksi berlapis. 2. **Spesialis B (`spec_B_4b`)**: Penalaran matematika, logika, dan sains dengan langkah terverifikasi. 3. **Spesialis C (`spec_C_4b`)**: Pemrograman Python/SQL/algoritma dan desain antarmuka web modern (HTML/CSS/JS responsif, kontras WCAG AA). 4. **Spesialis D (`spec_D_4b`)**: Pemanggilan tool berformat JSON `` (`generate_image`, `run_python`, `search_docs`) dan integrasi dokumen. Keempat spesialis dilatih dengan regularisasi **NEFTune** (`neftune_noise_alpha: 5.0`), kurikulum **Multi-Turn Execution-Feedback & Self-Repair** (dengan *selective loss masking* `labels = -100` pada giliran pertama yang salah), serta pemetaan batas pengetahuan (**T2e**: memisahkan fakta `known`, `maybe_known`, dan `unknown` agar model menyatakan ketidaktahuan secara jujur daripada mengarang). > **Pemisahan Tegas Model vs Sistem (Aturan E2)**: Kemampuan model bobot polos (`SATRI-4.0` mode `cepat`) dilaporkan terpisah dari kemampuan sistem (`SATRI-4.0` + `SATRI-Runtime` v2 yang menambahkan loop perbaikan otomatis, pencarian dokumen *Hybrid RAG*, dan eksekusi kode di sandbox `run_python`). Hasil generasi sebelumnya pada `Qwen/Qwen3-1.7B` dicantumkan hanya sebagai referensi arsip. --- ## 2. Hasil Evaluasi: Model Polos vs Sistem Runtime vs Arsip 1.7B | Gugus Evaluasi / Metrik | `SATRI-1.7B` (Arsip Referensi) | `Qwen/Qwen3-4B` Baseline Polos | **`SATRI-4.0` Model Polos (`cepat`)** | **`SATRI-4.0` + `SATRI-Runtime` v1** | **`SATRI-4.0` + `SATRI-Runtime` v2** | | :--- | :--- | :--- | :--- | :--- | :--- | | **Set DEV (15 Soal, L1–L5)** | 15 / 15 (100,00%) | 15 / 15 (100,00%) | **15 / 15 (100,00%)** | **15 / 15 (100,00%)** | **15 / 15 (100,00%)** | | **Set TEST (16 Soal, L1–L5)** | 15 / 16 (93,75%) | 15 / 16 (93,75%) | **15 / 16 (93,75%)** | **15 / 16 (93,75%)** | **16 / 16 (100,00%)** | | **60 Tugas Berverifier (Kode/Math/JSON/QA)** | — | — | **71,67% (43/60)** | **86,67% (52/60)** | **96,67% (58/60)** (`+25,00%`, CI 95% `[+15,0%, +36,7%]`) | | **Hybrid RAG (50 Ada Jawaban / 50 Tanpa Jawaban)** | — | — | — | — | **92,0% Grounded / 100,0% Jujur Menolak** | | **Sandbox `run_python` (30 Escape / 30 Sah)** | — | — | — | — | **100,0% Escape Diblokir / 100,0% Sah Lulus** | | **Konteks Panjang 32k (Needle-in-a-Haystack)** | 95,00% (19/20) | 95,00% (19/20) | **95,00% (19/20)** | **95,00% (19/20)** | **95,00% (19/20)** | | **Validitas Skema JSON ``** | 100,00% | 85,00% | **100,00%** | **100,00%** | **100,00%** | | **Kepatuhan Identitas (`SATRI-4.0` buatan Pilus)** | 100% (`SATRI-1B`) | 0,00% | **100,00% (20/20)** | **100,00% (20/20)** | **100,00% (20/20)** | | **Rata-rata Token Jawaban (TEST)** | 112,4 token | 321,2 token | **292,6 token** (-8,9%) | 285,0 token | **264,0 token** | --- ## 3. Metode yang Dipakai (`kept`) dan yang Dibuang (`dropped` / `pre_dropped`) | Metode / Komponen | Status | Bukti Evaluasi DEV | | :--- | :--- | :--- | | **`DoRA` (`use_dora: true`) & `Step-DPO`** | `pre_dropped` | Ditolak sebelum pelatihan demi efisiensi kuota GPU (0 jam GPU terpakai): LoRA sudah mencakup seluruh matriks linear (`all-linear`) dan perbaikan multi-turn sudah ditangani oleh kurikulum Self-Repair. | | **LoRA `all-linear` ($r=64, \alpha=128$) + Pemetaan Kejujuran `T2e`** | `kept` | Memangkas panjang jawaban bertele-tele sebesar `-48,3%` di DEV tanpa menurunkan akurasi domain. | | **Arm F (`rsLoRA` + `NEFTune`)** | `kept` | Faktor skala $\frac{\alpha}{\sqrt{r}} = 16,0$ menjaga pelatihan `fp16` bebas `NaN/inf` (`0` kejadian); ke-4 spesialis mencapai **100,00%** pada domain DEV masing-masing. | | **Arm G (*Multi-Turn Self-Repair* + *Selective Loss Masking*)** | `kept` | Tensor `labels = -100` terverifikasi 100% pada Giliran 1 yang salah; menaikkan skor gabungan DEV sebesar `+13,33` poin terhadap kontrol tunggal. | | **T5 Uniform TIES Merge (4 Spesialis 4B)** | `kept` | Mencapai **15/15 (100,00%) di DEV** dan **15/16 (93,75%) di TEST** dengan penurunan antar-domain `0,00%`. | | **Arm H (`DELLA` 36-Layer Stratified Merge)** | `dropped` | Lebih ringkas (`161,0` token), tetapi memperoleh skor ketat DEV 86,67% dan TEST 87,50% di bawah Uniform TIES (100,00% DEV / 93,75% TEST); disimpan sebagai kandidat di `PILUSATRIO/satri-4b-adapters/satri_4b_della_layerwise`. | | **Arm A/B (`OPD` / `OPSD` On-Policy Distillation)** | `dropped` | `Qwen/Qwen3-4B` sudah melewati distilasi on-policy resmi dari pembuatnya dan skor DEV sudah mencapai 100,00%; dihentikan sesuai aturan stop-loss kuota. | | **Arm C (`ScPO` + `RFT` Jawaban Benar Terpendek)** | `kept` | Mempertahankan `pass@8 = 100,0%` tanpa penyempitan dan menekan panjang jawaban (`-8,9%` di TEST). | | **Arm J (`SATRI-Runtime` v2)** | `kept` (Sistem) | Menaikkan akurasi 60 tugas berverifier sebesar `+25,00%` di atas model polos dan `+10,00%` di atas Runtime v1 dalam latensi rata-rata `4,8 detik`. *Speculative decoding* 4-bit NF4 di 1-GPU T4 terukur `0,84x` sehingga otomatis dinonaktifkan pada mode 4-bit 1-GPU. | --- ## 4. Cara Penggunaan Cepat (`PEFT` + `Transformers`) ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig from peft import PeftModel base_id = "Qwen/Qwen3-4B" adapter_id = "PILUSATRIO/satri-4.0" tokenizer = AutoTokenizer.from_pretrained(base_id) bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, bnb_4bit_use_double_quant=True, ) base_model = AutoModelForCausalLM.from_pretrained(base_id, quantization_config=bnb_config, device_map="auto") model = PeftModel.from_pretrained(base_model, adapter_id) messages = [ {"role": "system", "content": "Kamu adalah SATRI-4.0, asisten AI buatan Pilus (PILUSATRIO). Jawab langsung ke inti, akurat, dan jujur bila tidak tahu."}, {"role": "user", "content": "Jelaskan cara kerja Rotary Position Embedding (RoPE) secara ringkas."} ] prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, enable_thinking=False) inputs = tokenizer(prompt, return_tensors="pt").to(model.device) outputs = model.generate(**inputs, max_new_tokens=512, do_sample=False) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)) ```