Lewati ke konten utama / Skip to main content
catatan · 23 Mei 2026 · 5 menit

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.

#rag#chunking#python#fastapi#react#nlp#docker#retrieval

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:

  1. Tulis kode chunker baru
  2. Jalankan seluruh korpus
  3. Periksa hasil secara manual
  4. Bandingkan dengan strategi sebelumnya
  5. 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

StrategiCara KerjaCocok Untuk
FixedPotong per N karakterBaseline, teks tanpa struktur
RecursiveSplit by \n\n\n. Teks dengan paragraf alami
TokenExact token count (tiktoken)Pipeline dengan batas konteks ketat
sentence_idDeteksi batas kalimat Indonesia + pysbd (23 bahasa)Kalimat utuh, NLP lintas bahasa
legal_idDeteksi hierarki BAB/PasalDokumen hukum Indonesia (UU/PP/Perpres/Perda)
MarkdownSplit 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:

MetrikRentangArti
Boundary Quality (BQ)0-1Seberapa alami batas chunk ini? Potong di tengah kalimat = rendah
Information Density (ID)0-1Berapa banyak konten vs boilerplate dalam chunk
is_completeBooleanApakah 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.