Membangun aplikasi teks dengan LLM & GenAI: arsitektur Retrieval-Augmented Generation (RAG) untuk analisis data, fine-tuning model bahasa, dan text analytics lanjutan — dilengkapi praktik pipeline RAG sederhana

Setelah di episode 21 kita mengintegrasikan AI ke alur kerja, pada episode ini kita masuk lebih dalam: LLM & GenAI sebagai mesin analisis. Alih-alih hanya "asisten yang mempercepat", sekarang model bahasa menjadi komponen pipeline — membaca dokumen, menjawab pertanyaan dari basis data, dan mengekstrak insight dari teks dalam skala besar.
Mengapa topik ini krusial di 2026? Karena permintaan pasar terhadap talenta yang bisa membangun solusi LLM terus naik (episode 1), dan dua keterampilan yang paling diminta adalah RAG (menjawab berdasarkan data sendiri) dan fine-tuning (menyesuaikan model ke domain). Episode ini membangun keduanya dari konsep hingga pipeline yang bisa dipakai.
Masalah utama LLM generik: mereka hanya tahu data pelatihan — dan bisa halusinasi saat ditanya di luar itu. RAG (Retrieval-Augmented Generation) menyelesaikannya dengan menambahkan langkah retrieval: cari dokumen relevan dari basis data kalian, lalu biarkan model menjawab berdasarkan dokumen itu.
Lima blok penyusun: dokumen → chunking → embedding → vector store → generation.
Kita bangun RAG untuk menjawab pertanyaan dari dokumen SOP internal:
pip install openai chromadbimport chromadb
from openai import OpenAI
client = OpenAI()
collection = chromadb.PersistentClient(
path="./vector_db").get_or_create_collection("sop")
# 1. Ingest: simpan chunk dokumen dengan embedding otomatis
chunks = ["SOP-01: refund diproses maksimal 3 hari kerja...",
"SOP-02: pelanggan berhak refund penuh dalam 14 hari..."]
collection.add(ids=[f"chunk-{i}" for i in range(len(chunks))],
documents=chunks)
# 2. Retrieve: cari chunk paling relevan
query = "Berapa lama proses refund?"
results = collection.query(query_texts=[query], n_results=2)
konteks = "\n".join(results["documents"][0])
# 3. Generate: jawab berdasarkan konteks
respon = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system",
"content": "Jawab hanya berdasarkan konteks yang diberikan."},
{"role": "user",
"content": f"Konteks:\n{konteks}\n\nPertanyaan: {query}"},
],
)
print(respon.choices[0].message.content)Pola RAG yang harus diingat: retrieval dulu, generation setelahnya. Perhatikan system prompt yang membatasi model agar menjawab hanya dari konteks — ini mitigasi halusinasi utama. Hasil akhirnya: model menjawab pertanyaan spesifik perusahaan dari dokumen yang kalian kontrol.
Dokumen panjang harus dipecah menjadi chunk yang bermakna:
Chunk terlalu besar → konteks buram, biaya token tinggi
Chunk terlalu kecil → konteks terpotong, jawaban kurang lengkap
Ukuran ideal → 300-800 token, dengan overlap antar chunkUntuk data science, chunk sering berupa bagian dokumen, deskripsi metrik, atau ringkasan per tabel — membuat vector search menemukan konteks yang paling relevan per pertanyaan.
Note
Evaluasi RAG tidak hanya "apakah jawabannya benar" — ukur juga retrieval quality (apakah chunk yang benar ditemukan?) dan generation quality (apakah jawaban setia pada konteks?). Di 2026, muncul framework seperti RAGAS untuk ini. Prinsipnya sama dengan evaluasi model lain: metrik yang jelas, test set yang terpisah.
RAG memberi model pengetahuan; fine-tuning memberi model cara bekerja — gaya, format, atau tugas khusus. Kapan dipakai:
| Pendekatan | Kapan Tepat |
|---|---|
| Prompt + RAG (dulu, lebih murah) | Pertanyaan butuh data spesifik, format bebas |
| Fine-tuning | Format/tugas spesifik dan stabil |
| Training dari nol | Data raksasa, bahasa/domain sangat khusus |
Alur fine-tuning modern memakai LoRA (Low-Rank Adaptation) — melatih sebagian kecil parameter, jauh lebih murah daripada melatih seluruh model:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-3B")
lora = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, lora)
# training loop seperti episode 13, pada dataset instruksi domain
print("parameter yang dilatih:",
f"{model.num_parameters(only_trainable=True):,}")Perhatikan only_trainable=True — dengan LoRA, dari miliaran parameter hanya ribuan yang berubah. Untuk data scientist, prinsipnya: fine-tuning hanya untuk tugas yang benar-benar stabil dan berulang; untuk pertanyaan ad-hoc, RAG + prompt jauh lebih murah dan fleksibel.
GenAI juga mengubah text analytics klasik (episode 14). Beberapa tugas yang dulu susah kini satu panggilan model:
| Tugas | Pendekatan Lama | Pendekatan GenAI |
|---|---|---|
| Ekstraksi entitas | NER model khusus | Prompt + JSON schema |
| Ringkasan dokumen | Extractive (rangkai kalimat) | Abstractive (makna asli) |
| Klasifikasi sentimen | Fine-tune model per domain | Zero-shot + few-shot prompt |
| Analisis tema | Topic modeling | Clustering embedding + label AI |
respon = client.chat.completions.create(
model="gpt-4o-mini",
response_format={"type": "json_object"},
messages=[{"role": "user",
"content": (
"Ekstrak dari ulasan berikut: {komplain, produk, sentimen} "
"sebagai JSON. Ulasan: 'koneksi sering putus di malam hari, "
"produk wifi rumah'"
)}],
)
print(respon.choices[0].message.content)Kekuatan di sini: output terstruktur (JSON) yang langsung masuk pipeline — mengubah teks bebas menjadi data tabular yang bisa diagregasi, divisualisasi, dan dijadikan fitur. Ini jembatan antara GenAI dan data science klasik.
| Pitfall | Dampak | Solusi |
|---|---|---|
| Fine-tuning saat RAG cukup | Biaya mahal tanpa manfaat | Prompt + RAG dulu |
| Chunking tanpa memikirkan makna | Retrieval lemah | Chunk sesuai struktur dokumen |
| Tidak membatasi jawaban pada konteks | Halusinasi | System prompt yang ketat |
| Menyimpan data sensitif di embedding store | Risiko governance (ep. 19) | Pseudonymize + akses terkontrol |
| RAG tanpa evaluasi | Kualitas tak terukur | Metrik retrieval + generation |
Inti yang harus dibawa pulang:
Di episode 23 selanjutnya kita akan membahas scalable data science — bekerja dengan data besar menggunakan Spark, cloud ML, dan distributed compute. Sampai jumpa di episode 23!