# Blueprint Integrasi: Anchor-Density & Data Purification V2

## 1. Understanding Summary
* **What is being built:** Integrasi Kueri Metode C (Anchor-Density) dan Saringan Data Ekstrem (Data Purification V2) dari skrip `benchmark_retrieval_c.py` ke sistem *backend* utama.
* **Why it exists:** Mencegah halusinasi dan polusi semantik pada LLM Qwen dengan memastikan teks *acknowledgment*, daftar pustaka, dan residu tabel OCR tidak ikut masuk ke dalam kalkulasi vektor E5 maupun penyusunan konteks.
* **Who it is for:** Sistem *pipeline ingestion* utama (`app/services/ingestion.py` dan `app/services/parser/smart_chunker.py`).
* **Key constraints:** Tidak memodifikasi logika *prompting* Qwen maupun *database* Neo4j. Proses integrasi harus menjaga agar arsip mentah di Supabase tetap utuh (*non-destructive storage*).
* **Explicit non-goals:** Tidak menyentuh alur penyimpanan `chunk_records` mentah ke antrean Supabase. Tidak mengubah konfigurasi model LLM.

## 2. Assumptions
* File `benchmark_retrieval_c.py` telah tervalidasi kesuksesannya dan metodenya sudah final.
* Pengembangan dilakukan menggunakan skema Just-In-Time (JIT) di mana *chunk* dibersihkan sesaat sebelum *embedding*, memastikan hanya *Retriever* dan LLM yang mengonsumsi data bersih, sementara *database cloud* (Supabase) menyimpan data mentah.

## 3. Decision Log
| Keputusan | Alternatif Dipertimbangkan | Alasan Pemilihan |
| :--- | :--- | :--- |
| **Metode C (Anchor-Density)** | Q&A (Metode A) atau HyDE (Metode B) | Q&A dan HyDE gagal pada pilar spesifik (Gap & Future Work) akibat variansi linguistik jurnal. Lexical Anchors (Metode C) sangat efektif memusatkan *density* semantik pada *dense retriever* 384D. |
| **Pembersihan JIT (Downstream)** | Pembersihan Upstream di *Chunker* | Pembersihan JIT di `ingestion.py` jauh lebih aman bagi Supabase karena *chunk* mentah (`chunk_records`) tidak termodifikasi, sehingga menghindarkan kita dari risiko kerusakan data *storage* permanen. |
| **Perluasan Blacklist Header** | Dua daftar terpisah | Diimplementasikan di hulu (`smart_chunker.py`) agar proses komputasi lebih ringan; memblokir bab yang *irrelevan* sebelum diproses menjadi *chunk* anak. |

## 4. Final Design (Implementasi Terukur)

### Modifikasi A: `app/services/parser/smart_chunker.py`
Konstanta `IRRELEVANT_HEADERS` pada baris 14 akan ditambahkan *item* baru untuk mencegat ejaan internasional dan variasi istilah:
```python
IRRELEVANT_HEADERS = [
    # (Existing headers...)
    "reference", "references", "bibliography", "daftar pustaka", "referensi",
    "acknowledgement", "acknowledgements", "acknowledgment", "acknowledgments",
    "ucapan terima kasih", "funding", "pendanaan",
    "appendix", "appendices", "lampiran",
    "table of contents", "daftar isi",
    "author contributions", "kontribusi penulis"
]
```

### Modifikasi B: `app/services/ingestion.py`
Perubahan difokuskan pada fungsi `process_io_bound_pdf`.

**B.1. Pembaruan Kueri Semantik**
*Array* `query_texts` lama akan diganti dengan 5 pilar Metode C:
```python
query_texts = [
    "latar belakang masalah, urgensi penelitian, motivasi mendasar, fenomena krusial, konteks situasi saat ini, dan alasan utama studi ini dilakukan.",
    "rincian teknis metodologi, arsitektur sistem, desain eksperimen, teknik pengumpulan dataset, algoritma yang diusulkan, sampel, dan prosedur pengujian.",
    "keterbatasan penelitian terdahulu, kelemahan metode sebelumnya, kekosongan literatur, masalah yang belum terselesaikan, namun demikian, akan tetapi, dan hasil yang belum jelas.",
    "tujuan utama penelitian, sasaran spesifik, kontribusi inti makalah, hasil yang ingin dicapai, mengeksplorasi, dan solusi yang diusulkan untuk menyelesaikan masalah.",
    "saran untuk penelitian selanjutnya, rekomendasi pekerjaan di masa depan, arah pengembangan masa depan, dan peluang studi berikutnya untuk mengatasi batasan saat ini."
]
```

**B.2. Injeksi JIT Data Purification V2**
Tepat setelah fungsi `generate_parent_child_chunks()` dipanggil, blok kode baru akan disisipkan:
1. Mendefinisikan fungsi lokal `clean_text_noise(text)` (RegEx anti-tabel dan OCR) dan `is_content_garbage(text)` (pencarian afiliasi dan pola daftar pustaka).
2. Memfilter `parent_chunks` dan `child_chunks` menjadi bentuk tersanitasi.
3. Menyimpan hasil saringan kembali ke dalam variabel `parent_chunks` dan `child_chunks` agar `retriever.find_top_k_parents` menggunakan data yang suci.
4. Karena variabel `chunk_records` dihasilkan terpisah di fase sebelumnya, data mentah yang dikirim ke fungsi antrean (Supabase) tetap terjaga integritas aslinya.