ChunkLab: Sandbox untuk Chunking Teks Hukum Indonesia
Mengapa generic chunking gagal pada dokumen hukum, bagaimana ChunkLab mengujinya, dan apa yang saya pelajari dari membangun 7 strategi chunking untuk RAG pipeline.
Pendahuluan
Setelah menyelesaikan LexHarmoni untuk hackathon April 2026, satu pertanyaan terus muncul: bagaimana cara terbaik memotong dokumen hukum untuk RAG pipeline?
Masalahnya bukan kurangnya chunking library. Masalahnya: generic chunking dirancang untuk teks umum — artikel blog, dokumentasi teknis, paragraf naratif. Dokumen hukum Indonesia punya struktur berbeda: hierarki BAB-Pasal-Ayat, definisi yang dirujuk lintas pasal, lampiran yang punya kekuatan hukum setara batang tubuh.
Memotong di tengah pasal berarti memutus konteks yuridis. Tapi memberi satu pasal utuh per chunk bisa berarti kehilangan konteks BAB. Tidak ada jawaban universal.
ChunkLab lahir sebagai sandbox untuk menjawab pertanyaan itu secara eksperimental — bukan dengan teori, tapi dengan mencoba, melihat hasilnya, dan mengulang.
Kenapa Sandbox?
Selama mengerjakan LexHarmoni dan insolvensi.id, saya sering berganti strategi chunking. Setiap kali berganti, saya harus:
- Tulis kode chunker baru
- Jalankan seluruh korpus
- Periksa hasil secara manual
- Bandingkan dengan strategi sebelumnya
- Ulang
Proses itu lambat dan tidak ada tool visual. Saya ingin mencoba 7 strategi sekaligus, melihat hasilnya side-by-side, dan mengekspor konfigurasi terbaik ke file JSON yang siap dipakai di pipeline.
ChunkLab adalah jawabannya: drag-and-drop file teks, pilih strategi, lihat hasilnya dalam detik.
Tujuh Strategi Chunking
| Strategi | Cara Kerja | Cocok Untuk |
|---|---|---|
| Fixed | Potong per N karakter | Baseline, teks tanpa struktur |
| Recursive | Split by \n\n → \n → . → | Teks dengan paragraf alami |
| Token | Exact token count (tiktoken) | Pipeline dengan batas konteks ketat |
| sentence_id | Deteksi batas kalimat Indonesia + pysbd (23 bahasa) | Kalimat utuh, NLP lintas bahasa |
| legal_id | Deteksi hierarki BAB/Pasal | Dokumen hukum Indonesia (UU/PP/Perpres/Perda) |
| Markdown | Split di header boundary (H1 › H2 › H3) | Dokumentasi |
legal_id adalah strategi yang paling saya banggakan. Ia memahami bahwa “Pasal 5 ayat (2)” adalah satu unit, “BAB III” membuka konteks baru, dan lampiran adalah dokumen terpisah secara logis. Metadata hierarkis (_legal_path, _legal_section, _legal_unit) diinjeksi otomatis per chunk — sehingga RAG tahu chunk ini berasal dari Pasal 5, ayat (2), dalam BAB III.
Quality Metrics: Tidak Semua Chunk Sama
Satu masalah dengan chunking: bagaimana tahu bahwa potongan ini bagus? ChunkLab memperkenalkan tiga metrik per chunk:
| Metrik | Rentang | Arti |
|---|---|---|
| Boundary Quality (BQ) | 0-1 | Seberapa alami batas chunk ini? Potong di tengah kalimat = rendah |
| Information Density (ID) | 0-1 | Berapa banyak konten vs boilerplate dalam chunk |
| is_complete | Boolean | Apakah chunk terpotong di tengah kata (⚠ truncated) |
BQ tinggi + ID tinggi + complete = chunk ideal. Visualisasinya dengan dot color (hijau/kuning/merah) di kartu chunk — sekilas bisa dinilai.
Arsitektur
┌─────────────┐ ┌──────────────┐ ┌──────────┐
│ Frontend │◄───►│ Backend │◄───►│ Hugging │
│ (React) │ │ (FastAPI) │ │ Face E5 │
│ + Tailwind│ │ + Pydantic │ │ (opsional)│
└─────────────┘ └──────┬───────┘ └──────────┘
│
┌──────┴───────┐
│ CHUNKER │
│ REGISTRY │
│ (6 classes) │
└──────┬───────┘
│
┌──────┴───────┐
│ Metadata │
│ Extractor │
│ + Quality │
└──────────────┘
Request flow: POST /api/chunk → validasi Pydantic → dispatch ke strategi → ekstraksi metadata regex → hitung quality metrics → respons JSON.
Retrieval simulation: POST /api/retrieve → encode query + chunk via intfloat/multilingual-e5-large → cosine similarity → Top-K ranking.
Backend terpisah dari frontend, komunikasi via REST API. Docker siap — docker compose up --build langsung jalan.
Fitur Lain
Comparison Mode: Dua konfigurasi chunking dijalankan side-by-side — lihat perbedaan jumlah chunk, token, distribusi BQ, langsung dalam satu layar.
Token Estimation: Multi-provider — OpenAI, Gemini, Ollama, LM Studio, OpenRouter. Pilih konteks provider yang sesuai.
Regex Metadata: Pola regex kustom diekstraksi otomatis dari teks dan dijadikan metadata per chunk.
Export: JSON (lengkap), JSONL (siap vector database), YAML. Tinggal download dan pakai.
Status
v0.2.0 — 137 test (pytest), type-check bersih (tsc —noEmit), Docker multi-stage build. Lisensi Apache 2.0.
Bukan produk. Bukan layanan. Ini ruang eksperimen — kalau ada yang berguna, akan dipromosikan jadi modul di insolvensi.id atau LexHarmoni.
Author: Ziffany Firdinal Date: Mei 2026 Context: Proyek sandbox pasca-hackathon, dikerjakan paralel dengan pengembangan insolvensi.id.