# Final Report: Modular Retrieval Benchmark Pipeline & Semantic Accuracy Analysis

## 1. Judul
**Laporan Eksekusi Akhir: Implementasi Skrip Benchmark Retrieval Modular dengan Pengukuran Performa Komputasi Vektor dan Analisis Akurasi Semantik**

## 2. Tanggal
Rabu, 13 Mei 2026

## 3. Deskripsi
Dokumen ini merupakan Laporan Final yang mendokumentasikan keseluruhan hasil eksekusi dari rancangan `retrieval_benchmark_plan.md`. Pada tahap ini, repositori telah dilengkapi dengan skrip *benchmarking* mandiri (`benchmark_retrieval.py`) yang bertugas menguji fungsi pencarian vektor `SemanticRetriever` dari modul utama aplikasi. Skrip ini mengambil *output* JSON dari tahapan *Chunking*, melakukan komputasi *embedding* menggunakan model lokal `all-MiniLM-L6-v2`, dan mencari kecocokan dengan 5 pilar kueri. Fokus utama dari skrip ini adalah menciptakan infrastruktur pengujian yang dapat menghasilkan metrik performa komputasi (Waktu, CPU, RAM) dan artefak inspeksi visual (Markdown) untuk mengevaluasi kualitas pengambilan (*retrieval*) tanpa mengganggu basis kode utama atau mengonsumsi kuota API berbayar.

## 4. Metodologi (Isolated Testing & Dual Output Strategy)
Pengujian fase *Retrieval* ini dibangun di atas prinsip berikut:
1. **Isolated In-Memory Computing:** Komputasi *embedding* dan perhitungan *Cosine Similarity* dieksekusi murni di dalam memori (*RAM/numpy*) menggunakan model *SentenceTransformer* lokal. Menghilangkan kebutuhan *database* vektor eksternal demi portabilitas pengujian.
2. **Hybrid Verification:** Karena tidak menggunakan *LLM-as-a-judge* untuk menghemat biaya dan mempercepat iterasi, sistem menghasilkan skor matematis (*Cosine Similarity*) bersamaan dengan berkas Markdown yang berisi teks aktual dari *Top 3 Chunks*. Ini memungkinkan verifikasi manual oleh manusia (*Human-in-the-loop*).
3. **Fail-Safe Logging:** Penulisan hasil pemantauan *hardware* (menggunakan `psutil`) dilakukan dengan metode *append-only* ke dalam tabel Markdown untuk memastikan pelestarian metrik jika terjadi gangguan di tengah *batch processing*.
4. **Non-Invasive Instrumentation:** Melakukan pembungkusan (*Wrapper*) pada fungsi `SemanticRetriever` untuk mengekstraksi nilai skor dan waktu komputasi tanpa mengubah kelas aslinya di `app/services/`.

## 5. Keputusan (Decision Log) yang Terealisasi
1. **Pemisahan Artifact:** Output dibagi dua: `.json` untuk menyimpan struktur hierarki komputasi mesin, dan `.md` untuk dibaca oleh insinyur *Quality Assurance*.
2. **Bypass Cloud Embedding:** Tetap mempertahankan penggunaan model lokal (`all-MiniLM-L6-v2`) untuk *benchmark* ini karena upaya penggunaan API komersial (`text-embedding-3-small`) sebelumnya terbukti selalu membentur batas kecepatan (*Rate Limit / RPM*) saat harus memproses ratusan hingga ribuan *Child Chunks* secara beruntun.
3. **Pengukuran AVG Score per Pilar:** Matriks performa dirancang untuk memuat nilai rata-rata kemiripan dari *Top 3* dari kelima pilar dalam satu sel (format `BG / MET / GAP / OBJ / FUT`) untuk analisis *bird-eye view*.

