diff --git a/Dokumentasi_Output_Lab.docx b/Dokumentasi_Output_Lab.docx index 8f445c0..974aa81 100644 Binary files a/Dokumentasi_Output_Lab.docx and b/Dokumentasi_Output_Lab.docx differ diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index 10f1bbd..a82cdbd 100644 Binary files a/__pycache__/main.cpython-312.pyc and b/__pycache__/main.cpython-312.pyc differ diff --git a/chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/length.bin b/chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/length.bin deleted file mode 100644 index 2531fb0..0000000 Binary files a/chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/length.bin and /dev/null differ diff --git a/chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/data_level0.bin b/chroma_db/3445604f-489e-4236-bee7-7f24f600b245/data_level0.bin similarity index 100% rename from chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/data_level0.bin rename to chroma_db/3445604f-489e-4236-bee7-7f24f600b245/data_level0.bin diff --git a/chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/header.bin b/chroma_db/3445604f-489e-4236-bee7-7f24f600b245/header.bin similarity index 100% rename from chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/header.bin rename to chroma_db/3445604f-489e-4236-bee7-7f24f600b245/header.bin diff --git a/chroma_db/686a47f5-9719-4b1a-888c-8e289fe408d7/length.bin b/chroma_db/3445604f-489e-4236-bee7-7f24f600b245/length.bin similarity index 100% rename from chroma_db/686a47f5-9719-4b1a-888c-8e289fe408d7/length.bin rename to chroma_db/3445604f-489e-4236-bee7-7f24f600b245/length.bin diff --git a/chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/link_lists.bin b/chroma_db/3445604f-489e-4236-bee7-7f24f600b245/link_lists.bin similarity index 100% rename from chroma_db/0afb79e6-2dff-4c34-b538-037b57c0e8a3/link_lists.bin rename to chroma_db/3445604f-489e-4236-bee7-7f24f600b245/link_lists.bin diff --git a/chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/length.bin b/chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/length.bin deleted file mode 100644 index 07d81df..0000000 Binary files a/chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/length.bin and /dev/null differ diff --git a/chroma_db/686a47f5-9719-4b1a-888c-8e289fe408d7/data_level0.bin b/chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/data_level0.bin similarity index 100% rename from chroma_db/686a47f5-9719-4b1a-888c-8e289fe408d7/data_level0.bin rename to chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/data_level0.bin diff --git a/chroma_db/686a47f5-9719-4b1a-888c-8e289fe408d7/header.bin b/chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/header.bin similarity index 100% rename from chroma_db/686a47f5-9719-4b1a-888c-8e289fe408d7/header.bin rename to chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/header.bin diff --git a/chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/length.bin b/chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/length.bin new file mode 100644 index 0000000..d0a9dc2 Binary files /dev/null and b/chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/length.bin differ diff --git a/chroma_db/686a47f5-9719-4b1a-888c-8e289fe408d7/link_lists.bin b/chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/link_lists.bin similarity index 100% rename from chroma_db/686a47f5-9719-4b1a-888c-8e289fe408d7/link_lists.bin rename to chroma_db/c78c1135-1401-44cc-8911-6941151e7ef2/link_lists.bin diff --git a/chroma_db/chroma.sqlite3 b/chroma_db/chroma.sqlite3 index b9380c8..08c1632 100644 Binary files a/chroma_db/chroma.sqlite3 and b/chroma_db/chroma.sqlite3 differ diff --git a/chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/data_level0.bin b/chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/data_level0.bin similarity index 100% rename from chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/data_level0.bin rename to chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/data_level0.bin diff --git a/chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/header.bin b/chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/header.bin similarity index 100% rename from chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/header.bin rename to chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/header.bin diff --git a/chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/length.bin b/chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/length.bin new file mode 100644 index 0000000..719758b Binary files /dev/null and b/chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/length.bin differ diff --git a/chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/link_lists.bin b/chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/link_lists.bin similarity index 100% rename from chroma_db/b200ee9e-978b-4ad9-9cca-8215ffdd6dbf/link_lists.bin rename to chroma_db/decdca6c-990f-4465-8464-0da70fcacef8/link_lists.bin diff --git a/evaluasi_retrieval.py b/evaluasi_retrieval.py index 7c59237..c102894 100644 --- a/evaluasi_retrieval.py +++ b/evaluasi_retrieval.py @@ -1,22 +1,22 @@ from main import koleksi_kecil, koleksi_besar -# Lab 3 — 15 pasangan (pertanyaan, kata/frasa kunci yang HARUS ada di chunk jawaban yang benar) +# Lab 3 — 15 pasangan (pertanyaan, kata/frasa kunci dari 2025 Pedoman Akademik-FT-S1 Informatika.pdf) UJI = [ - ("Apa syarat cuti akademik?", "cuti akademik"), - ("Berapa batas kehadiran untuk ujian?", "75 persen"), - ("Berapa maksimal cuti akademik selama masa studi?", "2 semester"), - ("Kapan batas pengajuan cuti akademik dilakukan?", "2 minggu"), - ("Berapa SKS maksimal jika IP semester sebelumnya 3.20?", "24 SKS"), - ("Berapa SKS minimal untuk kelulusan program sarjana?", "144 SKS"), - ("Apa syarat IPK minimal untuk lulus program sarjana?", "2.00"), - ("Berapa lama masa studi maksimal program sarjana?", "14 semester"), - ("Berapa SKS minimal yang harus ditempuh untuk mengambil skripsi?", "110 SKS"), - ("Berapa syarat nilai minimal mata kuliah Metodologi Penelitian?", "nilai C"), - ("Berapa kali bimbingan minimal sebelum sidang skripsi?", "8 kali"), - ("Apa sanksi bagi mahasiswa yang melakukan kecurangan ujian?", "nilai E"), - ("Berapa lama waktu ujian susulan dapat diajukan setelah jadwal?", "3 hari"), - ("Berapa nilai minimal untuk mendapatkan predikat Cum Laude?", "3.51"), - ("Berapa persentase maksimal kemiripan turnitin untuk naskah skripsi?", "20 persen"), + ("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"), ] @@ -47,10 +47,10 @@ def tampilkan_detail_gagal(uji, k, target_koleksi, nama_koleksi): KESIMPULAN = """ KESIMPULAN EVALUASI (LAB 3): -1. Ukuran chunk kecil (500 karakter) umumnya menghasilkan Hit@1 yang lebih presisi untuk pertanyaan spesifik (seperti angka SKS atau batas persentase), karena vektor embedding tidak terdilusi oleh topik lain di dalam satu chunk yang terlalu panjang. -2. Sebaliknya, ukuran chunk besar (1500 karakter) unggul pada Hit@3 dan Hit@5 ketika kata kunci jawaban berada agak jauh dari kalimat topik utamanya, namun rentan menurunkan akurasi Hit@1 karena satu chunk menggabungkan beberapa sub-pasal sekaligus. -3. Kegagalan retrieval biasanya terjadi pada pertanyaan yang jawabannya terpotong tepat di batas chunk (boundary split) atau pertanyaan yang menggunakan angka/istilah singkat yang mirip antar-pasal (misalnya angka semester atau SKS). -4. Solusi untuk meningkatkan performa di proyek RAG adalah menggunakan chunking berbasis struktur kalimat/paragraf dengan ukuran moderat (500–800 karakter) dan overlap 10–20% serta mengambil k=3 hingga k=5 chunk teratas. +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() diff --git a/main.py b/main.py index 9e1a3b3..7f112d7 100644 --- a/main.py +++ b/main.py @@ -60,7 +60,7 @@ def eksperimen_chunking(folder="dokumen"): print("=" * 70) print("\n[1] 500 Karakter Pertama:") print("-" * 70) - print(teks[:500]) + print(teks.lstrip()[:500]) print("-" * 70) # Tiga pengaturan ukuran chunk (500, 1000, 1500) dengan overlap 15% (antara 10-20%) diff --git a/search.py b/search.py index 7d1a72e..e560310 100644 --- a/search.py +++ b/search.py @@ -1,20 +1,20 @@ from main import koleksi -# Lab 2 — 5 Pertanyaan langsung sesuai isi dokumen +# Lab 2 — 5 Pertanyaan langsung sesuai isi Pedoman Akademik FT S1 Informatika UKWMS 2025 PERTANYAAN_UTAMA = [ - "Apa syarat cuti akademik?", - "Berapa batas kehadiran minimal untuk mengikuti ujian akhir semester?", - "Berapa beban maksimal SKS yang dapat diambil dalam satu semester?", - "Apa syarat IPK minimal untuk mengambil mata kuliah Skripsi?", - "Berapa lama batas waktu maksimal masa studi program sarjana?", + "Berapa beban SKS minimal yang harus diselesaikan untuk memperoleh gelar Sarjana di Program Studi Informatika?", + "Apa saja persyaratan untuk kelulusan tahap akhir mahasiswa Program Studi Informatika?", + "Berapa syarat SKS minimal yang harus ditempuh untuk mengambil mata kuliah Kerja Praktik (INF400)?", + "Bagaimana pengaturan beban SKS dan kesetaraan jam kegiatan dalam program Magang MBKM?", + "Apa saja Matakuliah Pengembangan Kepribadian (MPK) yang wajib diprogram oleh mahasiswa UKWMS?", ] # Lab 2 — 2 Pertanyaan dengan kata berbeda dari teks dokumen (parafrase) PERTANYAAN_PARAFRASE = [ - # Parafrase dari "cuti akademik" -> "berhenti kuliah sementara waktu" - "Bagaimana prosedur jika mahasiswa ingin berhenti kuliah sementara waktu?", - # Parafrase dari "batas kehadiran 75 persen untuk ujian" -> "jarang masuk kelas apakah boleh ikut UAS" - "Jika mahasiswa sering absen kelas, berapa minimal presensi supaya tetap diizinkan ikut UAS?", + # Parafrase dari "Matakuliah Lintas Program studi ... maksimal 4 sks" + "Jika mahasiswa ingin mengambil kuliah pilihan di jurusan atau fakultas lain di UKWMS, berapa batas kredit maksimal yang diperbolehkan?", + # Parafrase dari "English Proficiency Test (EPT) ... wajib menyerahkan sertifikat EPT menjelang yudisium" + "Tes kemampuan bahasa asing apa yang sertifikatnya wajib dikumpulkan mahasiswa sebagai syarat sebelum mengikuti yudisium?", ]