Pelajaran Membangun Pipeline RAG Lokal dengan FastAPI dan Ollama
Insight teknis nyata dari implementasi Retrieval-Augmented Generation mandiri: pemotongan teks semantik, optimasi latency model lokal, dan verifikasi kutipan.
Pelajaran Membangun Pipeline RAG Lokal dengan FastAPI dan Ollama
Selama menjalani magang di PT Parama Data Unit, salah satu tanggung jawab utama saya adalah membangun sistem tanya-jawab dokumen internal perusahaan berbasis Retrieval-Augmented Generation (RAG).
Karena alasan kerahasiaan data internal kantor (strict confidentiality), kami tidak dapat menggunakan API publik seperti OpenAI atau Anthropic. Solusinya adalah menjalankan model bahasa open-weights lokal menggunakan Ollama di server internal, dengan orkestrasi backend berkecepatan tinggi menggunakan FastAPI.
Berikut adalah 4 pembelajaran teknis terpenting yang saya dapatkan dari pengalaman tersebut.
1. Kualitas RAG 80% Ditentukan oleh Chunking, Bukan Ukuran Model
Banyak developer pemula mengira bahwa jawaban AI yang buruk dapat diselesaikan hanya dengan mengganti model bahasa ke parameter yang lebih besar (misalnya dari 7B ke 70B). Namun di lingkungan komputasi terbatas, hal ini keliru.
Pada awalnya, kami menggunakan metode fixed-size character chunking (memotong dokumen setiap 500 karakter). Dampaknya:
- Paragraf yang menjelaskan syarat klaim asuransi terpotong di tengah kalimat.
- Potongan pertama masuk ke chunk A, dan potongan kedua masuk ke chunk B.
- Ketika pengguna bertanya, sistem retrieval hanya mengambil chunk A. Akibatnya, model LLM berhalusinasi mengarang sisa informasi yang hilang.
Kami beralih ke algoritma pemotongan hierarkis yang mengenali judul dokumen (Heading 1, Heading 2) dan batas paragraf alami. Dengan menyisipkan overlap sebesar 15% antar-potongan, kesinambungan makna tetap terjaga dan akurasi jawaban naik lebih dari 40% tanpa mengubah model sama sekali.
2. Mengatasi Latensi Inferensi dengan Streaming Tokens
Menjalankan inferensi model 7B/8B (seperti Qwen atau Llama-3) pada CPU server lokal atau kartu grafis kelas workstation membutuhkan waktu beberapa detik sebelum seluruh paragraf selesai dibuat.
Jika backend menunggu jawaban selesai secara utuh sebelum mengirim respons JSON ke frontend, pengguna akan merasa aplikasi "membeku" (laggy) selama 8–12 detik.
Solusinya adalah memanfaatkan fitur Server-Sent Events (SSE) pada FastAPI untuk mengalirkan potongan token secara real-time:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import httpx
import json
app = FastAPI()
@app.post("/api/ask")
async def ask_rag(question: str):
async def stream_generator():
# 1. Ambil konteks relevan dari Vector DB
context = await vector_store.search(question, top_k=3)
# 2. Panggil Ollama lokal secara asinkron
async with httpx.AsyncClient() as client:
async with client.stream(
"POST",
"http://localhost:11434/api/generate",
json={"model": "qwen2.5:7b", "prompt": f"Konteks: {context}\nPertanyaan: {question}"}
) as response:
async for chunk in response.aiter_lines():
if chunk:
data = json.loads(chunk)
yield f"data: {data.get('response', '')}\n\n"
return StreamingResponse(stream_generator(), media_type="text/event-stream")
Dengan streaming, Time-To-First-Token (TTFT) turun drastis ke kisaran 1 detik, memberikan pengalaman pengguna (user experience) yang sangat responsif mirip ChatGPT.
3. Verifikasi Kutipan Adalah Pertahanan Terbaik Melawan Halusinasi
Di lingkungan bisnis dan medis, jawaban yang tampak meyakinkan namun salah (fluent hallucination) jauh lebih berbahaya daripada sistem yang jujur mengatakan "informasi tidak ditemukan di dokumen".
Setiap chunk yang kami simpan di database vektor selalu kami lengkapi dengan metadata terstruktur:
{
"source_document": "SOP-Kepegawaian-2025.pdf",
"page_number": 14,
"section_title": "Prosedur Cuti Melahirkan",
"chunk_hash": "a8f3b..."
}
Pada prompt sistem, kami menginstruksikan model untuk wajib menyertakan indeks nomor referensi di setiap klaim fakta:
"Jawablah hanya berdasarkan konteks yang disediakan. Jika jawaban tidak tercantum di konteks, katakan bahwa dokumen tidak memuat informasi tersebut."
4. Kesimpulan
Membangun sistem RAG yang siap digunakan di dunia kerja bukan soal merangkai tutorial pustaka populer, melainkan seni mengelola trade-off: presisi chunking, batas alokasi memori lokal, latensi streaming, dan keandalan kutipan fakta.