Prompt-Builder / scripts /test_fieldfit_ml.py
ArielJoe's picture
feat: cross-field ML field-fit + context-aware typo reranking; drop Completeness
f2f9311
Raw
History Blame Contribute Delete
4.02 kB
"""
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()