Files
Rag_Kecerdasan_Buatan/README.md
T
2026-11-02 10:51:23 +07:00

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