ASAL AI

RAG Chatbot: AI yang Baca Dokumenmu

Upload PDF/dokumen, sistem memecah, meng-embed, mencari potongan relevan, dan AI menjawab dengan sumber yang bisa dicek.

Next.jspgvectorEmbedding API≈ 90 menit

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).