Bab 14: RAG (Retrieval Augmented Generation)¶
LLM tidak tahu data perusahaan kamu. RAG ngajarin LLM "baca dokumen kamu" sebelum jawab.
RAG adalah pattern paling penting untuk AI yang grounded di data spesifik kamu — internal docs, knowledge base, dokumentasi produk.
Setelah Bab 14, kamu akan bisa:
- Memahami kenapa RAG dibutuhkan vs pakai LLM polos
- Pattern dasar RAG: retrieve → augment → generate
- Build prompt untuk Q&A system di atas dokumen kamu
14.1. Masalah: LLM Tidak Tahu Data Spesifik Kamu¶
LLM trained dengan data publik. Dia tidak tahu:
- Policy company kamu
- Product catalog kamu
- Internal documentation
- Customer data
- Data terbaru (post training cutoff)
Tanya LLM tentang ini = dia mengarang atau bilang "saya tidak tahu".
14.2. Solusi: Retrieve First, Then Generate¶
RAG flow:
flowchart LR
Q[User Question]
DB[(Knowledge<br/>Base /<br/>Vector DB)]
Retrieve["1. Retrieve:<br/>cari chunk relevan<br/>dari DB"]
Chunks["Top-K chunks<br/>(misal 3 paragraf<br/>paling relevan)"]
Prompt["2. Augment:<br/>masukkan chunks<br/>ke prompt"]
LLM["3. Generate:<br/>LLM jawab dengan<br/>konteks chunks"]
Answer[Answer + sumber]
Q --> Retrieve
Retrieve --> DB
DB --> Chunks
Chunks --> Prompt
Q --> Prompt
Prompt --> LLM
LLM --> Answer
style Q fill:#1a1a1a,stroke:#6366f1,color:#fafafa
style DB fill:#1a1a1a,stroke:#f59e0b,color:#fafafa
style Retrieve fill:#1a1a1a,stroke:#ec4899,color:#fafafa
style Chunks fill:#1a1a1a,stroke:#06b6d4,color:#fafafa
style Prompt fill:#1a1a1a,stroke:#ec4899,color:#fafafa
style LLM fill:#1a1a1a,stroke:#10b981,color:#fafafa
style Answer fill:#1a1a1a,stroke:#10b981,color:#fafafa
Cara baca diagram
Diagram ini menjelaskan 3 fase RAG.
Fase 1: Retrieve
User tanya. Sistem cari chunk paling relevan dari Knowledge Base / Vector Database.
Cara cari biasanya pakai semantic search — convert pertanyaan jadi vector, cari vector yang paling mirip di DB. Top-K = ambil K (misal 3) dokumen paling mirip.
Fase 2: Augment
Chunk yang di-retrieve dimasukkan ke prompt sebagai konteks. Prompt jadinya:
[CONTEXT]
{{ chunk 1 }}
{{ chunk 2 }}
{{ chunk 3 }}
[QUESTION]
{{ user question }}
Jawab berdasarkan context di atas saja.
Fase 3: Generate
LLM generate jawaban berdasarkan context yang dia dapat. Kalau context relevan, jawaban accurate. Kalau context tidak ada info, LLM bilang "tidak ada info".
Kenapa ini powerful:
- LLM dipaksa jawab dari sumber spesifik (mengurangi hallucination)
- Update knowledge tidak perlu retrain model — cuma update DB
- Citation bisa: kasih tahu user dari dokumen mana jawaban berasal
Pattern ini fondasi banyak AI app modern: customer support bot, internal Q&A, documentation chat, dll.
Komponen yang dibutuhkan: - Vector database (Pinecone, Weaviate, ChromaDB, Postgres pgvector) - Embedding model (OpenAI ada, Voyage, sentence-transformers) - LLM untuk generation (GPT-4, Claude, Gemini) - Glue code (LangChain, LlamaIndex, atau custom)
14.3. Prompt Pattern untuk RAG¶
[INSTRUKSI]
Jawab pertanyaan user **hanya berdasarkan context** yang diberikan di bawah.
Aturan:
1. Kalau jawaban tidak ada di context, jawab: "Maaf, saya tidak menemukan
informasi tentang itu di dokumentasi yang tersedia."
2. Jangan tebak atau pakai pengetahuan umum.
3. Sebutkan **dari mana** info berasal (sumber yang relevan).
4. Kalau context contradicting, kasih tau user.
[CONTEXT]
<doc id="1" source="HR Policy v3.2">
{{ chunk 1 }}
</doc>
<doc id="2" source="Employee Handbook">
{{ chunk 2 }}
</doc>
<doc id="3" source="Benefits Guide 2026">
{{ chunk 3 }}
</doc>
[QUESTION]
{{ user_question }}
[ANSWER]
LLM akan jawab strictly dari context, dengan citation.
14.4. Best Practice¶
1. Chunk Size¶
Dokumen panjang harus dipecah jadi chunks kecil sebelum embedding.
- Terlalu kecil (50 kata): kehilangan konteks
- Terlalu besar (5000 kata): retrieval kurang precise
- Sweet spot: 200-500 kata per chunk, dengan overlap 50-100 kata antar chunk
2. Metadata¶
Simpan metadata per chunk: source, date, author, category. Berguna untuk: - Filtering (misal: cuma ambil dari "policy 2026", bukan policy lama) - Citation di output
3. Hybrid Search¶
Kombinasi: - Semantic search (vector) — bagus untuk konsep - Keyword search (BM25) — bagus untuk exact match (nama produk, kode)
Hybrid biasanya menang dari pure-semantic.
4. Re-ranking¶
Dapat 20 chunks dari semantic search → re-rank dengan model lebih kuat → ambil top 3. Quality lebih tinggi.
5. Citation di Output¶
Selalu kasih user dari mana jawaban berasal. Build trust + memudahkan verify.
14.5. Common Mistakes¶
Mistake 1: Tidak Pakai "Hanya Berdasarkan Context"¶
Tanpa instruksi eksplisit, LLM mix context dengan pengetahuan umum-nya. Output bisa salah.
Mistake 2: Chunk Tidak Self-Contained¶
Chunk yang dipotong di tengah kalimat = kehilangan makna.
Mistake 3: Tidak Handle "Jawaban Tidak Ada"¶
Tanpa fallback, LLM mengarang kalau tidak ada info di context. Selalu kasih instruction "kalau tidak ada, bilang saya tidak tahu".
Mistake 4: Konteks Terlalu Banyak¶
Lebih banyak chunks ≠ lebih akurat. Setelah ~5 chunks, signal-to-noise turun.
14.6. Use Case¶
- Internal Q&A: HR policy, IT support, company knowledge
- Customer Support: docs produk, FAQ
- Legal/Compliance: cari di kontrak
- Code documentation: cari di codebase + docs
- Education: tutor yang grounded di textbook
14.7. Tools Populer¶
- LangChain: framework lengkap, banyak integration
- LlamaIndex: focus pada data ingestion
- Vector DB: Pinecone, Weaviate, Chroma, pgvector
- Embedding model: OpenAI (
text-embedding-3-small), Voyage AI, sentence-transformers (open source)
14.8. Latihan¶
14.1 — Manual RAG¶
Ambil dokumen panjang (PDF, blog post). Manually copy-paste 2-3 paragraf relevant ke prompt. Tanya. Bandingkan dengan tanya tanpa context.
14.2 — Build Mini RAG¶
Pakai LangChain + ChromaDB. Index 10 dokumen. Build Q&A app simple.
14.3 — Tantangan: Production RAG¶
Identify use case di kerjaan kamu (e.g. internal docs Q&A). Build POC RAG. Deploy di Slack atau internal tool.
RAG Flow¶
1. Retrieve: vector search → top-K chunks
2. Augment: chunks → prompt context
3. Generate: LLM jawab dari context
Prompt Pattern¶
[INSTRUKSI]
Jawab hanya dari context.
Kalau tidak ada, bilang tidak tahu.
Sebutkan sumber.
[CONTEXT]
<doc>chunk 1</doc>
<doc>chunk 2</doc>
[QUESTION] ...
Best Practice¶
- Chunk: 200-500 kata, overlap 50-100
- Metadata per chunk
- Hybrid search (semantic + keyword)
- Re-ranking untuk precision
- Citation di output
Tools¶
| Component | Pilihan |
|---|---|
| Framework | LangChain, LlamaIndex |
| Vector DB | Pinecone, ChromaDB, pgvector |
| Embedding | OpenAI, Voyage, sentence-transformers |
| LLM | GPT-4, Claude, Gemini |
Hindari¶
- ❌ Tidak instruksi "hanya context"
- ❌ Chunk terpotong di tengah kalimat
- ❌ Tidak handle "jawaban tidak ada"
- ❌ Terlalu banyak chunks (>10)