LLM seperti GPT-4 atau Llama 3 sangat pintar, ia bisa menulis kode, merangkum dokumen, hingga menjawab pertanyaan rumit. Tapi ada satu batasan mendasar: model hanya tahu apa yang ada dalam training datanya. Ia tidak tahu isi laporan internal kantor Anda, dokumen kebijakan terbaru, atau database produk perusahaan.
Bayangkan Anda punya 10.000 halaman SOP dan regulasi. Pegawai baru butuh waktu berbulan-bulan untuk menghafalnya. Bagaimana kalau ada asisten AI yang bisa menjawab pertanyaan seperti “Apa prosedur pengadaan barang di atas 200 juta?” langsung dari dokumen tersebut?
Di sinilah RAG (Retrieval-Augmented Generation) hadir sebagai solusinya.
1. Apa itu RAG?
RAG adalah teknik yang menggabungkan kemampuan pencarian (retrieval) dengan kemampuan generasi teks (generation) dari LLM.
Analoginya: bayangkan ujian open-book. Murid yang pintar tidak perlu menghafal semua rumus, saat ada soal, ia membuka buku yang tepat, menemukan halaman yang relevan, lalu menjawab berdasarkan referensi tersebut. RAG bekerja persis seperti itu:
- Terima pertanyaan user
- Cari dokumen atau teks yang paling relevan
- Berikan teks tersebut ke LLM sebagai konteks
- LLM menjawab berdasarkan konteks yang diberikan
Pipeline dasar RAG:
Query → Retrieve → Augment → Generate
RAG vs Fine-tuning
Banyak yang bertanya: kenapa tidak fine-tune saja modelnya dengan data internal kita?
| Aspek | RAG | Fine-tuning |
|---|---|---|
| Cara kerja | Beri konteks saat inferensi | Ubah bobot model |
| Update data | Tambah dokumen saja | Latih ulang model |
| Biaya | Lebih murah | Lebih mahal |
| Cocok untuk | Data yang sering berubah | Gaya bahasa / domain khusus |
| Hallucination | Lebih terkontrol (ada sumber) | Lebih berisiko |
RAG tidak mengubah model, ia hanya memberi “catatan contekan” yang relevan ke LLM saat menjawab. Hasilnya: lebih mudah diupdate, lebih hemat biaya, dan sumber jawaban bisa dilacak.
2. Anatomi Pipeline RAG
Pipeline RAG terdiri dari dua fase besar: indexing (dikerjakan sekali / offline) dan retrieval + generation (dikerjakan setiap kali ada query).
Tahap Indexing
Dokumen → Chunking → Embedding → Vector Database
- Dokumen masuk: PDF, Word, teks, HTML, markdown, dll.
- Chunking: Dokumen dipotong-potong menjadi potongan kecil (chunk). Misalnya, satu dokumen 50 halaman dipotong menjadi 200 chunk berisi 3-5 paragraf masing-masing.
- Embedding: Setiap chunk diubah menjadi vektor (array angka) menggunakan embedding model. Chunk yang bermakna mirip akan menghasilkan vektor yang secara matematika berdekatan.
- Simpan ke Vector Database: Vektor beserta teks aslinya disimpan di database khusus yang bisa dicari dengan efisien.
Tahap Retrieval
Query → Embed Query → Cari Nearest Neighbor → Ambil Top-K Chunk
- Query masuk: “Apa prosedur pengadaan barang di atas 200 juta?”
- Embed query: Query juga diubah menjadi vektor menggunakan embedding model yang sama.
- Nearest neighbor search: Vector database mencari chunk-chunk yang vektornya paling dekat dengan vektor query.
- Ambil top-k: Misalnya 5 chunk paling relevan dikembalikan.
Tahap Generation
Chunk Relevan + Query → LLM → Jawaban
Chunk-chunk relevan dan query asli disusun menjadi prompt, lalu dikirim ke LLM:
Konteks:
[Chunk 1]: Pengadaan barang di atas Rp200 juta wajib melalui lelang terbuka...
[Chunk 2]: Proses lelang minimal membutuhkan 3 peserta yang qualified...
Pertanyaan: Apa prosedur pengadaan barang di atas 200 juta?
Jawab berdasarkan konteks di atas saja.
LLM kemudian menghasilkan jawaban berdasarkan konteks yang diberikan — bukan dari training data-nya.
Contoh hasil jawaban LLM:
Berdasarkan dokumen yang tersedia, pengadaan barang dengan nilai di atas
Rp200 juta wajib dilakukan melalui mekanisme lelang terbuka. Proses lelang
ini mensyaratkan minimal 3 peserta yang telah memenuhi kualifikasi yang
ditetapkan. Penunjukan langsung hanya diperbolehkan dalam kondisi tertentu
seperti keadaan darurat atau pengadaan yang bersifat rahasia negara.
Sumber: [Chunk 1] SOP Pengadaan Barang dan Jasa, hal. 12-14
Sumber bisa dilacak! Perhatikan bahwa LLM menyertakan referensi ke chunk sumber. Ini adalah salah satu keunggulan RAG, jawaban bisa dilacak balik ke dokumen aslinya, sehingga mudah diverifikasi.
3. Apa itu Embedding dan Vector Database?
Embedding: Mengubah Teks Menjadi Angka
Embedding adalah proses mengubah teks (atau gambar, audio, dll.) menjadi array angka yang disebut vektor. Vektor ini bukan sekadar angka acak; ia merepresentasikan makna dari teks tersebut.
Contoh sederhana (dimensi dikecilkan untuk ilustrasi):
"kucing" → [0.12, 0.85, 0.33, ...]
"anjing" → [0.11, 0.82, 0.35, ...] ← dekat dengan "kucing"
"mobil" → [0.91, 0.04, 0.77, ...] ← jauh dari "kucing"
Makna yang mirip → vektor yang berdekatan. Itulah kenapa pencarian berdasarkan vektor bisa menemukan dokumen yang relevan secara semantik, bukan hanya kata kunci yang sama persis (exact match).
Contoh semantik: Query “cara install python” bisa menemukan dokumen yang berisi “langkah-langkah setup Python di Windows” meskipun kata-katanya berbeda.
Vector Database: Database untuk Mencari Vektor
Database konvensional (PostgreSQL, MySQL) dioptimalkan untuk pencarian exact match atau range query: WHERE id = 123 atau WHERE price BETWEEN 100 AND 200.
Vector database dioptimalkan untuk hal yang berbeda: Approximate Nearest Neighbor (ANN) search, mencari K vektor yang paling dekat dengan vektor query dari jutaan atau miliaran vektor.
| Aspek | Database Relasional | Vector Database |
|---|---|---|
| Jenis query | Exact match, range | Nearest neighbor |
| Index | B-tree, Hash | HNSW, IVF |
| Cocok untuk | Transaksi, structured data | Pencarian semantik |
| Output | Row yang cocok | Top-K vektor terdekat |
Algoritma seperti HNSW (Hierarchical Navigable Small World) memungkinkan pencarian jutaan vektor dalam milidetik sehingga tidak perlu membandingkan query dengan setiap vektor satu per satu.
4. Macam-macam Vector Database
| Database | Jenis | Kelebihan | Kekurangan |
|---|---|---|---|
| Qdrant | Open source / Cloud | Filtering kuat, payload rich, REST+gRPC, Rust-based | Ekosistem lebih kecil dibanding Milvus |
| Weaviate | Open source / Cloud | GraphQL native, hybrid search bawaan | Setup lebih kompleks |
| Chroma | Open source | Ringan, mudah, cocok development & prototyping | Kurang fit untuk production skala besar |
| Milvus | Open source / Cloud | Skalabilitas tinggi, enterprise-ready | Setup infrastruktur kompleks |
| Pinecone | Cloud managed | Mudah dipakai, fully managed, zero ops | Vendor lock-in, berbayar |
| pgvector | Extension PostgreSQL | Familiar SQL, tidak perlu infrastruktur baru | Performa tidak seoptimal dedicated vector DB |
Kapan Pakai Apa?
- Development / prototyping
- Chroma — ringan, zero config, bisa jalan in-memory.
- Production dengan kontrol penuh
- Qdrant atau Milvus — open source, bisa self-host.
- Sudah pakai PostgreSQL
- pgvector — tambah extension saja, tidak perlu layanan baru.
- Tim kecil, tidak mau urus infra
- Pinecone — fully managed, API-first.
- Enterprise, data processing pipeline
- Milvus — skalabilitas tinggi, ekosistem lengkap.
Pada AI Series kali ini kita akan lebih banyak membahas Qdrant karena saya sendiri menggunakan database ini di project yang sedang saya kerjakan.
Contoh: Menjalankan Qdrant dengan Docker
# Pull dan jalankan Qdrant
docker pull qdrant/qdrant
docker run -p 6333:6333 -v $(pwd)/qdrant_storage:/qdrant/storage qdrant/qdrant
Setelah jalan, Qdrant tersedia di http://localhost:6333. Bisa juga akses dashboard-nya di http://localhost:6333/dashboard.
# Buat collection baru via REST API
curl -X PUT ' \
-H 'Content-Type: application/json' \
-d '{
"vectors": {
"size": 768,
"distance": "Cosine"
}
}'
# Cek status collection
curl '
5. Embedding Model
Embedding model adalah model AI yang bertugas mengubah teks menjadi vektor. Ini berbeda dengan LLM, embedding model tidak menghasilkan teks, ia hanya mengkodekan teks menjadi representasi numerik.
Sparse vs Dense vs Hybrid
| Jenis | Cara Kerja | Contoh | Kelebihan |
|---|---|---|---|
| Sparse (BM25) | Hitung frekuensi kata | Elasticsearch | Cepat, exact keyword match |
| Dense (Neural) | Neural network → vektor padat | BGE-M3, text-embedding-3 | Pencarian semantik |
| Hybrid | Gabungkan keduanya | BGE-M3, Weaviate hybrid | Terbaik dari keduanya |
Model Populer
BGE-M3 (BAAI)
Saat ini salah satu yang terbaik untuk Bahasa Indonesia:
- Mendukung 100+ bahasa termasuk Bahasa Indonesia
- Bisa menghasilkan sparse, dense, dan multi-vector sekaligus
- Dimensi: 1024
- Gratis, bisa dijalankan lokal
# Install dan coba BGE-M3 via Ollama
ollama pull bge-m3
Ollama Embedding API
Cara universal untuk embed teks via model lokal:
- REST API tersedia di
http://localhost:11434 - Mendukung semua embedding model yang sudah di-pull via Ollama
- Kompatibel dengan format request OpenAI
# Embed satu teks dengan nomic-embed-text
curl \
-H "Content-Type: application/json" \
-d '{
"model": "nomic-embed-text",
"input": "Apa prosedur pengadaan barang?"
}' # Embed batch — banyak teks sekaligus
curl \
-H "Content-Type: application/json" \
-d '{
"model": "nomic-embed-text",
"input": [
"Pengadaan barang di atas Rp200 juta wajib melalui lelang...",
"Penunjukan langsung untuk nilai di bawah Rp50 juta..."
]
}'
nomic-embed-text
Open source, cepat:
# Jalankan lokal via Ollama
ollama pull nomic-embed-text
ollama run nomic-embed-text
Jina Embeddings — multilingual, mendukung Bahasa Indonesia dengan baik.
Cara Memilih Embedding Model
- Bahasa: Apakah model mendukung Bahasa Indonesia? Cek benchmark MTEB (Massive Text Embedding Benchmark).
- Dimensi: Dimensi lebih besar = lebih akurat tapi lebih lambat dan butuh lebih banyak storage.
- Lokal vs Cloud: Model lokal (via Ollama) gratis tapi butuh resource; cloud ada biaya per token.
- Konsistensi: Embedding model yang dipakai saat indexing harus sama dengan saat query. Jangan ganti model setelah data diindex.
Perhatian! Embedding model yang dipakai saat indexing harus sama dengan saat retrieval. Jika Anda ganti model, seluruh data harus di-index ulang dari awal.
6. Reranker
Retrieval berbasis nearest neighbor (ANN) cepat dan scalable, tapi tidak selalu presisi. Ia mengurutkan chunk berdasarkan jarak vektor — yang secara kasar mewakili relevansi, tapi tidak sempurna.
Reranker hadir sebagai tahap kedua: setelah retrieval mengambil top-50 chunk kandidat, reranker menghitung ulang skor relevansi setiap chunk terhadap query dengan model yang lebih akurat (tapi lebih lambat).
Pipeline dengan Reranker
Query → Retrieve (top-50) → Rerank → Ambil top-5 → Generate
Tanpa reranker, Anda mungkin memberi LLM chunk yang “agak relevan”. Dengan reranker, chunk yang masuk ke LLM benar-benar yang paling relevan.
Model Reranker Populer
| Model | Provider | Catatan |
|---|---|---|
| BGE Reranker | BAAI | Open source, bisa lokal, multilingual |
| Cohere Rerank | Cohere | Cloud API, performa sangat baik |
| Jina Reranker | Jina AI | Multilingual, ada versi gratis |
| ms-marco-MiniLM | Hugging Face | Ringan, cocok production |
Untuk reranking lokal, kita bisa menggunakan Infinity — server embedding dan reranking open source yang menyediakan REST API. Jalankan via Docker:
# Jalankan Infinity server dengan model BGE Reranker
docker run -p 7997:7997 michaelf34/infinity:latest \
v2 --model-name-or-path BAAI/bge-reranker-v2-m3 --port 7997
Setelah server berjalan, kirim request rerank via curl:
# Rerank dokumen via Infinity API lokal
curl \
-H "Content-Type: application/json" \
-d '{
"query": "prosedur pengadaan barang",
"documents": [
"Pengadaan barang di atas Rp200 juta wajib melalui lelang...",
"Tata cara pengajuan anggaran tahunan...",
"Pengadaan langsung dapat dilakukan untuk nilai di bawah..."
],
"return_documents": true
}'
Reranker biasanya berjalan dalam hitungan milidetik hingga detik untuk 50 dokumen, tradeoff kecepatan yang sangat worthwhile untuk presisi yang jauh lebih baik.
7. Tools dan Framework untuk RAG
Membangun pipeline RAG dari nol bisa sangat kompleks. Untungnya, ekosistem framework sudah sangat matang.
LlamaIndex
Framework yang paling fokus ke RAG dan document processing. Cocok jika kebutuhan utama Anda adalah membangun aplikasi berbasis dokumen.
Fitur utama:
- Data connectors (PDF, Word, Notion, Confluence, dll.)
- Node parsers & chunk strategies
- Query engines dengan berbagai jenis retrieval
- Evaluasi bawaan
LangChain
Framework orchestration yang lebih general. Cocok untuk membangun aplikasi LLM yang kompleks, termasuk RAG.
Ekosistem sangat besar: 300+ integrations dengan vector DB, LLM, tools, dan APIs.
Haystack
Framework production-ready dari deepset. Sangat cocok untuk enterprise NLP karena pipeline declaratif, mudah diuji dan dideploy.
Ragas
Bukan framework untuk membangun RAG, tapi untuk mengevaluasi kualitas RAG. Mengukur:
- Context Precision: Seberapa relevan chunk yang diambil?
- Context Recall: Apakah semua informasi yang dibutuhkan ada di chunk?
- Answer Faithfulness: Apakah jawaban LLM sesuai konteks (tidak hallucinate)?
- Answer Relevance: Seberapa relevan jawaban dengan pertanyaan?
# Install Ragas
pip install ragas
DSPy
Framework dari Stanford yang mengubah cara Anda membangun pipeline LLM. Alih-alih menulis prompt secara manual, Anda mendefinisikan behavior dan DSPy mengoptimasi prompt secara otomatis.
8. Strategi Chunking
Cara Anda memotong dokumen (chunking) sangat mempengaruhi kualitas retrieval. Chunk yang terlalu kecil kehilangan konteks; terlalu besar memasukkan informasi tidak relevan ke LLM.
Fixed-size Chunking
Potong dokumen setiap N karakter atau N token, dengan overlap tertentu.
[...karakter 1-500...][...karakter 400-900...][...karakter 800-1300...]
Chunk 1 Chunk 2 Chunk 3
(overlap 100) (overlap 100) Kelebihan: sederhana, deterministik. Kekurangan: bisa memotong di tengah kalimat.
Sentence / Paragraph Chunking
Potong berdasarkan batas kalimat atau paragraf menggunakan library NLP.
# Contoh dengan NLTK
pip install nltk Kelebihan: setiap chunk adalah unit yang bermakna. Kekurangan: ukuran chunk bervariasi.
Semantic Chunking
Potong berdasarkan perubahan topik/makna, chunk baru dimulai saat embedding antara kalimat berubah signifikan. Lebih kompleks tapi hasilnya lebih baik untuk dokumen panjang dengan banyak topik.
Panduan Praktis Memilih Strategi
| Jenis Dokumen | Strategi Rekomendasi |
|---|---|
| Dokumen regulasi / SOP | Paragraph chunking |
| Buku teks / artikel panjang | Semantic chunking |
| FAQ / Q&A | Pisahkan per pasang Q&A |
| Laporan keuangan terstruktur | Fixed-size dengan overlap besar |
| Kode program | Chunking per fungsi / class |
Kualitas chunking adalah salah satu faktor terbesar yang menentukan kualitas RAG. Kita akan membahas evaluasi dan optimasi kualitas retrieval lebih mendalam di artikel berikutnya.
Untuk mulai bereksperimen, Anda bisa:
- Jalankan Qdrant atau Chroma sebagai vector database lokal
- Gunakan nomic-embed-text via Ollama sebagai embedding model gratis
- Coba LlamaIndex atau LangChain untuk orchestration pipeline
- Evaluasi hasilnya dengan Ragas
Demikian tulisan ini, semoga bermanfaat dan Happy Coding!
PakarPBN
A Private Blog Network (PBN) is a collection of websites that are controlled by a single individual or organization and used primarily to build backlinks to a “money site” in order to influence its ranking in search engines such as Google. The core idea behind a PBN is based on the importance of backlinks in Google’s ranking algorithm. Since Google views backlinks as signals of authority and trust, some website owners attempt to artificially create these signals through a controlled network of sites.
In a typical PBN setup, the owner acquires expired or aged domains that already have existing authority, backlinks, and history. These domains are rebuilt with new content and hosted separately, often using different IP addresses, hosting providers, themes, and ownership details to make them appear unrelated. Within the content published on these sites, links are strategically placed that point to the main website the owner wants to rank higher. By doing this, the owner attempts to pass link equity (also known as “link juice”) from the PBN sites to the target website.
The purpose of a PBN is to give the impression that the target website is naturally earning links from multiple independent sources. If done effectively, this can temporarily improve keyword rankings, increase organic visibility, and drive more traffic from search results.

