Evaluasi RAG
Aplikasi RAG punya dua tempat kegagalan: potongan yang salah terambil, atau jawaban yang buruk dari potongan yang benar. Evaluasi RAG memisahkan keduanya.
Intisari
- Dua jenis job: retrieve only dan retrieve and generate.
- Memisahkan keduanya menjawab pertanyaan diagnostik: retrieval yang salah, atau generasi?
- Bisa mengevaluasi Knowledge Base Bedrock maupun sumber RAG eksternal.
- Dataset butuh ground truth: teks yang seharusnya terambil dan jawaban yang diharapkan.
- Hasilnya bisa dipakai membandingkan beberapa knowledge base lalu memilih yang terbaik.
Dua kegagalan yang berbeda
Pertanyaan ──▶ Retrieval ──▶ Potongan ──▶ Generasi ──▶ Jawaban
│ │
gagal di sini? atau gagal di sini?
| Gejala | Kemungkinan penyebab | Perbaikan |
|---|---|---|
| Potongan yang benar tidak terambil | Chunking, embedding, filter | Fase 4: strategi chunking, metadata |
| Potongan benar tapi peringkatnya rendah | Urutan relevansi | Reranker |
| Potongan benar, jawaban salah | Prompt generasi, model | Prompt template, model lebih kuat |
| Jawaban menambah fakta baru | Halusinasi | Contextual grounding check (Fase 6) |
Tanpa memisahkan pengukuran, keempat gejala ini terlihat sama dari luar: "jawabannya salah". Itu sebabnya job retrieve only ada.
Dataset dengan ground truth
{
"prompt": "Berapa hari cuti tahunan karyawan tetap?",
"referenceResponses": ["12 hari kerja per tahun."],
"referenceContexts": ["Pasal 4: Karyawan tetap berhak atas cuti tahunan 12 hari kerja."]
}
| Field | Dipakai untuk menilai |
|---|---|
referenceContexts | Retrieval: apakah potongan yang benar terambil? |
referenceResponses | Generasi: apakah jawabannya sesuai yang diharapkan? |
Menyusun ground truth adalah bagian yang paling memakan waktu — dan tidak bisa dilewati. Dua puluh pertanyaan dengan jawaban yang benar-benar kamu verifikasi jauh lebih berharga daripada dua ratus yang dikarang model. Ambil pertanyaan nyata dari invocation log, lalu minta orang yang paham domainnya menuliskan jawaban acuannya.
Menjalankan job retrieve-only
kelola.create_evaluation_job(
jobName="eval-retrieval-2026-08",
roleArn=ROLE_EVAL,
applicationType="RagEvaluation",
evaluationConfig={"automated": {
"datasetMetricConfigs": [{
"taskType": "Custom",
"dataset": {"name": "cuti-gt",
"datasetLocation": {"s3Uri": "s3://eval-ku/cuti-gt.jsonl"}},
"metricNames": ["Builtin.ContextRelevance", "Builtin.ContextCoverage"],
}],
"evaluatorModelConfig": {"bedrockEvaluatorModels": [
{"modelIdentifier": MODEL_PENILAI}
]},
}},
inferenceConfig={"ragConfigs": [{"knowledgeBaseConfig": {
"retrieveConfig": {
"knowledgeBaseId": KB_ID,
"knowledgeBaseRetrievalConfiguration": {
"vectorSearchConfiguration": {"numberOfResults": 5}
},
}
}}]},
outputDataConfig={"s3Uri": "s3://eval-ku/hasil-retrieval/"},
)
Membandingkan konfigurasi
Inilah cara menjawab pertanyaan-pertanyaan Fase 4 dengan angka alih-alih perasaan:
| Perbandingan | Jalankan |
|---|---|
| Fixed vs hierarchical chunking | Dua KB, retrieve-only, dataset sama |
| Dengan vs tanpa reranker | Dua konfigurasi retrieval, retrieve-only |
| 5 vs 10 potongan | Dua numberOfResults |
| Semantic vs hybrid | Dua overrideSearchType |
| Prompt generasi lama vs baru | Retrieve-and-generate, retrieval identik |
Rutinitas yang membuatnya berguna
- Jalankan evaluasi RAG di pipeline setiap kali knowledge base atau prompt berubah.
- Simpan skornya berdampingan dengan versi rilis.
- Pasang gerbang: skor retrieval turun → deploy berhenti.
- Tiap bulan, tambahkan pertanyaan baru dari invocation log ke dataset.
- Perbarui angka evaluasi di model card (Fase 6) secara otomatis.
Latihan: susun dataset ground truth 15 pertanyaan lengkap dengan referenceContexts.
Jalankan job retrieve-only untuk dua konfigurasi chunking dari latihan Fase 4, lalu jawab dengan angka:
mana yang menang, dan apakah selisihnya cukup besar untuk membenarkan ingest ulang seluruh korpus?
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.