""" Uji empiris model zero-shot untuk deteksi salah-field (Field-Fit ML). Tujuan: mengukur apakah `MoritzLaurer/mDeBERTa-v3-base-mnli-xnli` (zero-shot, multibahasa, sudah ter-cache) dapat mengklasifikasikan isi sebuah field ke kategori field yang benar dengan andal — syarat agar deteksi salah-field tidak banjir false positive. Output: untuk tiap kasus, label prediksi teratas + skor, dan apakah cocok dengan field yang diharapkan; plus ringkasan akurasi & latency. Jalankan: python scripts/test_fieldfit_ml.py """ from __future__ import annotations import time from transformers import pipeline MODEL = "MoritzLaurer/mDeBERTa-v3-base-mnli-xnli" # Deskripsi tiap field sebagai label kandidat (Bahasa Indonesia). FIELD_LABELS = { "task": "tugas atau perintah utama yang harus dikerjakan AI", "context": "konteks, latar belakang, atau situasi", "references": "sumber rujukan, materi, atau referensi yang dipakai", "role": "peran atau persona yang harus diperankan AI", "audience": "target audiens atau pembaca hasil", "tone": "gaya bahasa atau nada penulisan", "constraints": "batasan, larangan, atau aturan yang harus dipatuhi", "outputFormat": "format atau struktur keluaran yang diinginkan", "example": "contoh hasil atau referensi keluaran", } LABELS = list(FIELD_LABELS.values()) DESC_TO_ID = {v: k for k, v in FIELD_LABELS.items()} HYP = "Bagian prompt ini berisi {}." # Kasus uji: (teks, field_diharapkan). Mewakili penempatan benar tiap field + # beberapa kasus salah-tempat yang seharusnya terdeteksi. CASES = [ # Penempatan benar (model idealnya memprediksi field yang sama) ("Buatkan rencana pelaksanaan pembelajaran tentang fotosintesis", "task"), ("Rangkum perbedaan sel hewan dan sel tumbuhan", "task"), ("Untuk kelas 7 SMP dengan durasi 80 menit, siswa belum pernah belajar topik ini", "context"), ("Gunakan buku paket IPA kelas 7 halaman 20 sampai 35 dan kurikulum merdeka", "references"), ("Kamu adalah seorang guru IPA yang berpengalaman mengajar SMP", "role"), ("Bertindaklah sebagai dokter spesialis anak", "role"), ("Ditujukan untuk siswa kelas 3 SD yang baru belajar membaca", "audience"), ("Gunakan bahasa yang ramah, santai, dan mudah dipahami", "tone"), ("Jangan lebih dari 500 kata dan hindari istilah teknis yang rumit", "constraints"), ("Sajikan dalam bentuk tabel dengan kolom tujuan, kegiatan, dan penilaian", "outputFormat"), ("Contoh: 1. Pendahuluan sepuluh menit berisi apersepsi tentang tumbuhan", "example"), # Kasus salah-tempat (akan diuji terhadap field yang SEHARUSNYA) ("Kamu adalah seorang ahli sejarah Indonesia", "role"), ("Tampilkan hasilnya sebagai poin-poin bernomor", "outputFormat"), ("Khusus untuk mahasiswa tingkat akhir", "audience"), ("Maksimal tiga paragraf saja", "constraints"), ] def main() -> None: print(f"Memuat zero-shot: {MODEL} (CPU) ...") t0 = time.time() clf = pipeline("zero-shot-classification", model=MODEL) print(f" model siap dalam {time.time()-t0:.1f}s\n") correct = 0 lat = [] print(f"{'EXPECTED':12} {'PRED':12} {'skor':>5} {'margin':>6} match teks") print("-" * 100) for text, expected in CASES: t1 = time.time() out = clf(text, LABELS, hypothesis_template=HYP, multi_label=False) lat.append(time.time() - t1) top_id = DESC_TO_ID[out["labels"][0]] top_score = out["scores"][0] margin = out["scores"][0] - out["scores"][1] ok = top_id == expected correct += ok print(f"{expected:12} {top_id:12} {top_score:5.2f} {margin:6.2f} " f"{' OK ' if ok else 'SALAH'} {text[:48]}") n = len(CASES) print("-" * 100) print(f"Akurasi field: {correct}/{n} = {correct/n*100:.0f}%") print(f"Latency per field: rata-rata {sum(lat)/len(lat)*1000:.0f} ms " f"(min {min(lat)*1000:.0f}, max {max(lat)*1000:.0f})") if __name__ == "__main__": main()