Home / Tutorial / AI Development / AI Knowledge Base (RAG)
AI Development

Cara Membuat AI Knowledge Base dari Data Sendiri (RAG)

18 Maret 2026 15 menit baca Tingkat: Menengah–Lanjut

Bayangkan chatbot yang bisa menjawab pertanyaan berdasarkan dokumen, laporan, atau database milik Anda sendiri β€” bukan dari internet umum. Inilah yang dimaksud AI Knowledge Base berbasis RAG. Tutorial ini akan menjelaskan cara membuatnya dari nol.

RAG = AI yang "Tahu" Data Anda

πŸ’‘ Apa itu RAG?

RAG (Retrieval-Augmented Generation) adalah teknik di mana AI tidak hanya mengandalkan training data-nya, tapi juga mengambil ulang (retrieve) informasi relevan dari database Anda saat menjawab pertanyaan.

Hasilnya: chatbot yang akurat, up-to-date, dan bisa di-customize penuh sesuai domain bisnis Anda.

πŸ—οΈ Arsitektur Sistem RAG

Sebelum coding, pahami dulu alur sistemnya. RAG terdiri dari dua fase utama:

πŸ’° Estimasi Biaya API (2026)

  • Embedding (text-embedding-3-small): ~$0.02/1000 halaman
  • GPT-5.4 mini: $0.25 input / $2.00 per 1M token
  • GPT-5.4: $2.50 input / $15.00 per 1M token
  • Gemini 3 Flash: $0.50 input / $3.00 per 1M token
  • Claude Haiku 4.6: $1.00 input / $5.00 per 1M token
  • 1 query RAG β‰ˆ 1.000–3.000 token total

πŸ” Fase Query (Setiap Chat)

  1. User kirim pertanyaan
  2. Embed pertanyaan β†’ cari vektor paling mirip
  3. Ambil chunk relevan dari DB
  4. Kirim ke LLM + generate jawaban
User Query
    ↓
[Embedding Model] β†’ Query Vector
    ↓
[Vector DB] ← Similarity Search
    ↓
Top-K Relevant Chunks
    ↓
[LLM] + System Prompt + Chunks
    ↓
Generated Answer

πŸ› οΈ Persiapan: Tools & API Key

Yang dibutuhkan sebelum mulai:

Checklist Tools:

  • βœ… Python 3.9+ β€” runtime utama
  • βœ… OpenAI API Key β€” untuk embedding & LLM (platform.openai.com)
  • βœ… Vector Database β€” pilih salah satu:
    • πŸ”΅ Pinecone β€” cloud/managed, free tier terbatas
    • 🟒 ChromaDB β€” local/self-hosted, open source
    • 🟑 Weaviate β€” hybrid, cocok produksi
    • 🟣 Qdrant β€” performa tinggi, cloud atau self-host
  • βœ… LLM Provider β€” pilih sesuai budget:
    • πŸ’° GPT-5.4 mini (OpenAI) β€” paling hemat, kualitas baik
    • ⚑ Gemini 3 Flash (Google) β€” cepat, murah, 1M context window
    • πŸ”’ Claude Haiku 4.6 (Anthropic) β€” aman, mudah dikontrol
    • πŸ†“ Llama 4 (Meta) β€” open source, self-host gratis
  • βœ… Server/VPS β€” untuk deployment (minimal 1 GB RAM)

πŸ’° Estimasi Biaya API: Embedding dengan text-embedding-3-small sekitar $0.02 per 1.000 halaman dokumen. Untuk query/chat menggunakan GPT-5.4 mini sekitar $0.005–$0.015 per percakapan tergantung panjang konteks.

Install dependencies:

pip install openai chromadb langchain langchain-openai \
    pypdf python-docx pandas tiktoken fastapi uvicorn

# Atau jika pakai Google Gemini:
pip install google-generativeai

# Atau Llama 4 via Ollama (lokal, gratis):
# https://ollama.com/library/llama4

πŸ“‚ Step 1: Persiapkan & Chunking Data

Ini adalah step yang paling kritis β€” dan paling sering salah. Kualitas chunking sangat menentukan akurasi jawaban.

Load Dokumen:

