79 lines
5.0 KiB
Python
79 lines
5.0 KiB
Python
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)
|
||
|