Pertemuan 10: RAG Part 1 - Embedding & Vector Database
Repositori ini berisi implementasi praktikum Retrieval-Augmented Generation (RAG) Bagian 1 untuk mata kuliah Kecerdasan Buatan (Artificial Intelligence). Proyek ini berfokus pada tahapan krusial sebelum generasi teks oleh LLM, yaitu: pemotongan teks (chunking), pembuatan vector embedding, penyimpanan ke dalam vector database (ChromaDB), pencarian semantik (semantic search), hingga evaluasi performa pengambilan dokumen menggunakan metrik $\text{Hit}@k$.
4. Penjelasan Kode (rag_lab_runner.py)
Skrip rag_lab_runner.py dibagi menjadi beberapa modul fungsional:
-
Fungsi Utilitas (
baca_pdf&potong):baca_pdf(path): Membaca seluruh halaman file PDF dan menggabungkannya menjadi satu string utuh.potong(teks, ukuran, tumpang): Memotong teks menjadi bagian-bagian (chunks) berukuran tetap (ukuran) dengan pergeseran karakter sebesar\text{step} = \text{ukuran} - \text{tumpang}untuk menjaga konteks antarpotongan (overlap).
-
Lab 1 (
run_lab1):- Mengekstrak teks dari salah satu dokumen (
Code of Conduct.pdf) dan membandingkan jumlah chunk yang dihasilkan pada tiga konfigurasi:(500, 50),(1000, 100), dan(1500, 150). - Melakukan inspeksi pemotongan kalimat (cutoff check) dengan memeriksa apakah suatu chunk diawali huruf kecil (
starts_mid) atau tidak diakhiri tanda baca akhir kalimat.!?(ends_mid).
- Mengekstrak teks dari salah satu dokumen (
-
Lab 2 (
setup_collection&run_lab2):- Membuat koleksi vektor di ChromaDB (
pedoman_500danpedoman_1000) menggunakan metrik cosine distance. - Menguji pencarian menggunakan 5 kueri standar (mengambil top-3 tetapi menampilkan hasil teratas beserta skor jaraknya) dan 2 kueri parafrase untuk menguji pemahaman semantik model ketika kata kunci eksak tidak digunakan.
- Membuat koleksi vektor di ChromaDB (
-
Lab 3 (
hit_at_k&run_lab3):- Mengevaluasi performa sistem menggunakan 15 pasangan kueri dan kata kunci target (
TEST_SET). - Menghitung nilai
\text{Hit}@kuntukk \in \{1, 3, 5\}dengan rumus:\text{Hit}@k = \frac{\text{Jumlah kueri yang kata kuncinya ditemukan pada top-}k\text{ chunks}}{\text{Total kueri pengujian } (N = 15)} - Menampilkan analisis kegagalan (Miss Analysis) pada kueri yang gagal ditemukan di urutan pertama (
k=1).
- Mengevaluasi performa sistem menggunakan 15 pasangan kueri dan kata kunci target (
5. Hasil Eksperimen & Pembahasan Output
Berikut adalah hasil eksekusi program di Windows PowerShell beserta analisis untuk masing-masing laboratorium.
Lab 1: Chunking Experiment
Pada tahap ini, program membaca file Code of Conduct.pdf yang memiliki total panjang 2.015 karakter.
Gambar 1: Pembacaan karakter awal PDF, perbandingan jumlah chunk pada 3 konfigurasi, dan sampel ukuran 500.
Gambar 2: Pemeriksaan kalimat terpotong (cutoff check) pada sampel ukuran 500, 1000, dan 1500.
Gambar 3: Detail akhir pemeriksaan sampel pada konfigurasi chunk 1500.
Analisis Hasil Lab 1:
-
Perbandingan Jumlah Chunk:
- Ukuran 500 (overlap 50): Menghasilkan 5 chunks.
- Ukuran 1000 (overlap 100): Menghasilkan 3 chunks.
- Ukuran 1500 (overlap 150): Menghasilkan 2 chunks.
- Semakin kecil ukuran chunk, semakin banyak jumlah potongan dokumen yang disimpan di database, namun informasi di tiap chunk menjadi lebih spesifik.
-
Fenomena Kalimat Terpotong (Truncated Sentences):
- Karena metode yang digunakan adalah fixed-size character chunking (memotong tepat pada hitungan karakter ke-
Ntanpa memedulikan batas kata atau kalimat), hampir seluruh sampel memiliki statusEnds mid-sentence=Truedan sebagian besarStarts mid-sentence=True. - Contoh nyata terlihat pada Chunk Size 500 Sample 1 yang terpotong tepat di tengah kata:
...Employees are ex, serta Sample 3 yang diawali potongan katast...dan diakhiri...softwar. - Solusi Mitigasi: Penggunaan overlap (
tumpang) sebesar 10% sangat membantu agar kata atau kalimat yang terbelah di ujung suatu chunk tetap utuh di bagian awal chunk berikutnya.
- Karena metode yang digunakan adalah fixed-size character chunking (memotong tepat pada hitungan karakter ke-
Lab 2: Build Index & Search
Pada Lab 2, pencarian dilakukan terhadap koleksi pedoman_500 (ukuran chunk 500 karakter). Jarak dihitung menggunakan Cosine Distance (semakin kecil nilai distance mendekati 0, semakin mirip/relevan dokumen tersebut dengan kueri).
Gambar 4: Hasil pengujian 5 kueri standar dan 2 kueri parafrase pada koleksi ChromaDB.
Analisis Hasil Lab 2:
-
Pengujian 5 Kueri Standar: Seluruh kueri standar berhasil memetakan pencarian ke dokumen PDF yang tepat dengan jarak cosine yang rendah (
0.3113hingga0.4653):- Kueri panjang password
\rightarrowData Protection Policy.pdf | chunk 2(distance: 0.3603), langsung memuat jawaban "at least 12 cha[racters]". - Kueri pelecehan & diskriminasi
\rightarrowCode of Conduct.pdf | chunk 1(distance: 0.3113- kemiripan tertinggi). - Kueri tempat penyimpanan data elektronik
\rightarrowData Protection Policy.pdf | chunk 1(distance: 0.3670).
- Kueri panjang password
-
Pengujian 2 Kueri Parafrase (Semantic vs Keyword):
- Kueri 1: "Can I log in using a free cafe internet connection?" (Target maksud: Kebijakan kerja jarak jauh / penggunaan VPN di Wi-Fi publik).
- Hasil: Mengambil
Remote Work Policy.pdf | chunk 3(distance: 0.6669). Meskipun di kueri menggunakan istilah "free cafe internet", model embedding memahami konteksnya berkaitan dengan remote work.
- Hasil: Mengambil
- Kueri 2: "What is the penalty if I take a second job or outside gig?" (Target maksud: Konflik kepentingan / sanksi pekerjaan sampingan).
- Hasil: Mengambil
Code of Conduct.pdf | chunk 4(distance: 0.6437) yang membahas sanksi mulai dari pelatihan wajib hingga pemutusan hubungan kerja (termination of employment).
- Hasil: Mengambil
- Skor jarak pada kueri parafrase (
\approx 0.64 - 0.66) lebih besar dibandingkan kueri standar (\approx 0.31 - 0.46) karena tidak adanya kesamaan leksikal (kata per kata), namun pencarian vektor tetap mampu mengarahkan ke dokumen yang berkaitan.
- Kueri 1: "Can I log in using a free cafe internet connection?" (Target maksud: Kebijakan kerja jarak jauh / penggunaan VPN di Wi-Fi publik).
Lab 3: Measure Hit@k Evaluation
Pada Lab 3, dilakukan pengujian kuantitatif menggunakan 15 kueri (TEST_SET) untuk membandingkan performa antara Collection (size=500) dan Collection (size=1000).
Gambar 5: Tabel hasil evaluasi metrik Hit@1, Hit@3, Hit@5 beserta analisis kegagalan (Miss Analysis) pada k=1.
Tabel Ringkasan Evaluasi \text{Hit}@k
| Collection | \text{Hit}@1 |
\text{Hit}@3 |
\text{Hit}@5 |
|---|---|---|---|
Collection (size=500) |
0.80 (12/15) |
1.00 (15/15) |
1.00 (15/15) |
Collection (size=1000) |
0.80 (12/15) |
0.93 (14/15) |
0.93 (14/15) |
Analisis Hasil Lab 3:
-
Perbandingan Ukuran Chunk (
500vs1000):- Pada $k=1$, kedua koleksi sama-sama mencapai akurasi
0.80(80\%), artinya 12 dari 15 pertanyaan langsung menemukan jawaban di urutan paling atas (top-1). - Pada
k=3dan $k=5$, koleksisize=500unggul mutlak dengan skor sempurna1.00(100\%), sedangkansize=1000tertahan di0.93(93\%). - Mengapa
size=500lebih baik? Chunk yang lebih kecil memiliki representasi vektor (embedding) yang lebih terfokus pada satu topik spesifik. Padasize=1000, satu chunk memuat banyak sub-bab sekaligus sehingga makna vektornya menjadi "tercampur" (diluted embedding), yang menyebabkan informasi spesifik lebih sulit menempati peringkat teratas.
- Pada $k=1$, kedua koleksi sama-sama mencapai akurasi
-
Analisis Kegagalan (Miss Analysis) pada
size=500saatk=1: Terdapat 3 kueri yang meleset di peringkat ke-1 (namun berhasil ditemukan ketika cakupan diperluas kek=3):- Miss 1:
'What is required before connecting to public Wi-Fi?'(Target:'VPN')- Penyebab: Top-1 justru mengambil
Data Protection Policy.pdftentang akses data umum, karena kata "connecting" dan "required" memiliki kedekatan semantik umum dengan aturan akses data. Potongan tentang VPN berada di urutan ke-2 atau ke-3.
- Penyebab: Top-1 justru mengambil
- Miss 2:
'What should be done with sensitive paper documents?'(Target:'shredded')- Penyebab: Kata "sensitive ... documents" sangat dominan beririsan dengan bagian awal aturan penyimpanan data di
Data Protection Policy.pdf(urutan ke-1), sementara instruksi penghancuran kertas (shredded) berada di chunk selanjutnya.
- Penyebab: Kata "sensitive ... documents" sangat dominan beririsan dengan bagian awal aturan penyimpanan data di
- Miss 3:
'What disciplinary actions can follow policy violations?'(Target:'termination')- Penyebab: Kueri ini mengambil
Code of Conduct.pdf | chunk 1tentang perilaku profesional di urutan pertama, sedangkan kata kunci'termination'berada di bagian akhir dokumen (chunk 4).
- Penyebab: Kueri ini mengambil
- Miss 1:
6. Kesimpulan
- Trade-off Ukuran Chunk: Metode fixed-size chunking dengan ukuran yang lebih kecil (
chunk_size=500,overlap=50) memberikan presisi pengambilan (retrieval) yang lebih tinggi (\text{Hit}@3 = 1.00) dibandingkan ukuran besar (chunk_size=1000,\text{Hit}@3 = 0.93) pada dokumen kebijakan yang padat informasi. - Kelemahan Fixed-Size Splitting: Pemotongan berbasis jumlah karakter murni sering membelah kata dan kalimat di tengah jalan (
Ends mid-sentence=True). Untuk pengembangan selanjutnya, metode ini dapat ditingkatkan menggunakan Recursive Character Text Splitter (memotong berdasarkan paragraf\n\n, kalimat., lalu spasi). - Pentingnya Nilai
kpada RAG: Mengandalkan hanya 1 dokumen teratas (k=1) berisiko kehilangan konteks penting (akurasi hanya80\%). Dengan mengatur parameter pengambilan kek=3(n_results=3), sistem berhasil mencapai cakupan informasi100\%untuk diteruskan ke Large Language Model (LLM).