Mengukur kualitas aplikasi LLM secara sistematis: groundedness, faithfulness, dan deteksi hallucination; LLM-as-judge dengan RAGAS, DeepEval, dan LangSmith; serta praktik LLMOps — prompt versioning, dataset evaluation, dan regression testing.

Sejak episode 4 kalian diperkenalkan dengan golden set dan LLM-as-judge. Sekarang saatnya menjadikannya disiplin engineering penuh. Episode ini menjawab pertanyaan yang selalu datang di produksi: bagaimana tahu aplikasi AI kita membaik atau memburuk? Tanpa jawaban terukur, setiap perubahan prompt, model, atau arsitektur RAG adalah judi.
Mengapa penting? Karena aplikasi LLM adalah satu-satunya jenis perangkat lunak yang outputnya non-deterministik dan tidak bisa di-assert begitu saja. Kamu tidak bisa menulis assert answer == "...". Evaluasi sistematis — metrik, dataset, dan regression — adalah fondasi yang membedakan "demo yang mengesankan" dari "produk yang bisa dipelihara".
Tiga istilah yang sering tertukar, padahal maknanya berbeda:
| Metrik | Menjawab | Diukur Dengan |
|---|---|---|
| Faithfulness | Apakah jawaban setia pada konteks yang diberikan? | Klaim di jawaban vs konteks |
| Groundedness | Apakah jawaban berakar pada fakta/sumber? | Jawaban vs sumber retrieval |
| Hallucination | Apakah ada konten yang tidak didukung apa pun? | Jawaban vs konteks + pengetahuan |
Praktisnya: faithfulness rendah = model menambahkan klaim tanpa sumber — ini pengukur hallucination utama di aplikasi RAG. Sementara answer relevance mengukur apakah jawaban menjawab pertanyaan.
def hallucination_score(answer, context):
judge = client.chat.completions.create(
model="gpt-4o-mini",
response_format={"type": "json_object"},
messages=[{"role": "system",
"content": "Identifikasi klaim dalam jawaban yang TIDAK "
"didukung konteks. Output JSON: "
"{unsupported: [klaim], score: 0-100}"},
{"role": "user",
"content": f"Konteks:\n{context}\n\nJawaban:\n{answer}"}],
)
return json.loads(judge.choices[0].message.content)Skor hallucination di atas dihitung per-jawaban; untuk mengukur seluruh sistem, jalankan di atas evaluation dataset.
Di episode 4 kita punya golden set kecil. Untuk produksi, dataset evaluasi punya struktur lebih kaya — untuk RAG, butuh pasangan (question, context, expected) agar bisa mengukur retrieval dan jawaban.
[
{
"question": "Berapa SLA uptime layanan premium?",
"context": "Layanan premium menjamin uptime 99.9%.",
"expected_answer": "99.9%",
"expected_sources": ["harga-premium.md"]
},
{
"question": "Bagaimana cara mengganti paket?",
"context": "Ganti paket melalui dashboard, aktif di akhir siklus.",
"expected_answer": "Lewat dashboard, aktif di akhir siklus",
"expected_sources": ["faq-akun.md"]
}
]Aturan penting: dataset ini di-review manusia, ukurannya 50-200 contoh untuk mulai, dan harus mencerminkan pertanyaan nyata pengguna — bukan pertanyaan yang mudah.
Tiga tool yang wajib dipetakan:
Praktik dengan RAGAS:
from ragas import EvaluationDataset, SingleTurnSample
from ragas.metrics import Faithfulness, AnswerRelevancy, ContextPrecision
from ragas.llms import LangchainLLMWrapper
samples = [
SingleTurnSample(
user_input="Berapa SLA uptime layanan premium?",
retrieved_contexts=["Layanan premium menjamin uptime 99.9%."],
response="Uptime premium dijamin 99.9%.",
reference="99.9%",
),
]
dataset = EvaluationDataset(samples=samples)
metrics = [Faithfulness(), AnswerRelevancy(), ContextPrecision()]
result = evaluate(dataset=dataset, metrics=metrics)
print(result.to_pandas()) # satu baris per sample + skor per metrikOutput faithfulness: 1.0, answer_relevancy: 0.9x, context_precision: 1.0 memberi angka yang bisa dilacak dari versi ke versi.
Tip
LLM judge punya bias — model besar cenderung menilai outputnya sendiri terlalu tinggi. Selalu validasi judge terhadap sejumlah sampel yang dinilai manusia (misal 20-30). Kalau skor judge dan manusia tidak korelasinya baik, perbaiki prompt judge dulu sebelum percaya angkanya.
Evaluasi sekali jalan tidak cukup — aplikasi AI butuh pipeline LLMOps. Tiga komponennya:
Setiap prompt adalah kode; versi-kan dan simpan perubahannya. Simpan konfigurasi prompt di file terpusat:
summarizer_v3:
model: gpt-4o-mini
system: |
Ringkas menjadi 3 poin. Gunakan bahasa Indonesia.
Output markdown bullet.
temperature: 0.3
summarizer_v4:
model: gpt-4o-mini
system: |
Ringkas menjadi 3 poin + 1 saran aksi. Bahasa Indonesia.
Output markdown bullet.
temperature: 0.2Jalankan evaluasi otomatis setiap ada perubahan prompt/model — seperti unit test. Dengan DeepEval, ini bisa menjadi test suite:
from deepeval import assert_test
from deepeval.metrics import FaithfulnessMetric
from deepeval.test_case import LLMTestCase
def test_rag_faithfulness():
test_case = LLMTestCase(
input="Berapa SLA premium?",
actual_output=run_rag("Berapa SLA premium?"),
retrieval_context=["Layanan premium menjamin uptime 99.9%."],
)
assert_test(test_case, [FaithfulnessMetric(threshold=0.8)])Perubahan prompt yang menurunkan faithfulness di bawah 0.8 akan menggagalkan CI — perlindungan yang sama seperti regression test konvensional.
Gabungkan dengan produksi:
Inti yang harus dibawa pulang:
Di episode 16 selanjutnya kita akan membahas AI Security (OWASP GenAI) — OWASP GenAI LLM Top 10 2026 & OWASP Agentic Top 10 2026 (prompt injection, excessive agency, data exfiltration), plus guardrails, red teaming, dan sandbox tools/agent. Sampai jumpa di episode 16!