Home Blog AI Systems in Production Episode 02
AI Systems in Production · Episode 02 AI & Agentic Systems 27 Juli 2025 11 min read

RAG Pipeline dari Zero — Chunking Strategy yang Benar

Tutorial ini membahas bagian yang paling sering diabaikan: chunking strategy. Pilihan yang salah di sini membuat retrieval buruk — dan ganti model LLM tidak akan memperbaikinya.

RM
Ryan Muliadi
Digital Systems Architect · Ryzen Digital Systems

Saya pernah menghabiskan dua hari mengganti model LLM untuk memperbaiki kualitas RAG — dari GPT-3.5 ke GPT-4, lalu ke Claude. Hasilnya nyaris tidak berubah.

Masalah sebenarnya ada di chunking strategy yang salah. Setelah saya fix chunk size dan overlap, akurasi retrieval naik 40% — tanpa ganti model apapun. Kualitas RAG jauh lebih bergantung pada bagaimana Anda memotong dokumen daripada model LLM yang Anda pakai.

Flow: RAG Pipeline — dari Dokumen ke Jawaban
DOKUMEN PDF · DOCX TXT · HTML CHUNKING 512 token 64 overlap EMBEDDING text-embedding -3-small VECTOR DB ChromaDB Supabase pgvec USER QUERY embed + search RETRIEVE top-k MMR k=4 LLM + CONTEXT jawab berdasarkan dokumen yang di-retrieve Step 1 Step 2 Step 3 Step 4 (index) Step 5 (query) Step 6 Indexing phase — dilakukan sekali saat ingest dokumen Query phase — setiap ada pertanyaan user

Apa Itu RAG dan Mengapa Dibutuhkan

RAG (Retrieval-Augmented Generation) adalah pattern di mana LLM tidak hanya mengandalkan training data-nya, tapi mencari informasi relevan dari knowledge base eksternal sebelum menjawab.

Definisi Kerja
RAG = Ambil dokumen relevan dari knowledge base → Masukkan ke context LLM → LLM menjawab berdasarkan dokumen tersebut, bukan training data.

Tanpa RAG, LLM tidak tahu tentang dokumen internal perusahaan, kebijakan terbaru, atau SOP spesifik organisasi Anda. RAG menyelesaikan ini — tapi implementasinya jauh lebih nuanced dari yang terlihat di tutorial sederhana.

Chunking — Bagian yang Paling Sering Salah

Chunking adalah proses memotong dokumen menjadi potongan kecil yang bisa disimpan di vector database. Ini satu keputusan paling berdampak pada kualitas RAG, dan paling sering diabaikan.

Chunk Size: Bukan Semakin Kecil Semakin Baik

  • Chunk terlalu kecil → kehilangan konteks. "Limit transaksi adalah 10 juta" tanpa kalimat sebelumnya tidak bermakna.
  • Chunk terlalu besar → noise tinggi. LLM mendapat terlalu banyak informasi tidak relevan, jawaban kurang fokus.
  • Sweet spot: 300–800 token untuk prose, 50–150 token untuk code snippets.

Overlap: Jangan Sampai Konteks Terpotong

Selalu gunakan overlap antar chunk. Kalimat penting yang kebetulan ada di batas potongan akan muncul di kedua chunk berkat overlap, sehingga tidak hilang dari retrieval.

Rule of thumb: overlap 10–20% dari chunk size. Untuk chunk 512 karakter, gunakan overlap 50–64 karakter.

Python · LangChain RecursiveCharacterTextSplitter
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Untuk prose / dokumen biasa
splitter = RecursiveCharacterTextSplitter(
    chunk_size=512,      # ~400 token untuk Bahasa Indonesia
    chunk_overlap=64,    # ~12% overlap — jangan biarkan nol
    separators=["\n\n", "\n", ".", " "]
)

