RAG Chatbot: AI yang Baca Dokumenmu
Upload PDF/dokumen, sistem memecah, meng-embed, mencari potongan relevan, dan AI menjawab dengan sumber yang bisa dicek.
Ini evolusi chatbot pertamamu: sekarang ia menjawab berdasarkan dokumenmu, lengkap dengan sumber. Pola lengkapnya ada di materi RAG.
1. Alur dua fase
Indexing (sekali per dokumen): pecah → embed → simpan. Query (tiap pertanyaan): embed pertanyaan → cari top-k → tempel ke prompt → jawab.
2. Memecah dokumen (chunking)
Aturan praktis: 300–500 token per chunk dengan tumpang tindih 10–15%. Untuk PDF, pakai parser teks dulu (mis. pdf-parse di Node).
function chunkText(text: string, size = 1200, overlap = 150): string[] {
const chunks: string[] = [];
for (let i = 0; i < text.length; i += size - overlap) {
chunks.push(text.slice(i, i + size));
}
return chunks.filter((c) => c.trim().length > 50);
}
3. Embedding dan penyimpanan
Paling mulus: pgvector di Postgres yang sudah kamu punya.
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE chunks (
id SERIAL PRIMARY KEY,
doc_id TEXT NOT NULL,
content TEXT NOT NULL,
embedding vector(1536)
);
Embed tiap chunk lewat endpoint /embeddings provider, simpan bersama teks aslinya.
4. Pencarian top-k
SELECT content, doc_id,
1 - (embedding <=> $1) AS score
FROM chunks
ORDER BY embedding <=> $1
LIMIT 5;
(<=> = jarak cosine di pgvector; 1 - jarak = kemiripan.)
5. Prompt RAG
const prompt = [
{ role: "system", content:
"Jawab HANYA berdasarkan konteks di bawah. " +
"Sebutkan [sumber: doc_id] di akhir tiap klaim. " +
"Kalau jawaban tidak ada di konteks, katakan: tidak ditemukan." },
{ role: "user", content:
"Konteks:\n" + potongan.join("\n---\n") +
"\n\nPertanyaan: " + pertanyaan },
];
6. Yang membedakan RAG bocor dan RAG solid
- Tampilkan chunk yang terpilih ke user (transparansi = kepercayaan).
- Evaluasi dengan 20 pertanyaan berjawaban-benar; jalankan setiap deploy.
- Hybrid search (kata kunci + vektor) kalau ada nama produk/kode internal.
- Tolak menjawab di luar konteks — lebih baik "tidak ditemukan" daripada karangan.
Tantangan
Tambahkan tombol "lihat sumber" yang membuka chunk aslinya, dan filter metadata (dokumen mana yang boleh dijawab oleh user ini).