Lewati ke konten utama
  1. AI/

RAG untuk Pemula: Menjawab Pertanyaan dari Dokumen Sendiri

Penulis
GezyTech
Menulis tentang AI, Linux, Server, Docker, dan teknologi lainnya.

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)
#

  1. Ambil dokumen — PDF, teks, markdown, database, dll.
  2. Chunking — pecah dokumen jadi potongan kecil (misal 500–1000 token).
  3. Embedding — ubah tiap potongan jadi vektor angka (menggunakan model embedding).
  4. Simpan — masukkan vektor ke vector store (FAISS, Chroma, Pinecone, dsb).

2. Query (saat bertanya)
#

  1. Embed pertanyaan — ubah pertanyaan jadi vektor dengan model yang sama.
  2. Retrieve — cari potongan dokumen yang vektornya paling mirip (similarity search).
  3. 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 ──► Jawaban

Apa 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 openai

Kode:

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