Spaces:
Running
Running
| """ | |
| 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() | |