Tech

Bangun Knowledge Base dari Dokumen Legal — Cara Karpathy

Tutorial lengkap bikin file search knowledge base dari PDF dokumen legal. Regex extraction + RAG scoring + LLM. Ala Andrej Karpathy.
2 menit baca
9 April 2026
Zainul Fanani
Bangun Knowledge Base dari Dokumen Legal — Cara Karpathy
📅 9 Apr 2026🤍0 👁 0 🔗 0

Pernah ngalamin ini? CEO nanya "Siapa direktur perusahaan kita?" dan kamu harus nyari jawabannya dari 26 dokumen legal yang berserakan di Google Drive. Buka satu-satu, scroll, cari nama... 10 menit kemudian baru nemu.

Nah, bayangin kalau jawabannya keluar dalam 100 milidetik. Tanpa buka file, tanpa scroll. Cukup tanya, langsung jawab.

Itu yang kita bikin hari ini: File Search Knowledge Base — pola yang dipopulerin Andrej Karpathy (ex-OpenAI, founder of Eureka Labs). Idenya simpel tapi powerful.

Kenapa Karpathy Style?

Andrej Karpathy punya pendekatan yang elegan buat file search. Alih-alih langsung pakai LLM buat semuanya (yang lambat dan mahal), dia split jadi dua path:

  1. Regex path — buat data terstruktur (nama orang, NPWP, nomor akta). Super cepat, ~100ms.
  2. LLM path — buat query yang butuh reasoning (alamat, ringkasan, opini hukum). Lebih lambat tapi akurat, ~3-5 detik.

Hasilnya? 90% query terjawab lewat regex, dan LLM cuma dipanggil buat kasus yang bener-bener butuh "otak".

Architecture-nya Gini

flowchart TD
    subgraph Sources
        A[Cloud Storage<br/>Dokumen Legal]
        B[Local Cache<br/>PDF + Text Files]
        C[Wiki KB<br/>Jawaban Terakumulasi]
    end

    subgraph Processing
        D[Query → Regex Extract<br/>Nama, NPWP, Alamat]
        E[RAG Scoring<br/>Metadata + Full Text]
        F[LLM Answer<br/>GPT-4 / Gemini]
    end

    subgraph Output
        G[Jawaban + Sumber]
    end

    A -->|Sync + pdftotext| B
    B --> D
    B --> E
    C --> E
    D -->|~100ms| G
    E -->|~3-5s| F
    F --> G

Step 1 — Struktur Folder

Pertama, kita butuh tempat nyimpen semua dokumen yang udah di-extract jadi text:

text
/data/legal-kb/
├── index.json          # Metadata semua dokumen
├── cache/              # Text extraction dari PDF
│   ├── ACME_-_Akta_Pendirian.txt
│   └── ...
└── wiki/               # Q&A yang otomatis tersimpan
    ├── direktur_acme.md
    └── npwp_semua_perusahaan.md

index.json isinya metadata dokumen — company code, nama dokumen, tipe, dan link ke sumber aslinya.

Step 2 — Download & Extract Text

Kita download PDF dari cloud storage terus extract jadi text pake pdftotext:

bash
# Download dari cloud storage
cloud-cli download FILE_ID --output /tmp/document.pdf

# Extract text dari PDF
pdftotext -layout /tmp/document.pdf /tmp/document.txt

Jadwalin proses ini lewat cron biar otomatis sync setiap minggu.

Step 3 — Regex Extraction (The Magic Trick)

Ini bagian yang paling keren. Buat query kayak "siapa direktur?", kita nggak perlu LLM. Regex udah cukup — dan 10x lebih cepat.

typescript
const NOISE_WORDS = new Set([
  'DIREKTUR', 'ADMINISTRASI', 'HUKUM', 'NOTARIS', 'PAJAK'
]);

function extractNames(text: string): string[] {
  const names = new Set<string>();

  // Pattern: Ms. Jane Smith, (nama diikuti koma)
  const p1 = /(?:Ms\.|Mr\.)\s+([A-Z][A-Za-z.\s]{2,35}?)(?:,|\n)/g;
  let m;
  while ((m = p1.exec(text)) !== null) {
    const clean = m[1].trim();
    if (clean.length > 2 && isRealName(clean)) names.add(clean);
  }

  return [...names];
}

Kenapa regex dan bukan LLM? Karena PDF hasil OCR tuh sering banget garbled — ada null bytes, karakter aneh, format yang nggak konsisten. Regex jauh lebih robust buat handle noise kayak gini.

Step 4 — RAG Scoring

Untuk query yang lebih kompleks, kita score setiap dokumen berdasarkan relevansi:

  • Metadata match (nama file, company code): +5 poin per kata cocok
  • Full text match (isi dokumen): +3 poin per kata cocok
  • Company code bonus: +20 poin kalau query mention company yang bener

Dokumen dengan score tertinggi yang jadi konteks buat LLM.

Step 5 — Hybrid Answer Assembly

typescript
async function answerQuery(query: string, index: KBEntry[]) {
  // 1. Coba regex dulu — kalau bisa langsung jawab, done
  const directAnswer = tryDirectAnswer(query, index);
  if (directAnswer) return { answer: directAnswer };

  // 2. Score dokumen, ambil top 5
  const scored = scoreAndRank(query, index);

  // 3. Baca konteks, kirim ke LLM
  const context = scored.slice(0, 5).map(readText).join('\n---\n');
  return await callLLM(query, context);
}

Results-nya Cakep

QueryMethodSpeed
"Siapa direktur Acme Corp?"Regex~150ms
"Alamat kantor Beta Inc?"RAG + LLM~3s
"NPWP semua perusahaan?"Regex + Wiki~200ms

Tips dari Pengalaman

Beberapa hal yang aku pelajari selama implement:

  1. Selalu pakai full text, bukan cuma metadata — alamat dan nomor telepon sering muncul di isi dokumen, bukan di nama file.
  2. Wiki accumulation itu game-changer — jawaban yang udah pernah ditanyakan disimpan, jadi next time nggak perlu proses ulang.
  3. Cron sync setiap minggu — biar dokumen lokal selalu up-to-date dengan versi terbaru di cloud.
  4. pdftotext -layout lebih bagus daripada tanpa flag — preserve formatting, memudahkan regex matching.

Kesimpulan

Pola Karpathy ini elegant banget: regex buat yang fast-path, LLM buat yang butuh reasoning. Nggak over-engineered, nggak under-engineered. Pas.

Dan yang paling penting — semuanya offline-first. Dokumen di-cache lokal, query nggak perlu internet, response time predictable.

Kalau kamu punya set dokumen legal yang harus sering di-search, cobain pendekatan ini. Game-changer bener.


Kalau tutorial ini bermanfaat, share ke teman-teman yang butuh!

Ada Pertanyaan? Yuk Ngobrol!

Butuh bantuan setup OpenClaw, konsultasi IT, atau mau diskusi project engineering? Book a call langsung — gratis.

Book a Call — Gratis

via Cal.com • WITA (UTC+8)

📬 Subscribe Newsletter

Dapat alert setiap ada artikel baru langsung ke inbox kamu. Free, no spam. 🚀

F

Zainul Fanani

Founder, Radian Group. Engineering & tech enthusiast.

Catatan Fanani

Ngutak-ngatik teknologi, nulis pengalaman.

Perusahaan

  • CV Radian Fokus Mandiri — Balikpapan
  • PT UNO Solusi Teknik — Balikpapan
  • PT Reka Formasi Elektrika — Jakarta
  • PT Raya Fokus Solusi — Sidoarjo
© 2026 Catatan Fanani. All rights reserved.