Dipublikasikan 17 Juni 2026
Retrieval Augmented Generation (RAG) telah menjadi standar industri untuk membangun aplikasi AI yang bisa menjawab pertanyaan berdasarkan dokumen privat. Alih-alih mengirimkan seluruh dokumen ke LLM setiap kali ada pertanyaan, RAG bekerja dengan mengindeks dokumen terlebih dahulu, lalu mengambil bagian yang relevan untuk dijadikan konteks. Hasilnya: jawaban yang akurat, biaya API yang rendah, dan data tetap privat.
Tutorial ini akan membimbing kamu membangun pipeline RAG sepenuhnya di komputer lokal menggunakan Ollama untuk menjalankan LLM dan LangChain sebagai orchestration framework. Tidak diperlukan koneksi ke API berbayar seperti OpenAI. Semua proses berjalan offline di mesin kamu sendiri.
Ollama adalah tool untuk menjalankan LLM open source secara lokal dengan setup yang sangat mudah. Ollama tersedia untuk macOS, Linux, dan Windows. Download installer dari ollama.com atau install via command line untuk Linux:
curl -fsSL https://ollama.com/install.sh | shSetelah terinstall, verifikasi dengan menjalankan:
ollama --versionPull model yang akan kita gunakan. Pada tutorial ini, kita pakai Llama 3 yang memiliki keseimbangan baik antara speed dan quality:
ollama pull llama3Selain Ollama, kita membutuhkan Python 3.9 atau lebih tinggi. Buat virtual environment dan install dependency:
python3 -m venv venv
source venv/bin/activate
pip install langchain langchain-community langchain-ollama chromadbChromaDB akan berfungsi sebagai vector database lokal untuk menyimpan embedding dokumen.
Buat folder project dan siapkan dokumen sample. Untuk tutorial ini, kita akan menggunakan beberapa file teks yang berisi informasi tentang produk fiktif. Buat folder data dan file teks di dalamnya:
mkdir rag-local-demo
cd rag-local-demo
mkdir data
cat > data/produk-a.txt << EOF
Prok A adalah solusi CRM berbasis AI yang dirancang untuk UMKM Indonesia.
Fitur utama meliputi: otomasi follow-up, analisis sentimen, dan integrasi WhatsApp.
Harga mulai dari Rp 299.000 per bulan untuk 2 user.
EOF
cat > data/produk-b.txt << EOF
Prok B menawarkan layanan payment gateway dengan fee transaksi 2.5 persen.
Mendukung virtual account, e-wallet, dan kartu kredit.
API dokumentasi lengkap tersedia di developer portal.
EOFPastikan dokumen menggunakan format yang bisa dibaca sebagai plain text. PDF juga didukung oleh LangChain, namun memerlukan library tambahan seperti PyPDF2.
Langkah selanjutnya adalah membaca dokumen dan memecahnya menjadi chunk yang lebih kecil. Chunking penting karena LLM memiliki batas konteks yang terbatas. LangChain menyediakan TextLoader dan RecursiveCharacterTextSplitter untuk tujuan ini.
Buat file index.py:
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = DirectoryLoader(
"data",
glob="**/*.txt",
loader_cls=TextLoader
)
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = text_splitter.split_documents(documents)
print(f"Loaded {len(documents)} documents")
print(f"Split into {len(chunks)} chunks")Jalankan script untuk memastikan dokumen terbaca:
python3 index.pyOutputnya akan menunjukkan jumlah dokumen dan chunk yang dihasilkan. Jika dokumen besar, jumlah chunk bisa mencapai ratusan atau ribuan.
Embedding adalah representasi numerik dari teks yang memungkinkan pencarian berbasis similarity. Kita akan menggunakan OllamaEmbeddings dengan model nomic-embed-text, yang ringan dan cepat untuk dijalankan secara lokal.
Tambahkan kode berikut ke index.py:
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print("Vector store created and persisted.")Jalankan lagi:
python3 index.pyProses ini akan memakan waktu beberapa menit tergantung ukuran dokumen dan kecepatan CPU. Hasilnya adalah folder chroma_db yang berisi indeks vector siap digunakan untuk retrieval.
Setelah dokumen terindeks, bangun chain untuk menjawab pertanyaan. Chain ini terdiri dari tiga komponen: retriever untuk mencari dokumen relevan, prompt template untuk memformat konteks, dan LLM untuk menghasilkan jawaban.
Buat file query.py:
from langchain_ollama import ChatOllama
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import Chroma
from langchain_ollama import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
)
llm = ChatOllama(model="llama3", temperature=0.1)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
question = "Berapa harga Prok A dan fitur utamanya?"
result = qa_chain.invoke({"query": question})
print("Answer:", result["result"])
print("
Sources:")
for doc in result["source_documents"]:
print(f"- {doc.metadata['source']}")Jalankan query:
python3 query.pyLLM akan mencari 3 chunk paling relevan dari vector store, menggabungkannya sebagai konteks, dan menghasilkan jawaban berdasarkan informasi dalam dokumen. Karena semua berjalan secara lokal, tidak ada biaya API yang dikenakan.
Pipeline dasar di atas tidak memiliki memory. Setiap pertanyaan dianggap independen. Untuk membuat chatbot yang bisa mengikuti percakapan, tambahkan conversational memory menggunakan LangChain.
Buat file chat.py:
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
from langchain_ollama import ChatOllama
from langchain_community.vectorstores import Chroma
from langchain_ollama import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
)
llm = ChatOllama(model="llama3", temperature=0.1)
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
qa_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
memory=memory
)
print("Chatbot RAG siap. Ketik 'exit' untuk keluar.")
while True:
question = input("
Anda: ")
if question.lower() == "exit":
break
result = qa_chain.invoke({"question": question})
print(f"Bot: {result['answer']}")Jalankan:
python3 chat.pyCoba ajukan pertanyaan berurutan:
Anda: Berapa harga Prok A?
Bot: Harga Prok A mulai dari Rp 299.000 per bulan untuk 2 user.
Anda: Fitur utama apa saja?
Bot: Fitur utama Prok A meliputi otomasi follow-up, analisis sentimen, dan integrasi WhatsApp.Memory memungkinkan bot memahami bahwa "itu" pada pertanyaan kedua merujuk pada Prok A dari percakapan sebelumnya.
Beberapa tips untuk mengoptimasi pipeline RAG lokal:
Gunakan model embedding yang lebih kekinian seperti mxbai-embed-large untuk kualitas retrieval yang lebih baik
Eksperimen dengan chunk_size dan chunk_overlap untuk menemukan sweet spot dokumen kamu
Tambahkan reranking dengan cross-encoder untuk meningkatkan precision retrieval
Gunakan GPU jika tersedia untuk mempercepat proses embedding dan inference
Untuk deployment, containerize aplikasi dengan Docker. Ollama bisa dijalankan sebagai service terpisah, sementara aplikasi RAG berjalan di container lain. Dokumentasi Ollama REST API tersedia di GitHub ollama/ollama.
RAG pipeline lokal dengan Ollama dan LangChain membuktikan bahwa teknologi AI canggih tidak harus bergantung pada cloud berbayar. Dengan hardware standar, kamu bisa membangun chatbot berbasis dokumen yang sepenuhnya privat, tanpa biaya recurring, dan tanpa risiko data leak ke vendor pihak ketiga.
Setup ini sangat cocok untuk internal knowledge base, helpdesk otomatis, atau asisten riset pribadi. Langkah selanjutnya: eksplorasi model multilingual untuk dokumen Bahasa Indonesia, dan integrasi dengan framework web seperti Streamlit atau FastAPI untuk membuat interface yang ramah user.
Dapatkan feedback, users, dan eksposur dari komunitas kreator, developer, dan entrepreneur digital Indonesia.
Submit Produk → Pelajari Dulu