TLDR #
LLM punya dua masalah besar: batas pengetahuan (knowledge cutoff) dan halusinasi. RAG menyelesaikannya dengan cara mengambil (retrieve) potongan dokumen yang relevan, lalu menyuruh model menjawab berdasarkan potongan itu. Hasilnya: AI bisa menjawab dari dokumen kamu sendiri — buku, PDF, laporan — tanpa harus melatih ulang model.
Pendahuluan #
Coba tanya LLM tentang data internal perusahaanmu — kemungkinan besar ia mengarang. Kenapa? Karena model dilatih dari data publik hingga tanggal tertentu, dan tidak tahu dokumen pribadimu.
Retrieval-Augmented Generation (RAG) adalah teknik yang “menyuntikkan” pengetahuanmu ke dalam pertanyaan. Alih-alih melatih ulang model (mahal dan lambat), RAG mencari potongan dokumen yang relevan dan menaruhnya ke dalam konteks prompt.
Hasilnya: jawaban yang berdasarkan sumber, bukan karangan.
Masalah yang Dipecahkan RAG #
| Masalah LLM | Solusi RAG |
|---|---|
| Tidak tahu data terbaru | Mengambil dokumen terbaru |
| Tidak tahu data internal | Mengambil dari database dokumenmu |
| Halusinasi (mengarang) | Menjawab berdasarkan konteks yang diberikan |
| Susah diaudit | Bisa menunjuk sumber potongan dokumen |
Cara Kerja RAG (2 Fase) #
RAG terdiri dari dua fase utama: indexing dan query.
1. Indexing (persiapan) #
- Ambil dokumen — PDF, teks, markdown, database, dll.
- Chunking — pecah dokumen jadi potongan kecil (misal 500–1000 token).
- Embedding — ubah tiap potongan jadi vektor angka (menggunakan model embedding).
- Simpan — masukkan vektor ke vector store (FAISS, Chroma, Pinecone, dsb).
2. Query (saat bertanya) #
- Embed pertanyaan — ubah pertanyaan jadi vektor dengan model yang sama.
- Retrieve — cari potongan dokumen yang vektornya paling mirip (similarity search).
- Generate — masukkan pertanyaan + potongan relevan ke LLM, minta jawab berdasarkan potongan itu.
Alur sederhananya:
Dokumen ──► Chunk ──► Embedding ──► Vector Store
▲
Pertanyaan ──► Embedding ──► Cari mirip ──┘
│
Pertanyaan + konteks ──► LLM ──► JawabanApa itu Embedding? #
Embedding adalah representasi angka (vektor) dari sebuah teks. Dua teks yang bermakna mirip akan menghasilkan vektor yang berdekatan; yang berbeda akan berjauhan.
Contoh intuitif: embedding dari “harga beras” akan lebih dekat ke “harga sembako” daripada ke “resep kue”.
Contoh Implementasi Sederhana #
Berikut contoh minimal dengan Python, memakai chromadb sebagai vector store dan OpenAI untuk embedding.
Install dependensi:
pip install chromadb openaiKode:
import os
import chromadb
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
db = chromadb.Client()
# 1. Indexing: simpan dokumen sebagai koleksi
docs = [
"Teorema Pythagoras berlaku pada segitiga siku-siku: a² + b² = c².",
"Fotosintesis adalah proses tumbuhan mengubah cahaya menjadi energi.",
"Bahasa pemrograman Python diciptakan oleh Guido van Rossum.",
]
collection = db.create_collection("pengetahuan")
for i, text in enumerate(docs):
emb = client.embeddings.create(
model="text-embedding-3-small",
input=text,
).data[0].embedding
collection.add(
ids=[str(i)],
embeddings=[emb],
documents=[text],
)
# 2. Query: cari dokumen relevan
def tanya(pertanyaan):
q_emb = client.embeddings.create(
model="text-embedding-3-small",
input=pertanyaan,
).data[0].embedding
hasil = collection.query(query_embeddings=[q_emb], n_results=2)
konteks = "\n".join(hasil["documents"][0])
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "Jawab hanya berdasarkan konteks berikut. Jika tidak ada jawabannya, katakan tidak tahu."},
{"role": "user", "content": f"Konteks:\n{konteks}\n\nPertanyaan: {pertanyaan}"},
],
)
return resp.choices[0].message.content
print(tanya("Siapa pencipta Python?"))Perhatikan prompt system: kita memaksa model menjawab hanya dari konteks — inilah kunci mengurangi halusinasi.
Parameter yang Perlu Diperhatikan #
| Parameter | Pengaruh | Saran awal |
|---|---|---|
| Chunk size | Ukuran potongan | 500–1000 token |
| Overlap | Tumpang tindih antar chunk | 10–15% |
| top-k | Berapa potongan diambil | 3–5 |
| Model embedding | Kualitas pencarian | text-embedding-3-small |
Kapan RAG vs Fine-tuning? #
| Kriteria | RAG | Fine-tuning |
|---|---|---|
| Tujuan | Menambah pengetahuan dari dokumen | Mengubah gaya/format jawaban |
| Biaya | Murah, cepat | Mahal, butuh data latih |
| Update data | Instan (tambah dokumen) | Harus latih ulang |
| Kebutuhan | Butuh fakta akurat + sumber | Butuh gaya tertentu |
Aturan praktis: mulai dari RAG. Fine-tuning hanya jika kamu butuh mengubah cara model menjawab, bukan apa yang diketahui.
Best Practices #
- Bersihkan dokumen sebelum indexing (hapus header berulang, noise).
- Sesuaikan chunk size dengan jenis dokumen — artikel panjang beda dengan FAQ.
- Tambahkan metadata (judul, tanggal, sumber) agar hasil mudah diaudit.
- Evaluasi kualitas retrieval — uji dengan beberapa pertanyaan, cek apakah konteks relevan terambil.
- Selalu instruksikan model untuk menjawab hanya dari konteks.
Keterbatasan RAG #
- Kualitas jawaban sangat bergantung pada kualitas chunking dan embedding.
- Dokumen yang terlalu terpotong bisa kehilangan konteks lintas paragraf.
- Pencarian kemiripan (semantic search) tidak selalu akurat untuk pertanyaan butuh penalaran kompleks.
- Untuk skala besar, kamu butuh vector store yang dikelola (Pinecone, Weaviate, Qdrant).
Ringkasan #
| Komponen | Fungsi |
|---|---|
| Chunking | Pecah dokumen jadi potongan |
| Embedding | Ubah teks jadi vektor |
| Vector store | Simpan & cari vektor |
| Retrieval | Ambil potongan paling relevan |
| Generation | LLM menjawab berdasarkan konteks |
Dokumentasi tambahan: OpenAI Embeddings