# Penjelasan Output Praktikum RAG (Lab 1 – Lab 3) Dokumen ini menjelaskan hasil eksekusi `lab1_chunking.py`, `lab2_indeks_cari.py`, dan `lab3_hit_at_k.py`. Alurnya berurutan: **memotong dokumen (Lab 1) → membangun indeks dan mencari (Lab 2) → mengukur kualitas pencarian (Lab 3)**. --- ## Lab 1 – Eksperimen Chunking ### Tujuan Memahami bagaimana dokumen PDF dipotong menjadi potongan kecil (*chunk*), dan bagaimana **ukuran chunk** serta **overlap** memengaruhi jumlah dan isi chunk. ### Langkah 1 – Membaca 500 karakter pertama Output menampilkan awal teks `pengantar_rag.pdf` (judul "Pengantar Retrieval-Augmented Generation (RAG)" dan definisi RAG). Baris ringkasan kualitas teks: ``` {'File': 'pengantar_rag.pdf', 'Total karakter': 4061, 'Karakter rusak (U+FFFD)': 0, 'Persentase huruf': '83%'} ``` | Metrik | Nilai | Arti | |---|---|---| | Total karakter | 4061 | Panjang seluruh teks hasil ekstraksi PDF | | Karakter rusak (U+FFFD) | 0 | Tidak ada karakter korup, jadi ekstraksi PDF berhasil bersih | | Persentase huruf | 83% | Sebagian besar isi adalah huruf; sisanya spasi, angka, tanda baca. Ini wajar untuk teks normal | **Kesimpulan:** PDF dapat dibaca dengan baik sehingga aman dipakai sebagai bahan chunking. ### Langkah 2 – Jumlah chunk untuk setiap kombinasi ukuran dan overlap | Ukuran | Overlap 10% | Overlap 15% | Overlap 20% | |---|---|---|---| | 500 | 9 chunk | 10 chunk | 10 chunk | | 1000 | 5 chunk | 5 chunk | 5 chunk | | 1500 | 3 chunk | 4 chunk | 4 chunk | Pola yang terlihat: 1. **Ukuran chunk makin besar → jumlah chunk makin sedikit.** Pada ukuran 500 ada 9–10 chunk, pada 1500 hanya 3–4 chunk. 2. **Overlap makin besar → jumlah chunk cenderung naik atau tetap.** Overlap membuat jarak geser antar chunk lebih pendek sehingga dibutuhkan lebih banyak chunk untuk menutup teks yang sama. Pada ukuran 1000 jumlahnya tetap 5 karena teks hanya 4061 karakter, jadi perubahan overlap kecil belum menambah chunk. 3. Ukuran chunk lebih berpengaruh daripada overlap terhadap jumlah chunk. ### Langkah 3 – Memeriksa 3 chunk acak (ukuran 500) Untuk tiap chunk ditampilkan penanda seperti: ``` chunk #1 [0:500] awal_tengah=False akhir_tengah=True potong_tabel=False ``` | Penanda | Arti | |---|---| | `[0:500]` | Chunk mengambil karakter ke-0 sampai ke-500 dari teks | | `awal_tengah` | `True` jika chunk **dimulai di tengah kata/kalimat** | | `akhir_tengah` | `True` jika chunk **berakhir di tengah kata/kalimat** | | `potong_tabel` | `True` jika chunk **memotong tabel** | Pada chunk #1, `akhir_tengah=True` terlihat dari teks yang berhenti di "...memungkinkan j" (kata terpotong). Ini menunjukkan **kelemahan chunking berbasis jumlah karakter**: batas chunk tidak mempedulikan batas kata atau kalimat, sehingga makna bisa terpotong. Overlap berguna untuk mengurangi dampak ini karena potongan yang terpotong muncul lagi di awal chunk berikutnya. --- ## Lab 2 – Membangun Indeks dan Mencari ### Tujuan Membangun indeks dari seluruh dokumen, lalu menguji apakah pertanyaan menemukan chunk yang benar. ### Langkah 1 – Membangun indeks ``` etika_keamanan_ai.pdf: 4 chunk machine_learning_dasar.pdf: 4 chunk pengantar_rag.pdf: 5 chunk Total 13 chunk | ukuran=1000 overlap=15% | backend=lsa ``` - Ada 3 dokumen, total **13 chunk**, dengan konfigurasi **ukuran 1000, overlap 15%**. - `backend=lsa` berarti pencarian memakai **LSA (Latent Semantic Analysis)**, yaitu representasi vektor berbasis statistik kata. Ini bukan model embedding neural seperti MiniLM. ### Langkah 2 – 5 pertanyaan uji Setiap pertanyaan menampilkan 3 hasil teratas dengan format `skor`, `dokumen#nomor_chunk`, dan `relevan`. - **skor** adalah kemiripan (cosine similarity) antara pertanyaan dan chunk. Makin dekat ke 1, makin mirip. - **relevan=True** berarti chunk tersebut memuat **kata kunci jawaban** yang sudah ditentukan. | Pertanyaan | Kata kunci | Hasil peringkat 1 | Penilaian | |---|---|---|---| | Siapa yang memperkenalkan RAG dan tahun berapa? | `Lewis`, `2020` | `pengantar_rag.pdf#0`, skor 0.741, **relevan** | Benar. Chunk berisi info Lewis dan 2020 | | Berapa dimensi embedding yang dihasilkan model MiniLM? | `384` | `pengantar_rag.pdf#1`, skor 0.969, **relevan** | Benar dan skornya sangat tinggi | | Apa itu overfitting dan apa cirinya? | `overfitting`, `data latih` | `machine_learning_dasar.pdf#0`, skor 0.939, **relevan** | Benar. Peringkat 2 juga relevan | | Undang-undang apa yang mengatur pelindungan data pribadi di Indonesia? | `27 Tahun 2022` | (terpotong di screenshot) | Cek hasilnya di terminal | Hal yang bisa dibaca dari hasil: - Jawaban yang benar umumnya berada di **peringkat 1** dengan selisih skor yang jelas dari hasil lainnya. Contoh: pertanyaan MiniLM, 0.969 dibanding 0.351. - Pada pertanyaan pertama, peringkat 2 (0.736, dokumen etika AI) skornya hampir sama dengan peringkat 1 (0.741) walaupun **tidak relevan**. Ini tanda LSA kadang bingung pada pertanyaan yang kosakatanya umum. - Hasil yang `relevan=False` di peringkat bawah itu normal. Yang penting jawaban benar ada di posisi atas. --- ## Lab 3 – Mengukur Kualitas dengan Hit@k ### Tujuan Mengukur secara kuantitatif apakah chunk jawaban benar muncul di **k hasil teratas**, lalu membandingkan dua ukuran chunk. ### Definisi **Hit@k** = proporsi pertanyaan yang chunk jawabannya muncul dalam k peringkat teratas. ``` Hit@k = (jumlah pertanyaan yang jawabannya ada di top-k) / (total pertanyaan) ``` Contoh: Hit@5 = 0.933 berarti 93,3% pertanyaan berhasil. Karena nilainya kelipatan 1/15, kemungkinan ada **15 pertanyaan uji**, dan **14 di antaranya berhasil**, sedangkan 1 gagal. ### Hasil perbandingan | Koleksi | Total chunk | Hit@1 | Hit@3 | Hit@5 | |---|---|---|---|---| | Ukuran 500, overlap 15% | 25 | 0.933 | 0.933 | 0.933 | | Ukuran 1000, overlap 15% | 13 | **1.0** | **1.0** | **1.0** | ### Diagnosis kegagalan (k=5) ``` ukuran 500, no. 7 (Bagaimana menyatukan ketepatan dan kelengkapan menjadi satu angka?): chunk jawaban ada tetapi baru muncul di peringkat 18 (> 5) ``` - Pertanyaan no. 7 gagal pada ukuran 500. Chunk jawabannya **ada** di indeks, tetapi **berada di peringkat 18**, jauh di luar top-5. - Pada ukuran 1000, tidak ada pertanyaan yang gagal. - Perhatikan bahwa Hit@1, Hit@3, dan Hit@5 pada ukuran 500 sama-sama 0.933. Artinya pertanyaan yang gagal tidak sekadar "hampir masuk", tetapi benar-benar jauh dari top-5. Memperbesar k tidak menolong. ### Dugaan penyebab (sesuai kesimpulan program) 1. **Ketidakcocokan kosakata.** Pertanyaan memakai istilah berbeda dari dokumen. Contoh: pertanyaan memakai "ketepatan dan kelengkapan", sedangkan dokumen memakai istilah Inggris seperti *precision* dan *recall* atau *F1*. LSA berbasis kata sehingga sulit menjembatani parafrase ini. 2. **Chunk kecil memuat sedikit konteks.** Chunk 500 karakter hanya memuat sedikit kata konteks, sehingga skor kemiripannya kalah dari chunk lain yang topiknya lebih umum. ### Kesimpulan dan catatan penting - **Ukuran 1000 karakter lebih baik** daripada 500 karakter pada eksperimen ini (Hit@k 1.00 dibanding 0.93). - Skor sempurna **jangan dianggap bukti sistem sudah sangat baik**. Korpusnya hanya 3 dokumen kecil (13–25 chunk) dengan topik yang jelas berbeda, sehingga pencarian relatif mudah. Pada PDF yang lebih besar dan topiknya lebih mirip antar dokumen, Hit@k diperkirakan turun dan perbedaan antar ukuran chunk akan lebih terlihat. - Laporan akhir tersimpan ke `Lab3_Hit_at_k.pdf`. --- ## Ringkasan Keseluruhan | Lab | Pertanyaan yang dijawab | Temuan utama | |---|---|---| | Lab 1 | Bagaimana ukuran dan overlap memengaruhi chunk? | Ukuran besar menghasilkan chunk lebih sedikit. Chunking karakter bisa memotong kata atau kalimat | | Lab 2 | Apakah pertanyaan menemukan chunk yang tepat? | Umumnya ya, jawaban benar di peringkat teratas dengan skor tinggi (backend LSA) | | Lab 3 | Ukuran chunk mana yang lebih baik? | Ukuran 1000 lebih baik (Hit@k = 1.0) daripada 500 (0.933), tetapi korpus kecil sehingga hasil perlu ditafsirkan hati-hati |