Template
146 lines
7.8 KiB
Markdown
146 lines
7.8 KiB
Markdown
# 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 |
|