Tutorial Membangun RAG Chatbot Lokal dengan Ollama, LangChain, dan ChromaDB
AP
Adrian Prat

Dipublikasikan 16 Juli 2026

Tutorial Membangun RAG Chatbot Lokal dengan Ollama, LangChain, dan ChromaDB

Retrieval-Augmented Generation (RAG) adalah arsitektur yang menggabungkan kemampuan pencarian dokumen dengan generative AI. Alih-alih mengandalkan pengetahuan model bahasa yang terbatas, RAG mengambil data relevan dari sumber eksternal dan menyertakannya sebagai konteks dalam prompt. Artikel ini akan membahas cara membangun RAG chatbot yang berjalan sepenuhnya di komputer lokal menggunakan Ollama, LangChain, dan ChromaDB tanpa mengirim data ke cloud.

Mengapa RAG Berjalan Lokal?

Banyak organisasi menangani data sensitif yang tidak boleh dikirim ke API pihak ketiga. Menjalankan LLM dan vector database di lokal memberikan beberapa keuntungan penting:

  • Privasi data: Dokumen internal tetap berada di dalam jaringan perusahaan tanpa exposure ke internet.

  • Biaya prediktabil: Tidak ada biaya token per request seperti layanan berbasis API.

  • Latensi rendah: Tanpa round-trip ke server eksternal, response time bisa di bawah satu detik untuk model berukuran sedang.

Stack yang digunakan terdiri dari tiga komponen utama: Ollama sebagai inference engine untuk menjalankan model Llama 3 atau Mistral, LangChain sebagai orchestration framework, dan ChromaDB sebagai vector store untuk menyimpan embedding dokumen.

Langkah 1: Instalasi Ollama dan Model LLM

Pastikan Python 3.10 atau lebih baru sudah terinstall. Selanjutnya install Ollama sesuai sistem operasi dari Ollama official website. Setelah terpasang, unduh model yang diinginkan:

ollama pull llama3.1:8b

Verifikasi model sudah tersedia:

ollama list

Model 8B parameter dipilih karena keseimbangan antara kualitas jawaban dan kebutuhan VRAM. Dengan quantization Q4, model ini hanya membutuhkan sekitar 5GB VRAM sehingga bisa berjalan di GPU entry-level maupun CPU modern.

Langkah 2: Setup Project dan Install Dependency

Buat direktori project baru dan install library yang dibutuhkan:

mkdir rag-local-bot && cd rag-local-bot
python3 -m venv venv
source venv/bin/activate
pip install langchain chromadb ollama langchain-community sentence-transformers

Library sentence-transformers digunakan untuk menghasilkan embedding teks secara lokal. Model default yang digunakan adalah all-MiniLM-L6-v2 yang menghasilkan vektor 384 dimensi dengan akurasi cukup baik untuk kebutuhan umum.

Langkah 3: Ingest Dokumen ke ChromaDB

Buat file ingest.py untuk memproses dokumen dan menyimpannya ke vector database:

from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Chroma

loader = TextLoader("data/dokumen.txt")
documents = loader.load()

splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)

embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
db = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
print(f"Berhasil menyimpan {len(chunks)} chunk ke ChromaDB")

Jalankan script ingestion:

mkdir data
# salin dokumen ke dalam folder data
python3 ingest.py

Parameter chunk_size=500 dan chunk_overlap=50 adalah nilai default yang direkomendasikan oleh LangChain documentation. Chunking yang terlalu besar mengurangi presisi retrieval, sementara chunk terlalu kecil kehilangan konteks.

Langkah 4: Bangun Chatbot dengan Retrieval

Buat file chatbot.py yang menggabungkan retrieval dengan generation:

from langchain_community.llms import Ollama
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA

embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
retriever = db.as_retriever(search_kwargs={"k": 3})

llm = Ollama(model="llama3.1:8b")
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)

while True:
    query = input("Tanyakan sesuatu: ")
    if query.lower() in ["exit", "quit"]:
        break
    result = qa_chain.invoke({"query": query})
    print("Jawaban:", result["result"])

Jalankan chatbot:

python3 chatbot.py

Chain type stuff adalah metode paling sederhana yang menyatukan semua retrieved document ke dalam satu prompt. Untuk dokumen yang sangat panjang, pertimbangkan menggunakan map_reduce atau refine.

Langkah 5: Evaluasi dan Tuning

Setelah chatbot berjalan, lakukan evaluasi dengan metrik berikut:

  • Relevansi retrieval: Apakah top-3 chunk yang diambil benar-benar berkaitan dengan pertanyaan?

  • Faithfulness: Apakah jawaban model didasarkan pada dokumen yang diberikan, ataukah halusinasi?

  • Latency: Berapa waktu dari submit query hingga jawaban lengkap muncul?

Jika retrieval kurang akurat, coba ubah parameter k (jumlah chunk yang diambil) atau ganti model embedding ke all-mpnet-base-v2 yang memiliki kualitas lebih tinggi meski sedikit lebih lambat.

Kesimpulan

RAG chatbot lokal memberikan solusi AI yang aman dan ekonomis untuk organisasi dengan data sensitif. Dengan kombinasi Ollama, LangChain, dan ChromaDB, kamu bisa membangun sistem tanya-jawab berbasis dokumen tanpa ketergantungan pada layanan cloud. Stack ini juga mudah diintegrasikan dengan UI berbasis Streamlit atau FastAPI untuk dipakai oleh non-technical user.

Sumber referensi: LangChain Documentation, ChromaDB Docs, Ollama GitHub Repository

Deployment sebagai API dengan FastAPI

Untuk integrasi dengan aplikasi lain, RAG chatbot bisa dibungkus sebagai REST API menggunakan FastAPI:

from fastapi import FastAPI
from pydantic import BaseModel
from langchain.chains import RetrievalQA
from langchain_community.llms import Ollama
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings

app = FastAPI()
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
llm = Ollama(model="llama3.1:8b")
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())

class Query(BaseModel):
    question: str

@app.post("/ask")
def ask(q: Query):
    result = qa.invoke({"query": q.question})
    return {"answer": result["result"]}

Jalankan server dengan Uvicorn:

uvicorn api:app --reload --port 8000

Endpoint ini bisa diakses dari frontend, mobile app, atau tools internal perusahaan. Karena semua proses berjalan lokal, tidak ada limit rate atau biaya tambahan untuk setiap request yang masuk.

Peningkatan dengan Hybrid Search

Untuk dataset yang kompleks, pertimbangkan menggabungkan vector search dengan keyword search menggunakan BM25. Pendekatan hybrid ini meningkatkan recall karena menangkap sinonim dan variasi kata yang mungkin tidak tertangkap oleh semantic search murni. LangChain menyediakan modul EnsembleRetriever yang bisa menggabungkan hasil dari dua metode pencarian dengan weighted scoring.

Implementasi RAG lokal ini menjadi fondasi yang kuat bagi tim developer yang ingin mengadopsi AI secara bertahap tanpa melepaskan kendali penuh atas data mereka.