Bangun Knowledge Base dari Dokumen Legal — Cara Karpathy

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:
- Regex path — buat data terstruktur (nama orang, NPWP, nomor akta). Super cepat, ~100ms.
- 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 --> GStep 1 — Struktur Folder
Pertama, kita butuh tempat nyimpen semua dokumen yang udah di-extract jadi 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:
# 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.
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
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
| Query | Method | Speed |
|---|---|---|
| "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:
- Selalu pakai full text, bukan cuma metadata — alamat dan nomor telepon sering muncul di isi dokumen, bukan di nama file.
- Wiki accumulation itu game-changer — jawaban yang udah pernah ditanyakan disimpan, jadi next time nggak perlu proses ulang.
- Cron sync setiap minggu — biar dokumen lokal selalu up-to-date dengan versi terbaru di cloud.
- 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 — Gratisvia Cal.com • WITA (UTC+8)
📬 Subscribe Newsletter
Dapat alert setiap ada artikel baru langsung ke inbox kamu. Free, no spam. 🚀
Zainul Fanani
Founder, Radian Group. Engineering & tech enthusiast.
