Dipublikasikan 1 Juli 2026
Retrieval-Augmented Generation (RAG) menjadi arsitektur standar ketika developer ingin memberikan konteks khusus kepada Large Language Model tanpa melakukan fine-tuning. Sayangnya, banyak solusi RAG komersial mengirimkan data sensitif ke cloud pihak ketiga. Artikel ini menjelaskan cara membangun pipeline RAG 100% lokal menggunakan Ollama, LangChain, dan ChromaDB. Semua data tetap berada di mesin lokal kamu, mulai dari embedding hingga inference.
RAG bekerja dengan mengambil dokumen relevan dari knowledge base, kemudian menyuntikkannya ke prompt LLM sebagai konteks tambahan. Pendekatan ini mengurangi hallucination dan memastikan jawaban berdasarkan fakta internal. Menjalankannya secara lokal memberikan keuntungan tambahan: privasi data penuh, tanpa biaya API, dan latensi lebih rendah untuk pengujian berulang. Bagi startup atau tim enterprise yang menangani data pelanggan atau dokumen internal, menjalankan RAG di local server atau workstation adalah pilihan strategis.
Ollama adalah runtime untuk menjalankan model open source seperti Llama, Mistral, atau Qwen langsung di laptop. Unduh dari ollama.com dan pastikan service berjalan:
ollama --version
ollama pull llama3.2
Pastikan port 11434 tidak diblokir firewall lokal. Ollama secara default hanya listen di localhost, sehingga cukup aman untuk development.
Gunakan Python 3.10+ dan buat virtual environment terpisah agar dependensi tidak bentrok dengan proyek lain:
python3 -m venv venv-rag
source venv-rag/bin/activate
pip install langchain langchain-community langchain-ollama chromadb
Buat direktori proyek baru dan file main.py. Struktur dasar yang kita butuhkan hanya tiga komponen: Document Loader, Vector Store, dan LLM Chain. Di langkah ini, kita fokus mengimpor modul dan memastikan koneksi ke Ollama berhasil:
from langchain_ollama import OllamaLLM
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import RetrievalQA
llm = OllamaLLM(model="llama3.2")
print(llm.invoke("Halo, siapa kamu?"))
Jika output muncul tanpa error, artinya LangChain sudah berkomunikasi dengan Ollama melalui endpoint default http://localhost:11434.
ChromaDB menyimpan vektor embedding dari dokumen teks. LangChain menyediakan helper DirectoryLoader untuk membaca semua file .txt atau .md dari sebuah folder:
from langchain_community.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = DirectoryLoader("docs/", glob="**/*.md")
documents = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)
embeddings = OllamaEmbeddings(model="llama3.2")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
Parameter chunk_size=500 dan chunk_overlap=50 adalah starting point yang umum. Jika dokumenmu teknis dan padat istilah, turunkan chunk_size agar setiap potongan tetap fokus pada satu topik. Untuk dokumen hukum atau kontrak, chunk size 300-400 biasanya lebih akurat.
Setelah vektor tersimpan, kita perlu chain yang menggabungkan retrieval dan generation. LangChain menyediakan RetrievalQA yang menyederhanakan proses ini:
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
Argumen search_kwargs={"k": 3} menentukan bahwa sistem hanya mengambil 3 chunk paling relevan untuk disuntikkan ke prompt. Angka ini bisa disesuaikan: naikkan jika jawaban kurang lengkap, turunkan jika prompt melebihi context window model. Untuk model 7B parameter dengan context window 8K, total token prompt plus retrieved chunks sebaiknya tidak melebihi 6000 token.
Secara teknis, koneksi sudah terjadi di Langkah 1. Namun, untuk pipeline produksi mini, tambahkan fallback model dan timeout. Ollama mendukung model quantized yang lebih ringan jika RAM terbatas:
# Gunakan model quantized jika RAM < 16 GB
llm = OllamaLLM(model="llama3.2:3b")
# Atau gunakan Qwen yang lebih hemat resource
llm = OllamaLLM(model="qwen2.5:7b")
Pastikan kamu sudah menjalankan ollama pull qwen2.5:7b sebelum mengganti model. Ollama akan mengunduh weight secara otomatis dari registry publik mereka. Model quantized biasanya kehilangan sedikit akurasi pada reasoning kompleks, tetapi masih sangat mumpuni untuk tugas RAG standar.
Sekarang saatnya menguji pipeline dengan pertanyaan nyata. Berikut contoh query terhadap dokumen internal perusahaan:
query = "Apa kebijakan cuti tahunan untuk karyawan baru?"
result = qa_chain.invoke({"query": query})
print("Jawaban:", result["result"])
print("
Sumber:")
for doc in result["source_documents"]:
print("-", doc.metadata.get("source", "unknown"))
Jika jawaban tidak akurat, periksa tiga hal: (1) apakah dokumen sumber memang mengandung jawaban, (2) apakah chunk size terlalu besar sehingga informasi tenggelam, dan (3) apakah model lokal cukup powerful untuk memahami konteks yang disuntikkan. Lakukan evaluasi pada 10-20 query representatif dan catat metrik answer relevance secara manual.
Embedding model menentukan seberapa baik sistem memahami similarity antar dokumen. Llama3.2 via OllamaEmbeddings adalah opsi default, tetapi ada alternatif lain yang lebih spesifik untuk bahasa Indonesia. Pertimbangkan menggunakan sentence-transformers seperti all-MiniLM-L6-v2 melalui HuggingFace embeddings jika akurasi retrieval masih rendah:
from langchain_huggingface import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db_hf")
Pipeline RAG lokal ini sudah cukup untuk prototipe internal dan knowledge base privat. Untuk meningkatkan akurasi, pertimbangkan teknik berikut:
Hybrid Search: Gabungkan semantic search ChromaDB dengan keyword matching BM25 menggunakan ChromaDB native filters.
Reranking: Setelah retrieval, gunakan model cross-encoder ringan untuk menyortir chunk berdasarkan relevansi sebelum disuntikkan ke LLM.
ReAct Agent: Ganti RetrievalQA dengan LangChain ReAct Agent agar sistem bisa melakukan multi-step reasoning.
Persistent Store: Gunakan Chroma(persist_directory="...") agar indeks vektor tidak hilang setelah program ditutup.
Dengan kombinasi Ollama, LangChain, dan ChromaDB, kamu memiliki fondasi RAG yang modular, privat, dan tanpa biaya subscription. Selamat mengembangkan knowledge base internalmu.
Dapatkan feedback, users, dan eksposur dari komunitas kreator, developer, dan entrepreneur digital Indonesia.
Submit Produk → Pelajari Dulu