# Final Report: Optimasi Multilingual Retrieval & Implementasi Kueri Semantik Kepadatan Jangkar (V3)
# Datetime: 15-05-2026

## 1. Executive Synopsis
Proyek ini sukses menyelesaikan masalah akurasi pencarian (*retrieval*) pada literatur akademik dwibahasa dengan mengganti model *embedding* inti ke `intfloat/multilingual-e5-small`. Melalui serangkaian pengujian (*benchmark*), terbukti bahwa model *dense retriever* sering kali terdistraksi oleh gaya bahasa jurnal yang tidak beraturan serta polusi data mentah (seperti *acknowledgment*, daftar pustaka, dan residu tabel OCR). Sebagai solusi, kami membuang kueri berbasis tanya-jawab (Metode A) dan *pseudo-answer* (Metode B), lalu mengadopsi **Metode C (The Anchor-Density Strategy)** yang menggunakan kata benda teknis padat (*Lexical Anchors*). Keberhasilan ini juga dicapai dengan merancang **Data Purification Layer V2** yang sangat agresif untuk menghancurkan *noise* data sebelum masuk ke ruang semantik vektor.

## 2. Methodology
1. **Model Swap & Prefix Injection:** Migrasi ke model E5-Small dengan mengimplementasikan injeksi *prefix* `query:` dan `passage:` secara *on-the-fly* pada saat komputasi *embedding* untuk mencegah eksploitasi *prompt* di LLM hilir.
2. **Token Limit Guard:** Menerapkan pembatasan karakter (1500 karakter ~ 512 token) secara manual sebelum masuk ke *tokenizer* E5 untuk mencegah *silent truncation* yang bisa merusak kalkulasi vektor.
3. **Offline Benchmarking:** Mengisolasi seluruh eksperimen kueri ke dalam skrip pengujian (`benchmark_retrieval_c.py`) agar `ingestion.py` utama tidak terkontaminasi selama masa pencarian kueri terbaik.
4. **Aggressive Data Purification:** Mengimplementasikan penyaring luring yang menggunakan daftar *blacklist header* yang diperluas, ditambah dengan aturan heuristik RegEx untuk membunuh paragraf yang berisi ucapan terima kasih, pola sitasi kurung siku, dan tabel data mentah OCR.

## 3. Strategic Decider (Decision Log)
| Option/Decision | Alternatives | Rationale | Status |
| :--- | :--- | :--- | :--- |
| Migrasi ke `intfloat/multilingual-e5-small` | Bertahan di `all-MiniLM-L6-v2` | MiniLM buta terhadap struktur dwibahasa dan hanya optimal untuk Bahasa Inggris murni. E5-Small unggul di MTEB dengan dimensi yang sama (384D). | Done |
| Prefix Injection (`query:` / `passage:`) pada saat Runtime | Hardcode di struktur JSON raw data | Mencegah polusi prefix saat kumpulan *Parent Chunks* disatukan (stuffed) dan dikirim ke LLM hilir (Qwen). | Done |
| Kueri Metode C (Anchor-Density) | Metode A (Q&A) atau Metode B (HyDE statis) | Metode A dan B gagal menangkap pilar Gap dan Future Work. Berdasarkan riset ilmiah, Metode C membombardir *dense retriever* dengan kumpulan kata kunci teknis (*Lexical Anchors*), meringankan beban kognitif model 384D. | Done |
| Data Purification V2 (Agresif) | Filter Header Biasa | Keterbatasan pengenalan *header* menyebabkan kebocoran *Acknowledgments* dan *References*. Purifikasi V2 menginterogasi isi paragraf untuk menemukan pola daftar pustaka terselubung dan menghancurkannya. | Done |

## 4. Bug Fixing & Risk Mitigation
| ID | Deskripsi | Severity | Status |
| :--- | :--- | :--- | :--- |
| BUG-QO3-01 | Silent Truncation akibat batasan 512 token pada model E5. Vektor dihitung tidak akurat. | High | Fixed (Diberikan limit manual 1500 chars). |
| BUG-QO3-02 | *Noise* "Acknowledgments" dan "Teks Gambar OCR" masuk ke vektor, mendistorsi hasil *Cosine Similarity*. | High | Fixed (Data Purification Layer V2 dengan RegEx Agresif). |
| BUG-QO3-03 | Penggunaan kueri berbasis kalimat/deklaratif melemahkan daya tarik ruang vektor pada dokumen ilmiah yang padat. | Medium | Fixed (Adopsi Metode C: Anchor-Density). |

## 5. System Architecture
### 5.1 Alur Diagram Arsitektur
```mermaid
flowchart TD
    classDef test fill:#fff3e0,stroke:#f57c00,stroke-width:2px;
    classDef logic fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px;
    
    A[Child Chunks JSON] --> P[Data Purification V2: Anti-Refs, OCR, & Affiliations]:::logic
    P --> B[Prefix Injection 'passage: ']:::logic
    B --> C[Truncate to Token Limit Guard]:::logic
    C --> D[E5-Small Model Embedding]:::logic
    
    Q["5 Kueri Pilar: Metode C <br> (Lexical Anchors)"] --> E[Prefix Injection 'query: ']:::logic
    E --> F[E5-Small Model Embedding]:::logic
    
    D --> S{Cosine Similarity & Top-K=3}:::logic
    F --> S
    
    S --> T["benchmark_retrieval_c.py<br>Evaluasi Kinerja Metode C"]:::test
```

