Lewati ke isi

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

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)

← Bab 13 Lanjut Bab 15 →

Diadaptasi dari modul "RAG" dari Learn Prompting. Dilisensikan Apache 2.0.