Menaikkan RAG ke level produksi: hybrid search yang menggabungkan semantik dan keyword, graph RAG untuk relasi antar entitas, hingga agentic RAG di mana retrieval dipandu agen. Kalian merancang knowledge system yang andal di skala nyatatype: text

RAG dasar dari episode 7 sudah berfungsi, tapi produksi menuntut lebih: pertanyaan bernuansa, dokumen dengan relasi kompleks, dan pertanyaan yang butuh beberapa langkah pencarian. Episode ini membawa kalian dari RAG yang bekerja menjadi RAG yang andal — melalui tiga peningkatan: hybrid search, graph RAG, dan agentic RAG.
Mengapa penting? Karena batas kualitas produk knowledge ditentukan di sini. Ketika retrieval dasar gagal menjawab pertanyaan "berapa penjualan produk X di region Y tahun lalu", kalian butuh lebih dari sekadar kesamaan vektor. Episode ini adalah toolkit untuk kasus-kasus sulit itu.
Embedding unggul menangkap makna, tapi lemah pada hal-hal yang butuh kecocokan eksak: kode produk, nama merek, nomor seri, istilah langka. Hybrid search menggabungkan dua jalur:
Hasil keduanya digabung dengan reciprocal rank fusion (RRF):
from rank_bm25 import BM25Okapi
def hybrid_search(query: str, k: int = 5) -> list[str]:
# 1. jalur semantik (vector)
v_hasil = col.query(query_texts=[query], n_results=k * 2)
v_docs = v_hasil["documents"][0]
# 2. jalur keyword (BM25)
tokenized = [d.split() for d in all_docs]
bm25 = BM25Okapi(tokenized)
k_hasil = bm25.get_top_n(query.split(), all_docs, n=k * 2)
# 3. gabung dengan RRF (score = 1/(60 + rank))
skor: dict[str, float] = {}
for i, d in enumerate(v_docs):
skor[d] = skor.get(d, 0) + 1 / (60 + i + 1)
for i, d in enumerate(k_hasil):
skor[d] = skor.get(d, 0) + 1 / (60 + i + 1)
return sorted(skor, key=skor.get, reverse=True)[:k]RRF sederhana dan kuat: peringkat tinggi di salah satu jalur memberi kontribusi besar tanpa perlu kalibrasi skor antar-jalur. Banyak vector DB modern (Qdrant, Weaviate, Elasticsearch) punya hybrid search bawaan — pakai itu daripada menulis sendiri di produksi.
RAG dasar menjawab "apa isi dokumen". Graph RAG menjawab soal relasi: "siapa supplier utama yang juga mitra divisi X?". Ia membangun graph entitas dari dokumen:
Pembuatan graph (offline, saat ingest): ekstrak entitas dan relasi dengan LLM, simpan di graph database (Neo4j) atau vektor relasi. Saat query:
Hasilnya: jawaban yang mempertimbangkan struktur relasional data — bukan hanya potongan teks. Graph RAG unggul untuk dokumen yang kaya relasi (laporan keuangan, riset, org structure), dan lebih mahal untuk dibangun — evaluasi dulu apakah produk kalian benar-benar membutuhkannya.
Agentic RAG mengganti retrieval sekali-jalan dengan agent retrieval: model menilai apakah konteks cukup, mencari lagi dengan query baru, atau mengganti strategi — mirip manusia yang mencari berulang:
Pola paling sederhana (dan sering cukup): generate-retrieve-generate — jawab dulu dengan model (tanpa konteks), lalu cari dokumen berdasarkan pertanyaan dan jawaban itu, baru generate final:
from openai import OpenAI
client = OpenAI()
def answer_with_self_search(q: str, max_rounds: int = 3) -> str:
context = []
for i in range(max_rounds):
prompt = (f"Konteks saat ini:\n{' '.join(context) or '(kosong)'}"
f"\n\nPertanyaan: {q}\n"
f"Jika konteks cukup, jawab. Jika kurang, balas "
f"QUERY:<kata kunci baru untuk dicari>")
jawaban = llm_call(client, prompt)
if jawaban.startswith("QUERY:"):
context.extend(retrieve(jawaban.removeprefix("QUERY:").strip()))
continue
return jawaban
return "tidak ditemukan"Agentic RAG menaikkan biaya (beberapa panggilan LLM + retrieval), tapi menghasilkan recall yang jauh lebih tinggi untuk pertanyaan berlapis.
Warning
Agentic RAG adalah peningkatan recall dengan biaya ekstra. Ukur dulu dengan eval (episode 9): berapa banyak pertanyaan yang gagal di RAG dasar? Jika recall sudah 95%, agentic RAG tidak layak. Jangan menambah kompleksitas tanpa data.
Merangkai semuanya, arsitektur RAG produksi yang sehat:
| Lapisan | Komponen | Dibahas di |
|---|---|---|
| Index | Chunking terstruktur + metadata lengkap | Episode 15 |
| Retrieval | Hybrid search + rerank | Episode 7, episode ini |
| Filter | Authorization per dokumen | Episode 18, 20 |
| Cache | Semantic cache jawaban + embedding cache | Episode 8, 22 |
| Quality | Eval suite + monitoring faithfulness | Episode 9, 17 |
| Update | Pipeline ingest otomatis + versioning | Episode 15 |
Kuncinya: setiap lapisan punya metrik dan bisa diuji sendiri. Retrieval diuji dengan hit-rate, generation diuji dengan faithfulness, cache diukur hit-ratenya. Kalian hanya bisa memperbaiki apa yang bisa diukur.
max_rounds, agent mencari selamanya.Inti yang harus dibawa pulang:
Di episode 25 selanjutnya kita menjamin keandalan: production reliability AI — fallbacks, retries, evaluation gates, dan A/B model untuk sistem AI yang bisa diandalkan 24/7. Sampai jumpa di episode 25!