# JANGAN ini — memotong tanpa mempertimbangkan semantik kalimat
# bad = CharacterTextSplitter(chunk_size=100)
⚠️ Selalu Gunakan Overlap

Overlap 10–20% dari chunk size memastikan kalimat penting yang kebetulan ada di batas potongan tetap muncul di salah satu chunk. Tanpa overlap, informasi di batas chunk bisa hilang dan tidak ter-retrieve.

Embedding Model — Pilihan yang Sering Diabaikan

Embedding adalah representasi vektor dari teks. Kualitas embedding menentukan seberapa akurat retrieval menemukan dokumen yang relevan.

ModelBahasa IndonesiaCostRekomendasi
OpenAI text-embedding-3-small△ Cukup$0.02/1M tokenDefault untuk mulai
OpenAI text-embedding-3-large✓ Baik$0.13/1M tokenJika akurasi kritis
Cohere embed-multilingual-v3✓ Terbaik$0.10/1M tokenKonten Indonesia heavy
sentence-transformers (local)△ VariesGratisSelf-hosted, latency tinggi

Full Pipeline: Dari PDF ke Query

Python · Full RAG Pipeline
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma

# 1. Load dokumen
docs = PyPDFLoader("sop-penanganan-keluhan.pdf").load()

# 2. Chunk
chunks = RecursiveCharacterTextSplitter(
    chunk_size=512, chunk_overlap=64
).split_documents(docs)

# 3. Embed + simpan ke vector store
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 4. Retriever dengan MMR — hindari hasil yang redundan
retriever = vectorstore.as_retriever(
    search_type="mmr",
    search_kwargs={"k": 4, "fetch_k": 20}
)

results = retriever.invoke("SLA untuk kerusakan kategori minor?")
for doc in results:
    print(doc.page_content)
    print(f"Source: {doc.metadata['source']}, page {doc.metadata['page']}")
💡 Kenapa MMR bukan Similarity Search biasa?

Maximum Marginal Relevance menghindari mengambil chunk yang redundan. Dari 20 candidate hasil similarity search, MMR memilih 4 yang paling diverse — memberikan LLM konteks yang lebih kaya.

Evaluasi — Jangan Skip Bagian Ini

01
Retrieval Precision
Dari k chunk yang diambil, berapa persen yang benar-benar relevan dengan pertanyaan? Target minimal 70%. Di bawah itu, review chunking strategy dan embedding model terlebih dulu.
02
Answer Faithfulness
Apakah jawaban LLM bisa di-trace kembali ke dokumen yang di-retrieve? Hallucination terjadi ketika LLM menggunakan training knowledge-nya, bukan dokumen yang diberikan. Ukur ini dengan library RAGAs.
03
Context Relevance
Apakah konteks yang di-retrieve memang mengandung jawaban dari pertanyaan? Ini mengidentifikasi apakah chunking memotong informasi penting di batas yang salah.

Kesimpulan

Urutan prioritas saat RAG tidak berfungsi baik: 1) Chunking strategy → 2) Embedding model → 3) Retrieval method → 4) Prompt → 5) LLM model. Jangan mulai dari nomor 5.

Ganti LLM adalah langkah terakhir, bukan pertama. Perbaiki chunking dan retrieval dulu — itu yang paling sering jadi akar masalahnya.

Episode berikutnya: LangGraph State Machine — cara membangun agentic workflow yang lebih kompleks dengan state machine pattern, checkpoint, dan human-in-the-loop.

Series: AI Systems in Production · 6 artikel
01 Apa Itu AI Agent? Bukan Chatbot, Bukan Automation Biasa
02 RAG Pipeline dari Zero — Chunking Strategy yang Benar ← You are here
03 LangGraph State Machine — Bagian yang Tutorial Skip
04 Prompt vs Context vs Harness Engineering — Apa Bedanya?
05 Circuit Breaker untuk AI Agent — Mencegah Infinite Loop
06 Evaluasi Output LLM — Beyond Does It Sound Right?