## 6. Alur Diagram Arsitektur
```mermaid
flowchart TD
    classDef init fill:#e3f2fd,stroke:#1565c0,stroke-width:2px;
    classDef logic fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px;
    classDef io fill:#fff3e0,stroke:#f57c00,stroke-width:2px;

    Start["Mulai Benchmark Retrieval"]:::init --> InitDirs["Inisialisasi Direktori Output, Matrix, Error"]:::init
    InitDirs --> ReadJSON["Baca File JSON dari Output-Chunking/"]:::io
    ReadJSON --> SetupModel["Load SemanticRetriever & SentenceTransformer"]:::logic
    SetupModel --> TimerEmbed["Mulai Timer Embed"]:::logic
    TimerEmbed --> RunEmbed["Embed Child Chunks ke Vector"]:::logic
    RunEmbed --> TimerSearch["Stop Timer Embed, Mulai Timer Search"]:::logic
    TimerSearch --> CallRetriever["Panggil find_top_k_parents (top_k=3)"]:::logic
    
    CallRetriever -- Sukses --> CalcScore["Hitung Cosine Similarity & Rata-rata Skor per Pilar"]:::logic
    CalcScore --> MatchParents["Cocokkan ID dengan Teks Parent Chunks Asli"]:::logic
    MatchParents --> WriteMD["Tulis Output Human Verification (.md)"]:::io
    WriteMD --> WriteJSONOut["Tulis Output Programmatic (.json)"]:::io
    WriteJSONOut --> EndProfiler["Hentikan Timer Search & Catat Akhir RAM/CPU"]:::logic
    EndProfiler --> WriteMatSucc["Append Baris Matriks ke performance_matrix_retrieval.md"]:::io
```

## 7. Bukti Eksekusi (Struktur Folder)
```text
/home/daegir/Documents/PERCOBAAN/backend-sre(prompt-modularization-v3)/backend-sre/
├── scripts/
│   └── Testing-Pipeline/
│       ├── benchmark_parsing.py            
│       ├── benchmark_chunking.py           
│       └── benchmark_retrieval.py          # Skrip utama benchmarking Retrieval
├── archive/
│   └── Testing-Pipeline/
│       └── benchmark-retrieval/
│           ├── Perform-Matrix/
│           │   └── performance_matrix_retrieval.md # Rekaman metrik
│           ├── Log-Error/                          # Kosong (tidak ada error)
│           ├── Output-JSON/                        # Format struktural 
│           │   ├── RAGAS..._retrieval_results.json
│           │   └── SciLit..._retrieval_results.json
│           └── Output-Human-Verification/          # Hasil untuk dibaca Manusia
│               ├── RAGAS..._human_verification.md
│               └── SciLit..._human_verification.md
└── Markdown/
    └── Testing-Pipeline/
        └── Retrieval-Benchmark/
            ├── Plan/
            │   └── retrieval_benchmark_plan.md
            ├── Execution-Log/
            │   ├── Task_1_Execution.md
            │   ├── Task_2_Execution.md
            │   └── Task_3_Execution.md
            └── Report/
                └── Final_Report_Retrieval_Benchmark.md # Laporan Final INI
```

## 8. Tabel Metriks Kinerja Aktual
Uji coba dilakukan pada 2 set artefak JSON (*RAGAS* dan *SciLit*). Profil performa membuktikan efisiensi pencarian `numpy` dengan biaya memori tinggi untuk memuat model NLP.

| TIMESTAMP | DOCUMENT | CHUNKS EMBEDDED | EMBED TIME (s) | SEARCH TIME (s) | AVG SCORE (BG/MET/GAP/OBJ/FUT) | RAM | CPU | STATUS | NOTE |
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: | :--- | :--- |
| 2026-05-14 16:52:32 | RAGAS_Automated_Evaluatio... | 240 | 3.37 | 0.01 | 0.26 / 0.38 / 0.27 / 0.33 / 0.28 | 874.8 MB | 385.6 % | Success | - |
| 2026-05-14 16:52:36 | SciLit_Joint_Literature_D... | 333 | 5.78 | 0.01 | 0.24 / 0.36 / 0.30 / 0.27 / 0.27 | 898.1 MB | 395.8 % | Success | - |

*(Waktu Search nyaris instan ~0.01 detik, namun Embed Time memakan 3-6 detik dengan beban RAM nyaris menembus 1 GB).*

## 9. Temuan Kritis (Findings): Masalah Akurasi Semantik
Meskipun infrastruktur skrip berjalan sempurna, analisis pasca-pengujian pada dokumen `_human_verification.md` menunjukkan bahwa **hasil Retrieval secara semantik sangat buruk dan tidak koheren**. 

