BAB 17
Sumber: Disusun berdasarkan riset terkini tentang RAG, vector databases, dan knowledge-augmented AI Estimasi Waktu: 40-50 menit Prasyarat: Pelajaran 04 (Generative AI Fundamentals)
Materi ini menjelaskan RAG (Retrieval-Augmented Generation), salah satu teknik terpenting untuk membuat AI lebih akurat dan relevan. RAG mengatasi salah satu keterbatasan terbesar AI: pengetahuan yang terbatas dan kadang usang. Dengan RAG, AI bisa mengakses informasi terkini dan spesifik dari sumber yang kamu tentukan.
Setelah mempelajari materi ini, kamu akan mampu:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β KETERBATASAN PENGETAHUAN AI β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. KNOWLEDGE CUTOFF β
β β Pengetahuan AI berhentu di tanggal tertentu β
β β Tidak tahu peristiwa setelahnya β
β β
β 2. HALUSINASI β
β β AI bisa membuat jawaban yang terdengar benar β
β tapi sebenarnya salah β
β β
β 3. KURANG SPESIFISITAS β
β β Pengetahuan umum, bukan spesifik organisasi β
β β Tidak tahu SOP, data internal, konteks unik β
β β
β 4. TIDAK BISA MENYITIR β
β β Sulit memberikan referensi tepat ke sumber β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
User: "Berapa kebijakan cuti tahunan di perusahaan saya?"
AI (tanpa RAG): "Kebijakan cuti bervariasi antar perusahaan..." β Generik, tidak spesifik
AI (dengan RAG): "Berdasarkan dokumen HR perusahaan Anda, karyawan mendapat 12 hari cuti tahunan..." β Spesifik dan akurat
Retrieval-Augmented Generation (RAG) adalah teknik di mana AI mencari informasi relevan dari sumber eksternal sebelum menghasilkan jawaban. Alih-alih mengandalkan pengetahuan bawaan saja, AI mengambil konteks spesifik dari database, dokumen, atau API.
AI tanpa RAG = Menjawab ujian dengan open-book tapi bukunya di rumah
(hanya mengandalkan apa yang diingat)
AI dengan RAG = Menjawab ujian dengan open-book dan bukunya ada di meja
(bisa melihat referensi yang tepat sebelum menjawab)
| Aspek | RAG | Fine-tuning | Prompt Biasa |
|---|---|---|---|
| Biaya | Rendah-Sedang | Tinggi | Rendah |
| Data terkini | Ya (real-time) | Tidak (perlu retrain) | Tidak |
| Spesifisitas | Tinggi | Sedang | Rendah |
| Sumber bisa disitir | Ya | Tidak | Tidak |
| Kompleksitas setup | Sedang | Tinggi | Rendah |
| Privacy control | Tinggi (data lokal) | Sedang | Rendah |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ALUR KERJA RAG β
β β
β FASE INDEXING (dilakukan sekali/sekaligus) β
β β
β Dokumen βββΊ Chunking βββΊ Embedding βββΊ Vector Database β
β (PDF, dll) (pecah (ubah jadi (simpan β
β jadi potongan) angka/vektor) vektor) β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β FASE QUERY (setiap kali user bertanya) β
β β
β Pertanyaan βββΊ Embedding βββΊ Search βββΊ Retrieve β
β User (ubah jadi (cari yang (ambil top-k β
β vektor) paling mirip) chunk terbaik) β
β β
β β β
β v β
β β
β Pertanyaan + Konteks βββΊ LLM βββΊ Jawaban β
β (retrieved chunks) (generate (dengan sumber β
β dengan konteks) yang bisa disitir) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Mengumpulkan sumber pengetahuan:
Memecah dokumen panjang menjadi potongan-potongan kecil:
Dokumen asli (5000 kata):
βββββββββββββββββββββββββββββββββββββββ
β Paragraf 1 β Paragraf 2 β Paragraf 3 β ...
βββββββββββββββββββββββββββββββββββββββ
Setelah chunking:
Chunk 1: [Paragraf 1 + awal Paragraf 2]
Chunk 2: [Paragraf 2 + awal Paragraf 3]
Chunk 3: [Paragraf 3 + awal Paragraf 4]
...
Mengubah setiap chunk menjadi vektor (serangkaian angka) yang merepresentasikan makna semantiknya:
"Saya suka makan nasi goreng" β [0.12, -0.34, 0.56, ..., 0.78] (1536 dimensi)
"Makanan favorit saya adalah nasi goreng" β [0.11, -0.33, 0.55, ..., 0.77]
β Mirip karena maknanya mirip
Yang penting dipahami:
Menyimpan semua vektor di database yang dioptimalkan untuk pencarian similarity:
| Vector DB | Karakteristik |
|---|---|
| ChromaDB | Open-source, mudah digunakan, cocok untuk pemula |
| Pinecone | Cloud-managed, scalable, production-ready |
| Weaviate | Open-source, fitur lengkap, hybrid search |
| Qdrant | High-performance, Rust-based |
| FAISS | Library dari Meta, sangat cepat, in-memory |
| pgvector | Extension PostgreSQL, mudah diintegrasikan |
Pertanyaan user diubah menjadi vektor menggunakan model embedding yang sama.
Mencari chunk yang paling mirip (nearest neighbors) berdasarkan jarak vektor:
Pertanyaan: "Apa kebijakan cuti hamil?"
Vektor pertanyaan βββΊ Cari yang terdekat βββΊ
β Chunk tentang "cuti hamil 3 bulan" (similarity: 0.94)
β Chunk tentang "prosedur pengajuan cuti" (similarity: 0.72)
β Chunk tentang "cuti tahunan 12 hari" (similarity: 0.45)
Chunk yang ditemukan ditambahkan ke prompt sebagai konteks:
System: Jawab pertanyaan berdasarkan konteks yang diberikan.
Jika konteks tidak cukup, katakan bahwa kamu tidak tahu.
Konteks:
[Chunk 1: Kebijakan cuti hamil di perusahaan X adalah 3 bulan...]
[Chunk 2: Pengajuan cuti harus disetujui oleh supervisor...]
Pertanyaan: Apa kebijakan cuti hamil?
Jawab:
Masalah: Chunk yang diambil tidak relevan atau yang relevan justru tidak ditemukan.
Solusi:
Masalah: LLM cenderung mengabaikan informasi di tengah-tengah konteks yang panjang.
Solusi:
Masalah: Beberapa pertanyaan membutuhkan informasi dari beberapa sumber berbeda.
Solusi:
Masalah: Meskipun dengan konteks, AI tetap bisa mengarang.
Solusi:
Pertanyaan: Apa yang ingin kamu capai?
ββ Perilaku/style baru βββββββββββββΊ FINE-TUNING
β (AI harus bicara seperti ahli hukum,
β menulis dalam gaya brand tertentu)
β
ββ Pengetahuan baru/fakta ββββββββββΊ RAG
β (AI harus tahu data perusahaan,
β kebijakan internal, info terkini)
β
ββ Keduanya βββββββββββββββββββββββΊ RAG + FINE-TUNING
β (AI harus tahu data internal DAN
β berinteraksi dengan gaya tertentu)
β
ββ Cukup pengetahuan umum βββββββββΊ PROMPTING BIASA
(AI cukup menggunakan pengetahuan
bawaan dengan instruksi yang jelas)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β RAG TECH STACK β
β β
β Framework: β
β - LangChain / LlamaIndex / Haystack β
β β
β Embedding Model: β
β - OpenAI text-embedding-3-small/large β
β - Cohere embed-multilingual β
β - Sentence Transformers (open-source) β
β β
β Vector Database: β
β - ChromaDB / Pinecone / Weaviate / pgvector β
β β
β LLM: β
β - Claude / GPT-4 / Gemini / Llama (open-source) β
β β
β Document Processing: β
β - Unstructured / PyPDF / DocETL β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# 1. Load dokumen
documents = load_documents("./knowledge_base/")
# 2. Pecah menjadi chunks
chunks = split_documents(documents, chunk_size=500, overlap=50)
# 3. Buat embedding dan simpan
for chunk in chunks:
embedding = embed(chunk.text)
vector_db.store(embedding, metadata=chunk.metadata)
# 4. Query time
def answer_question(question):
# Cari chunks relevan
query_embedding = embed(question)
relevant_chunks = vector_db.search(query_embedding, top_k=5)
# Buat prompt dengan konteks
context = "\n".join([chunk.text for chunk in relevant_chunks])
prompt = f"""
Berdasarkan konteks berikut, jawab pertanyaan.
Jika konteks tidak cukup, katakan kamu tidak tahu.
Konteks: {context}
Pertanyaan: {question}
"""
# Generate jawaban
answer = llm.generate(prompt)
return answer