### 5.2 Final Folder Structure
```text
/home/daegir/Documents/PERCOBAAN/backend-sre(prompt-modularization-v3)/backend-sre/
├── app/
│   └── services/
│       └── parser/
│           └── semantic_retriever.py 
├── scripts/
│   └── Testing-Pipeline/
│       └── benchmark_retrieval_c.py
├── archive/
│   └── Testing-Pipeline/
│       └── benchmark-retrieval/
│           ├── Log-Error/
│           ├── Output-Human-Verification-C/
│           ├── Output-JSON-C/
│           └── Perform-Matrix/
└── Markdown/
    └── Query-Optimization-v3/
        ├── Execution-Log/
        │   └── execution-summary-log.md
        ├── Plan/
        │   └── query-optimization-v3-plan.md
        └── Report/
            └── Final_Report_Query_Optimization_v3.md
```

## 6. Performance Metrics
| Metrik Pemantauan | Parameter Harapan | Hasil Aktual | Status |
| :--- | :--- | :--- | :--- |
| **Model Load Time** | < 5 detik | ~2-3 detik (E5-Small) | Success |
| **RAM Consumption** | < 1 GB tambahan | ~470 MB - 600 MB | Success |
| **Dimensionality** | 384 Dimensions | 384 Dimensions | Success |
| **Data Purity** | 0% Acknowledgment/OCR masuk vektor | Blok OCR, Email, dan Referensi berhasil dimusnahkan. | Success |
| **Retrieval Output** | Kueri dapat diandalkan melintasi berbagai format jurnal (Review vs Eksperimental). | Metode C menunjukkan perbaikan signifikan dalam mengabaikan *noise* linguistik. | Success |

## 7. Execution Completion Matrix
| Checkbox | Phase | Task | Detail Task | Description | Acceptance Criteria | Input / Output State | Validation Command | Risk |
| :---: | :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| [x] | 1 | Update Model | Update `semantic_retriever.py` | Ganti ke model `intfloat/multilingual-e5-small`. | Model berhasil diunduh dan diload ke RAM tanpa *error*. | - | `python -m app.services.parser.semantic_retriever` | Sedang |
| [x] | 2 | Prefix & Limit Guard | Tambah logika Prefix & Truncation | Modifikasi `_embed_batch` untuk menerima argumen *is_query* dan memastikan teks divalidasi/dipotong sebelum masuk model. | Vektor dikembalikan dengan dimensi 384 tanpa terpotong secara *silent* (diberi peringatan/diproses aman). | `List[str] -> List[List[float]]` | Inspeksi kode manual | Tinggi |
| [x] | 3 | Setup Test A | Buat `benchmark_retrieval_a.py` | Salin skrip benchmark lama dan pasang daftar kueri Kandidat A. Atur path output log ke spesifik varian A. | Skrip berhasil jalan dan mencetak tabel metrik varian A. | - | `python scripts/Testing-Pipeline/benchmark_retrieval_a.py` | Rendah |
| [x] | 4 | Setup Test B | Buat `benchmark_retrieval_b.py` | Salin skrip benchmark lama dan pasang daftar kueri Kandidat B. Atur path output log ke spesifik varian B. | Skrip berhasil jalan dan mencetak tabel metrik varian B. | - | `python scripts/Testing-Pipeline/benchmark_retrieval_b.py` | Rendah |
| [x] | 5 | Data Purification | Sanitasi Skrip Pengujian | Tambahkan logika pembersihan (RegEx untuk OCR dan sanitasi Daftar Pustaka) pada file `benchmark_retrieval_a.py` dan `benchmark_retrieval_b.py`. | Skrip membuang *chunk* referensi dan menghapus teks hasil OCR dari vektor *child chunks* sebelum *retrieval*. | - | `python scripts/Testing-Pipeline/benchmark_retrieval_a.py` | Menengah |
| [x] | 6 | Evaluasi C & Purifikasi V2 | Buat dan Jalankan `benchmark_retrieval_c.py` | Terapkan Kueri Metode C (*Lexical Anchors*) dan *Data Purification V2* (Anti-Afiliasi & Regex Ekstrem). | Skrip C berjalan lancar tanpa terdistraksi oleh *noise* *acknowledgment* atau tabel markdown. | - | `python scripts/Testing-Pipeline/benchmark_retrieval_c.py` | Rendah |

## 8. Conclusion
Trek optimasi kueri ini telah diselesaikan dengan sukses besar. Kami memvalidasi bahwa kesalahan *retrieval* pada jurnal ilmiah tidak hanya disebabkan oleh model yang lemah, melainkan juga kualitas data mentah dan struktur *prompt* yang tidak kompatibel dengan matematika vektor. Dengan migrasi ke **E5-Small Multilingual**, pembersihan data agresif (**Purification V2**), dan adopsi gaya kueri kata kunci berbobot (**Anchor-Density**), sistem kini siap menyajikan *chunk* berkualitas tinggi untuk disintesis oleh LLM hilir.

## 9. Recommendations & Next Steps
1. **Integrasi Produksi:** *Output* dari Metode C dan *Data Purification Layer V2* sudah terbukti solid secara luring. Langkah wajib selanjutnya adalah menyuntikkan logika pembersihan ekstrem dan kueri Metode C ini langsung ke dalam sistem utama di `app/services/ingestion.py` dan `app/services/parser/smart_chunker.py`.
2. **Evaluasi Pipeline Utuh:** Setelah kode produksi diintegrasikan, jalankan *End-to-End Pipeline* dari *parsing* hingga generasi akhir oleh LLM (Qwen) untuk memastikan tidak ada efek samping akibat pemotongan data agresif.