Belajar AI Engineer - Retrieval-Augmented Generation (RAG)
Episode 7 of 28

Belajar AI Engineer - Retrieval-Augmented Generation (RAG)

Merakit sistem knowledge pertama: RAG. Dari chunking dokumen, retrieval semantik, reranking, hingga grounding jawaban agar model menjawab berdasarkan fakta. Kalian membangun pipeline RAG lengkap yang bisa menjawab pertanyaan dari dokumen milik sendiritype: text

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Embedding dan vector DB dari episode 6 hanyalah setengah dari cerita. Episode ini merakit keduanya menjadi sistem yang benar-benar berguna: Retrieval-Augmented Generation (RAG) — arsitektur default untuk hampir semua produk AI knowledge di 2026.

Mengapa RAG penting? Karena LLM tidak tahu dokumen internal kalian. RAG memberi model akses terbatas ke sumber pengetahuan yang kalian kontrol: ia mencari fakta dulu, baru menjawab. Hasilnya: jawaban yang grounded (berbasis fakta), bisa diberi sumber, dan selalu segar — tanpa melatih ulang model.

Arsitektur RAG

100%

Tiga komponen inti: index (dokumen → chunks → vektor), retrieval (pertanyaan → dokumen relevan), dan generation (context + pertanyaan → jawaban). Kualitas RAG ditentukan oleh kualitas masing-masing lapisan ini — perbaikannya bertahap di episode 15 dan 24.

Membangun Pipeline RAG Lengkap

1. Index: Dokumen Menjadi Chunks

Pythonindex.py - pecah dokumen dan simpan
from openai import OpenAI
import chromadb
 
client = OpenAI()
chroma = chromadb.Client()
col = chroma.get_or_create_collection("kb")
 
def chunk(text: str, size: int = 500, overlap: int = 50) -> list[str]:
    words = text.split()
    out = []
    i = 0
    while i < len(words):
        out.append(" ".join(words[i:i + size]))
        i += size - overlap
    return out
 
def index_document(doc_id: str, text: str) -> None:
    chunks = chunk(text)
    emb = client.embeddings.create(
        model="text-embedding-3-small", input=chunks
    )
    col.add(
        ids=[f"{doc_id}-{i}" for i in range(len(chunks))],
        documents=chunks,
        embeddings=[e.embedding for e in emb.data],
        metadatas=[{"doc": doc_id} for _ in chunks],
    )
 
with open("dokumen.txt") as f:
    index_document("manual", f.read())
print("index selesai")

Perhatikan pemecahan dengan overlap 50 kata — ini menjaga konteks antar chunk agar kalimat yang terpotong tidak kehilangan makna. Strategi chunking kita dalami di episode 15.

2. Retrieval + Grounding

Pythonrag.py - jawab dengan konteks
from openai import OpenAI
import chromadb
 
client = OpenAI()
chroma = chromadb.Client()
col = chroma.get_or_create_collection("kb")
 
def retrieve(question: str, k: int = 3) -> list[str]:
    emb = client.embeddings.create(
        model="text-embedding-3-small", input=question
    )
    hasil = col.query(query_embeddings=[emb.data[0].embedding], n_results=k)
    return hasil["documents"][0]
 
def answer(question: str) -> str:
    docs = retrieve(question)
    context = "\n\n".join(docs)
    r = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "Jawab HANYA dari konteks yang diberikan. "
             "Jika fakta tidak ada, katakan 'Tidak ditemukan di dokumen'. "
             "Sebutkan kutipan singkat sebagai sumber."},
            {"role": "user", "content": f"[KONTEKS]\n{context}\n\n[PERTANYAAN]\n{question}"},
        ],
        temperature=0.2,
    )
    return r.choices[0].message.content
 
while True:
    q = input("\nTanya dokumen: ")
    if q.lower() == "exit":
        break
    print("\n", answer(q))

Pola di atas adalah heart RAG yang akan kalian lihat di hampir semua produk knowledge: retrieve → ground → answer. Perhatikan system prompt yang memaksa model menjawab dari konteks saja — ini yang disebut grounding dan mencegah halusinasi.

Rerank: Menyempurnakan Urutan Hasil

Retrieval awal (dengan embedding) sudah bagus, tapi urutannya bisa diperbaiki. Reranker adalah model khusus yang diberi pasangan (pertanyaan, dokumen) dan menilai relevansinya lebih presisi:

PythonRerank dengan cross-encoder
from sentence_transformers import CrossEncoder
 
reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")
dokumen = retrieve("cara reset password", k=10)
 
skor = reranker.predict([(q, d) for d in dokumen])
urutan = sorted(zip(dokumen, skor), key=lambda x: -x[1])[:3]

Retrieval vector memilih kandidat (murah, cepat), reranker mengurutkan kandidat secara akurat (lebih mahal, tapi hanya untuk 10-50 dokumen). Kombinasi ini (retrieve-then-rerank) adalah standar produksi.

Tip

Aturan praktis: top-k besar (10-20) untuk retrieval, lalu top-n kecil (3-5) setelah rerank. Ini memberi reranker banyak kandidat untuk dipilih tanpa membuat biaya token meledak.

Grounding dan Sumber

Produk knowledge yang baik selalu menunjukkan sumbernya. Simpan metadata doc di chunk (kita sudah lakukan saat index), lalu minta model menyebutkan sumber pada jawaban:

text
Q: Cara reset password?
A: Reset password dilakukan di menu Pengaturan > Keamanan.
   [Sumber: manual-user, bagian 4.2]

Jawaban yang bisa diverifikasi meningkatkan kepercayaan pengguna dan memudahkan debugging ketika retrieval salah.

Common Pitfalls

  • Menjawab tanpa grounding: tanpa instruksi eksplisit, model akan "menambahkan" fakta dari training-nya. Selalu wajibkan menjawab dari konteks.
  • Chunk terlalu kecil/besar: terlalu kecil → konteks terpotong; terlalu besar → retrieval kasar dan biaya tinggi.
  • Retrieval tidak diuji: ukur kualitas retrieval secara terpisah (episode 9) sebelum menyalahkan prompt.
  • Mengabaikan metadata: tanpa filter dan sumber, RAG sulit di-debug dan berisiko kebocoran data.

Penutup

Inti yang harus dibawa pulang:

  • RAG = index → retrieve → rerank → generate; default untuk produk knowledge 2026.
  • Grounding (wajibkan jawab dari konteks) mencegah halusinasi.
  • Retrieve-then-rerank menaikkan kualitas dengan biaya terkontrol.
  • Selalu simpan sumber di metadata dan tampilkan ke pengguna.

Di episode 8 selanjutnya kita mengoptimasi penggunaan konteks: context engineering — mengelola context window, kompresi konteks, prompt caching, dan strategi menghemat token di produksi. Sampai jumpa di episode 8!

Belajar AI Engineer - Retrieval-Augmented Generation (RAG) | Belajar AI Engineer