from langchain.document_loaders import PyPDFLoader, CSVLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Load PDF
loader = PyPDFLoader("data/dokumen-kasus.pdf")
documents = loader.load()

# Chunking β€” ini yang tricky!
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=512,       # karakter per chunk
    chunk_overlap=50,     # overlap antar chunk
    separators=["\n\n", "\n", ".", " "]
)
chunks = text_splitter.split_documents(documents)

⚠️ Masalah yang Sering Terjadi di Sini:

  • Chunk terlalu besar β†’ konteks tidak relevan, jawaban melantur
  • Chunk terlalu kecil β†’ informasi terpotong di tengah kalimat penting
  • Dokumen PDF dengan tabel/gambar β†’ teks tidak ter-extract dengan benar
  • Dokumen bahasa Indonesia β†’ perlu fine-tuning separator
  • Data duplikat β†’ AI menjawab redundan

Tidak ada angka chunk_size yang universal β€” harus di-eksperimen per jenis dokumen.

πŸ”’ Step 2: Buat Embedding

Embedding mengubah teks menjadi array angka (vektor) yang merepresentasikan makna semantiknya.

import openai
import os

# Gunakan provider sesuai kebutuhan:
# OpenAI (paling umum)
openai.api_key = os.environ["OPENAI_API_KEY"]

def get_embedding(text: str) -> list[float]:
    response = openai.embeddings.create(
        model="text-embedding-3-small",  # atau text-embedding-3-large
        input=text
    )
    return response.data[0].embedding

# Atau Gemini Embedding (lebih murah):
# from google.generativeai import embed_content
# result = embed_content(model="models/gemini-embedding-exp-03-07", content=text)

# Embed semua chunk
embeddings = []
for chunk in chunks:
    emb = get_embedding(chunk.page_content)
    embeddings.append({
        "text": chunk.page_content,
        "embedding": emb,
        "metadata": chunk.metadata
    })

πŸ’‘ Tips: Untuk dokumen besar (1000+ halaman), proses embedding harus di-batch dan ada rate limit dari OpenAI. Perlu implementasi retry logic dan progress tracking agar tidak gagal di tengah jalan.

πŸ—„οΈ Step 3: Simpan ke Vector Database

Menggunakan ChromaDB (self-hosted) sebagai contoh:

import chromadb
from chromadb.utils import embedding_functions

# Setup ChromaDB
client = chromadb.PersistentClient(path="./chroma_db")
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
    api_key=os.environ["OPENAI_API_KEY"],
    model_name="text-embedding-3-small"
)

collection = client.get_or_create_collection(
    name="knowledge_base",
    embedding_function=openai_ef,
    metadata={"hnsw:space": "cosine"}  # cosine similarity
)

# Batch insert
batch_size = 100
for i in range(0, len(chunks), batch_size):
    batch = chunks[i:i+batch_size]
    collection.add(
        documents=[c.page_content for c in batch],
        ids=[f"chunk_{i+j}" for j in range(len(batch))],
        metadatas=[c.metadata for c in batch]
    )

⚠️ Jika menggunakan Pinecone (cloud): Setup lebih kompleks β€” perlu konfigurasi index dimension (1536 untuk text-embedding-3-small), pod type, dan environment. Ada biaya setelah free tier habis ($70+/bulan untuk production use).

πŸ” Step 4: Build Retrieval Pipeline

Ini adalah inti dari sistem β€” query user β†’ cari chunk relevan β†’ generate jawaban:

def answer_question(user_query: str, n_results: int = 5) -> str:
    # 1. Cari chunk relevan
    results = collection.query(
        query_texts=[user_query],
        n_results=n_results
    )
    context_chunks = results["documents"][0]
    
    # 2. Susun context
    context = "\n\n---\n\n".join(context_chunks)
    
    # 3. Kirim ke LLM β€” pilih model sesuai kebutuhan
    system_prompt = """Anda adalah asisten yang menjawab berdasarkan dokumen yang diberikan.
    Jika informasi tidak ada dalam context, katakan tidak tahu.
    Jangan mengarang jawaban di luar context yang diberikan."""
    
    # Opsi A: OpenAI GPT-5.4 mini (hemat)
    response = openai.chat.completions.create(
        model="gpt-5.4-mini",      # atau "gpt-5.4" untuk kualitas lebih tinggi
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": f"Context:\n{context}\n\nPertanyaan: {user_query}"}
        ],
        temperature=0.2  # rendah = lebih faktual
    )
    return response.choices[0].message.content

    # Opsi B: Google Gemini 3 Flash (lebih murah, context window 1M token)
    # import google.generativeai as genai
    # model = genai.GenerativeModel('gemini-3-flash')
    # response = model.generate_content(f"{system_prompt}\n\nContext:\n{context}\n\n{user_query}")
    
    # Opsi C: Llama 4 via Ollama (lokal, GRATIS)
    # import ollama
    # response = ollama.chat(model='llama4', messages=[...])

