Files
mf-kecerdasan-buatan-10/evaluasi_retrieval.py
T

79 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from main import koleksi_kecil, koleksi_besar
# Lab 3 — 15 pasangan (pertanyaan, kata/frasa kunci dari 2025 Pedoman Akademik-FT-S1 Informatika.pdf)
UJI = [
("Berapa beban SKS minimal untuk memperoleh gelar Sarjana di Program Studi Informatika?", "144"),
("Berapa jumlah SKS mata kuliah pilihan yang wajib ditempuh dalam Struktur Kurikulum Informatika?", "15 sks"),
("Berapa batas maksimum jumlah mata kuliah bernilai D yang diizinkan pada Prodi Informatika?", "4 matakuliah"),
("Sertifikat tes bahasa Inggris apa yang wajib diserahkan mahasiswa menjelang yudisium?", "EPT"),
("Berapa maksimal SKS mata kuliah pilihan lintas program studi yang diizinkan diambil mahasiswa?", "4 sks"),
("Apa kode mata kuliah Pendidikan Agama pada kelompok Matakuliah Pengembangan Kepribadian (MPK)?", "REL100"),
("Pada tahun berapa Program Studi Informatika Fakultas Teknik UKWMS resmi didirikan?", "2024"),
("Siapa nama Ketua Program Studi Informatika Fakultas Teknik UKWMS?", "Peter Rhatodirdjo Angka"),
("Siapa nama Rektor Universitas Katolik Widya Mandala Surabaya periode 2025 s/d 2029?", "Sumi Wijaya"),
("Di jalan apa lokasi Kampus Kalijudan Fakultas Teknik Program Studi Informatika UKWMS?", "Kalijudan 37"),
("Berapa syarat minimal SKS yang sudah ditempuh untuk memprogram mata kuliah Kerja Praktik (INF400)?", "96 sks"),
("Berapa syarat minimal SKS yang sudah ditempuh untuk mengambil Tugas Akhir (INF498) di semester VIII?", "110 sks"),
("Berapa jumlah SKS yang dapat diambil mahasiswa pada luar Program Studi dalam 1 semester Pertukaran Pelajar?", "20 sks"),
("Berapa jam kegiatan total yang setara dengan 20 SKS pada kegiatan Magang MBKM?", "907 jam"),
("Perguruan tinggi mana di Taiwan yang menjalin kerja sama Joint Degree Program dengan Fakultas Teknik?", "Taiwan Tech"),
]
def hit_at_k(uji, k=3, target_koleksi=koleksi_kecil):
if not uji:
return 0.0
benar = 0
for pertanyaan, kunci in uji:
docs = target_koleksi.query(query_texts=[pertanyaan], n_results=k)["documents"][0]
if any(kunci.lower() in d.lower() for d in docs):
benar += 1
return benar / len(uji)
def tampilkan_detail_gagal(uji, k, target_koleksi, nama_koleksi):
gagal = []
for pertanyaan, kunci in uji:
docs = target_koleksi.query(query_texts=[pertanyaan], n_results=k)["documents"][0]
if not any(kunci.lower() in d.lower() for d in docs):
gagal.append((pertanyaan, kunci))
if gagal:
print(f"\nPertanyaan yang gagal pada {nama_koleksi} (Hit@{k}):")
for p, kw in gagal:
print(f" - {p} (kunci: '{kw}')")
else:
print(f"\nSemua pertanyaan berhasil ditemukan pada {nama_koleksi} untuk Hit@{k}!")
KESIMPULAN = """
KESIMPULAN EVALUASI (LAB 3):
1. Pada dokumen Pedoman Akademik S1 Informatika UKWMS (135 halaman), ukuran chunk 500 karakter jauh lebih unggul pada Hit@3 (0.73 vs 0.53) dan Hit@5 (0.80 vs 0.60) dibandingkan ukuran chunk 1500 karakter.
2. Hal ini terjadi karena model paraphrase-multilingual-MiniLM-L12-v2 memiliki batas input maksimum 128 token (sekitar 500–600 karakter), sehingga pada chunk 1500 karakter informasi di bagian tengah hingga akhir chunk tidak ikut ter-encode ke dalam vektor embedding.
3. Kegagalan pada Hit@1 (skor 0.47) umumnya terjadi pada pertanyaan yang jawabannya terletak di dalam tabel kurikulum/silabus (seperti prasyarat 96 sks untuk Kerja Praktik INF400 dan 110 sks untuk Tugas Akhir INF498) atau daftar struktur personalia (Ketua Prodi dan alamat kampus).
4. Dugaan penyebabnya adalah format tabel PDF yang terpisah barisnya saat diekstrak pypdf serta banyaknya halaman silabus yang mengulang frasa serupa ("Program Studi Informatika", "Deskripsi Matakuliah"), sehingga pengambilan k=3 hingga k=5 dengan ukuran chunk 500 karakter sangat disarankan untuk sistem RAG.
""".strip()
if __name__ == "__main__":
if koleksi_kecil.count() == 0 or koleksi_besar.count() == 0:
print("Koleksi evaluasi masih kosong. Jalankan `python main.py` terlebih dahulu setelah mengisi folder `dokumen/`.")
else:
print("=" * 70)
print("LAB 3 — EVALUASI HIT@K PADA DUA UKURAN CHUNK BERBEDA")
print("=" * 70)
print(f"Jumlah pertanyaan uji: {len(UJI)}\n")
print(f"{'Metrik':<10} | {'Chunk 500 (Overlap 75)':<25} | {'Chunk 1500 (Overlap 225)':<25}")
print("-" * 66)
for k in (1, 3, 5):
skor_500 = hit_at_k(UJI, k=k, target_koleksi=koleksi_kecil)
skor_1500 = hit_at_k(UJI, k=k, target_koleksi=koleksi_besar)
print(f"Hit@{k:<6} | {skor_500:<25.2f} | {skor_1500:<25.2f}")
tampilkan_detail_gagal(UJI, k=1, target_koleksi=koleksi_kecil, nama_koleksi="Chunk 500")
tampilkan_detail_gagal(UJI, k=1, target_koleksi=koleksi_besar, nama_koleksi="Chunk 1500")
print("\n" + "=" * 70)
print(KESIMPULAN)
print("=" * 70)