RAG: Retrieval-Augmented Generation
LLM punya knowledge cutoff dan tidak tahu data internal kamu. RAG menggabungkan retrieval (cari data relevan) + generation (LLM menjawab berdasarkan data yang ditemukan).
Tanpa RAG vs Dengan RAG
// Tanpa RAG
User: "Apa kebijakan cuti di perusahaan kita?"
LLM: "Saya tidak tahu kebijakan spesifik perusahaan Anda." // ❌
// Dengan RAG
1. Embed query → cari di knowledge base
2. Temukan: "Karyawan mendapat 12 hari cuti per tahun..."
3. Kirim ke LLM: "Berdasarkan dokumen berikut: [data], jawab: ..."
LLM: "Berdasarkan kebijakan perusahaan, Anda mendapat 12 hari cuti..." // ✅
RAG Pipeline
// 1. Indexing (sekali, atau saat data berubah)
const chunks = splitDocument(document, { chunkSize: 500 });
for (const chunk of chunks) {
const embedding = await embed(chunk.text);
await vectorDB.upsert({
id: chunk.id,
values: embedding,
metadata: { text: chunk.text, source: chunk.source },
});
}
// 2. Querying (setiap user question)
async function askWithRAG(question) {
// Retrieve relevant chunks
const queryEmbedding = await embed(question);
const results = await vectorDB.query({
vector: queryEmbedding,
topK: 5,
});
// Augment prompt with context
const context = results.map(r => r.metadata.text).join("\n\n");
// Generate answer
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "system", content: `Jawab berdasarkan context berikut:\n\n${context}` },
{ role: "user", content: question },
],
});
return response.choices[0].message.content;
}
Chunking Strategies
- Fixed size — 500 token per chunk, overlap 50 token
- Paragraph — Split per paragraf natural
- Semantic — Split berdasarkan topik change