⚠️ Advanced Considerations:

  • Hallucination handling β€” LLM kadang tetap mengarang meski tidak ada di context
  • Multi-turn conversation β€” perlu manage chat history agar konteks tidak hilang
  • Hybrid search β€” kombinasi semantic + keyword search untuk akurasi lebih baik
  • Re-ranking β€” hasil retrieval perlu di-rerank sebelum dikirim ke LLM
  • Context window limit β€” GPT-4o max 128K token, hati-hati biaya meledak

πŸš€ Step 5: Deploy ke Server

Bungkus pipeline tadi dengan FastAPI dan deploy ke VPS:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class QueryRequest(BaseModel):
    query: str
    session_id: str | None = None

@app.post("/chat")
async def chat(request: QueryRequest):
    answer = answer_question(request.query)
    return {"answer": answer}

# Jalankan:
# uvicorn main:app --host 0.0.0.0 --port 8000

πŸ–₯️ Requirements Server

  • Min RAM: 2 GB (4 GB ideal)
  • OS: Ubuntu 20.04+
  • Python 3.9+
  • Nginx sebagai reverse proxy
  • SSL certificate (HTTPS wajib)

πŸ”’ Security Checklist

  • API key harus di environment variable
  • Rate limiting per IP/user
  • Input validation & sanitization
  • Auth middleware untuk endpoint
  • Monitoring & logging

πŸ”§ Troubleshooting Umum

AI menjawab tidak relevan / asal

Cek chunking strategy. Kemungkinan chunk terlalu besar atau n_results terlalu sedikit. Coba turunkan chunk_size dan naikkan n_results.

Error: Rate limit exceeded

Tambah exponential backoff dan retry logic saat indexing. Gunakan batch processing dengan delay antar batch.

Biaya API tiba-tiba membengkak

Pasang spending limit di OpenAI dashboard. Gunakan gpt-4o-mini untuk production agar lebih hemat. Monitor token usage per query.

ChromaDB corrupt setelah restart server

Gunakan PersistentClient dengan path yang benar, dan pastikan proses shutdown gracefully. Pertimbangkan migrasi ke Pinecone untuk production.

πŸ“‹ Ringkasan Kompleksitas

  • βœ… Konsep RAG: mudah dipahami
  • βœ… Kode dasar: bisa diikuti pemula Python
  • ⚠️ Chunking strategy: perlu eksperimen berulang
  • ⚠️ Production deployment: butuh pengalaman server & security
  • ❌ Skalabilitas & cost management: kompleks untuk volume tinggi
  • ❌ Akurasi & hallucination: butuh fine-tuning berkelanjutan
πŸ’‘

Tidak Punya Waktu atau Takut Salah?

Kami mengerti bahwa tutorial di atas mungkin terlihat rumit dan memakan waktu.
Satu kesalahan kecil bisa membuat website Anda down atau bermasalah!

βœ… Solusi: Biar Profesional yang Handle

Jasa Pembuatan AI Knowledge Base Custom
Mulai Rp 3.500.000
  • Dikerjakan oleh tim berpengalaman
  • Selesai cepat tanpa trial-error
  • Garansi 100% berhasil
  • Include troubleshooting & support
  • Free konsultasi

πŸ“š Artikel Terkait

Cara Integrasi ChatGPT ke Website atau Aplikasi

Panduan lengkap integrasi OpenAI API

Website DIY vs Jasa Profesional

Mana lebih hemat untuk bisnis Anda?

#AI #RAG #OpenAI #VectorDatabase #Python