*Contoh Kasus:* Kueri pencarian *Methodology* justru memicu penarikan teks dari bab *Conclusion* dan *References*, alih-alih bab evaluasi. Nilai rata-rata skor (*AVG SCORE*) pada matriks yang hanya berkisar **0.24 - 0.38** secara matematis memperkuat rendahnya tingkat keyakinan (confidence) dari model.

### Analisis Akar Masalah (Root Cause)
1. **Disonansi Bahasa (Bilingual Query):** Teks kueri mencampur bahasa Indonesia dan Inggris (contoh: *"Metode, pendekatan, arsitektur... Methodology, proposed method..."*). Karena `all-MiniLM-L6-v2` adalah model bahasa Inggris murni, pemaksaan *keyword* bahasa Indonesia melemahkan kepekatan representasi vektor.
2. **Keyword Stuffing vs Natural Query:** Dense Retrieval Model dilatih untuk mencocokkan pola semantik kalimat alami, bukan untaian kata kunci yang dibariskan (*keyword stuffing*). Hal ini membuat model kehilangan pemahaman kontekstual terhadap niat pencarian (*search intent*).
3. **Dimensi Model vs Kompleksitas Akademik:** Penggunaan `all-MiniLM-L6-v2` (384-dimensi) terindikasi terlalu lemah untuk memisahkan nuansa yang sangat dekat di dalam literatur akademik kompleks (misalnya membedakan mana yang merupakan referensi jurnal tentang metodologi, dan mana yang metodologi aktual).

### Rencana Tindak Lanjut (Future Improvement)
Karena infrastruktur pengujian (*Testing Script*) sudah selesai dan beroperasi dengan tangguh, maka pemecahan masalah kualitas *retrieval* ini akan ditangani pada inisiatif perbaikan arsitektur selanjutnya. Rekomendasi solusi mencakup:
1. **Prompt Tuning:** Mengganti kueri bilingual menjadi bahasa Inggris murni yang diformat sebagai pertanyaan natural (contoh: *"What is the main methodology, system architecture, or experimental setup used in this study?"*).
2. **Evaluasi Penggunaan API Eksternal:** `text-embedding-3-small` terbukti lebih cerdas namun terganjal isu *Rate Limit (RPM)* karena proses *batching* Child Chunks. Perbaikan ke depan dapat mencakup implementasi *Exponential Backoff* yang lebih agresif atau *Chunk Batching* agar bisa menggunakan API OpenAI.
3. **Pembaruan Model Lokal:** Apabila kuota API menjadi penahan (blocker), direkomendasikan bermigrasi dari `MiniLM` ke varian lokal yang lebih bertenaga namun ramah memori seperti `BAAI/bge-small-en-v1.5`.

## 10. Kesimpulan Final
Infrastruktur modular untuk tahapan uji *Retrieval* telah terbangun dengan sukses dan sangat informatif. Skrip `benchmark_retrieval.py` sanggup menguji *SemanticRetriever* dengan memisahkan instrumen pemantauan (Memory, Time, Score) ke dalam artefak ganda secara *append-only*. Meskipun pengujian ini menyingkap kegagalan fatal pada kualitas tarikan data (akurasi semantik yang buruk akibat *diluted query* dan keterbatasan model lokal), terungkapnya masalah ini secara kasat mata adalah bukti sahih bahwa infrastruktur *benchmark* yang dibangun benar-benar efektif menjalankan tugas auditnya.

## 11. Indikator Eksekusi Keseluruhan Task
Seluruh rangkaian tugas dari `retrieval_benchmark_plan.md` telah diselesaikan.

- [x] **Task 1 (Preparation):** Penciptaan hierarki direktori *output* bersarang.
- [x] **Task 2 (Scripting):** Konstruksi kode dengan prinsip *No-Mutation*, enkapsulasi I/O format ganda (*JSON & Markdown*), dan penyuntikan metrik profil.
- [x] **Task 3 (Execution):** Eksekusi massal terhadap artifak hasil Chunking yang berjalan mulus tanpa kendala OOM (*Out Of Memory*).
- [x] **Task 4 (Reporting):** Penyusunan Final Report ini, yang mengurai detail temuan kritis terkait kegagalan representasi vektor.
