Evaluasi retrieval
Ukur kualitas pencarian dengan precision, recall, MRR, dan nDCG pada kumpulan berlabel, lalu bahas pencarian vektor, hibrida, dan filter otorisasi.
Pertanyaan
Bagaimana kamu tahu perubahan ranking benar-benar membuat hasil lebih baik, dan bagaimana memastikan hasil nggak menampilkan dokumen yang nggak boleh dilihat pengguna?
Setelah baca ini, kamu bisa menghitung precision, recall, MRR, dan nDCG dari kumpulan berlabel, menjelaskan pencarian vektor dan penggabungan hibrida, dan menaruh filter otorisasi di tempat yang benar.
Prasyarat dan contoh
Kamu sudah paham ranking BM25 dan eksekusi query terdistribusi (M11.02, M11.05).
Seorang engineer menaikkan bobot judul dari 1 ke 3 karena "hasilnya terasa lebih bagus" untuk tiga query yang dia coba. Dua minggu kemudian pencarian nama bahan makanan memburuk, dan nggak ada yang tahu sejak kapan. Tanpa pengukuran, setiap perubahan ranking adalah taruhan.
Mekanisme
1. Kumpulan berlabel. Kumpulkan sekitar 50 sampai 200 query nyata (dari log, setelah dibersihkan), lalu minta orang menilai dokumen teratas tiap query: 0 (nggak relevan), 1 (cukup), 2 (relevan), 3 (sangat relevan). Simpan bersama versi korpus. Kumpulan kecil sudah cukup untuk mendeteksi regresi besar, tapi perbedaan kecil antar eksperimen perlu lebih banyak query.
2. Precision dan recall pada kedalaman k. Misalkan satu query punya 4 dokumen relevan di
seluruh korpus. Sistem mengembalikan 5 hasil teratas dengan relevansi [1, 0, 1, 0, 0]
(1 artinya relevan).
precision@5 = relevan di top 5 / 5 = 2 / 5 = 0,40
recall@5 = relevan di top 5 / semua relevan = 2 / 4 = 0,50
Precision menjawab "seberapa bersih hasilnya", recall menjawab "seberapa banyak yang ketemu". Recall di tahap retrieval juga menentukan batas atas tahap reranking (M11.05).
3. MRR. Mean Reciprocal Rank cocok saat pengguna mencari satu jawaban. Posisi hasil relevan pertama pada tiga query adalah 1, 3, 2:
MRR = (1/1 + 1/3 + 1/2) / 3 = 0,611
4. nDCG. Untuk relevansi bertingkat dan urutan penting. Gain tiap hasil 2^rel - 1,
didiskon log2(posisi + 1). Relevansi hasil di posisi 1 sampai 4 adalah [2, 0, 3, 1]:
DCG = 3/1 + 0/1,585 + 7/2 + 1/2,322 = 3 + 0 + 3,5 + 0,431 = 6,931
IDCG (urutan ideal 3,2,1,0) = 7 + 3/1,585 + 1/2 + 0 = 9,393
nDCG = 6,931 / 9,393 = 0,74
Tanpa memilih satu metrik saja: pakai nDCG untuk kualitas ranking, recall@100 untuk tahap kandidat, dan lihat per-query supaya rata-rata nggak menyembunyikan query yang memburuk.
5. Pencarian vektor dan hibrida. Embedding mengubah teks menjadi vektor (misalnya 384 dimensi), dan kedekatan vektor menangkap makna ("sakit kepala" dekat dengan "pusing"). Pencarian tetangga terdekat yang tepat membandingkan ke semua vektor. Untuk 10 juta vektor, biasanya dipakai indeks aproksimasi (ANN, misalnya HNSW) yang lebih cepat tapi dapat melewatkan tetangga yang benar, jadi recall-nya sendiri perlu diukur.
Vektor lemah pada nama diri, kode, dan istilah langka, yang justru kuat di BM25. Pencarian hibrida menjalankan keduanya lalu menggabungkan peringkat. Reciprocal Rank Fusion (RRF) hanya memakai peringkat, bukan skor yang skalanya berbeda:
RRF(d) = jumlah dari 1 / (60 + peringkat_d)
Dokumen A: BM25 peringkat 1, vektor peringkat 3 -> 1/61 + 1/63 = 0,03226
Dokumen B: BM25 peringkat 2, vektor peringkat 1 -> 1/62 + 1/61 = 0,03252
B menang tipis karena konsisten di kedua daftar. Konstanta 60 adalah nilai umum, bukan keharusan.
6. Otorisasi harus berada di dalam retrieval. Dua cara menyaring dokumen yang boleh dilihat:
- Post-filter: ambil 100 kandidat teratas, lalu buang yang tidak berizin. Kalau pengguna hanya boleh melihat 2% korpus, rata-rata cuma 2 dari 100 kandidat yang tersisa. Halaman hampir kosong walau ada ratusan dokumen berizin yang cocok.
- Pre-filter: ikutkan syarat izin (misalnya
tenant_id,acl_group) sebagai bagian dari query sehingga kandidat sudah berizin. Hasilnya benar, dengan biaya indeks tambahan.
Perubahan izin juga merupakan pembaruan indeks (M11.04). Tentukan batas keterlambatan pencabutan akses, dan untuk pencabutan sensitif, periksa ulang izin terhadap sumber kebenaran saat hasil ditampilkan.
Saat rancangan ini gagal
- Label bias. Penilai hanya menilai hasil yang sudah ditampilkan sistem lama, sehingga dokumen bagus yang dulu tidak muncul dianggap tidak relevan. Sisipkan sampel dokumen dari sistem lain ke dalam penilaian.
- Overfitting ke kumpulan uji. Mengutak-atik bobot sampai 100 query terbaik membuat sistem baik pada 100 query itu saja. Sisihkan sebagian query yang tidak pernah dipakai untuk menyetel.
- Hibrida tanpa diukur. Menambah vektor karena populer, tanpa membandingkan nDCG, bisa menurunkan kualitas query kata kunci dan menaikkan biaya penyimpanan serta latensi.
- Filter hanya di UI. Menyembunyikan hasil di klien nggak melindungi apa pun karena data sudah dikirim.
- Metrik global tanpa irisan. Rata-rata naik 2% sementara query berbahasa daerah turun 15%. Pecah metrik per jenis query.
Contoh tandingan: korpus 300 dokumen yang dipelihara satu tim kecil. Menyusun 200 query berlabel dan menyetel hibrida jauh lebih mahal daripada meminta tim memeriksa 20 query kunci setiap rilis.
Latihan
Query "kopi gayo" mengembalikan 5 hasil dengan relevansi [3, 1, 0, 2, 0]. Di korpus ada 4 dokumen
yang relevan (relevansi 1 ke atas).
- Hitung precision@5 dan recall@5, anggap relevan berarti nilai 1 ke atas.
- Hitung nDCG@5.
- Pengguna hanya boleh melihat 5% korpus. Kamu memakai post-filter pada 50 kandidat. Berapa hasil yang diharapkan, dan apa perbaikannya?
Lihat pembahasan
1. Relevan di top 5: nilai 3, 1, 2 jadi 3 dokumen. precision@5 = 3 / 5 = 0,60 dan recall@5 = 3 / 4 = 0,75.
2. Gain 2^rel - 1: [7, 1, 0, 3, 0]. Diskon log2(posisi + 1): 1; 1,585; 2; 2,322; 2,585.
DCG = 7/1 + 1/1,585 + 0/2 + 3/2,322 + 0/2,585 = 7 + 0,631 + 0 + 1,292 + 0 = 8,923
IDCG (urutan 3,2,1,0,0): 7 + 3/1,585 + 1/2 + 0 + 0 = 7 + 1,893 + 0,5 = 9,393
nDCG@5 = 8,923 / 9,393 = 0,95
3. 5% x 50 = 2,5 hasil rata-rata, sehingga halaman pertama sering hanya setengah penuh walau mungkin ada banyak dokumen berizin yang cocok. Perbaikannya pre-filter: masukkan izin ke dalam query supaya 50 kandidat semuanya sudah berizin. Kalau memang harus post-filter, minta kandidat jauh lebih banyak (50 / 0,05 = 1.000), dengan biaya latensi yang lebih tinggi.
Jawaban yang bagus juga menyebut bahwa autocomplete dan jumlah hasil perlu filter yang sama.
Terkait
- Sebelumnya: M11.05 Skalakan eksekusi query.
- Kembali ke dasar skor di M11.02 Urutkan hasil teks.
- Isolasi tenant dan kebocoran data dibahas lebih luas di M16.
- Lab L11 dan proyek B08 memakai fixture ranking berlabel seperti ini. Rancangan D10 menggabungkan evaluasi dan otorisasi. Semuanya belum tersedia.
Catatan
- Asumsi: relevansi dinilai manusia pada kumpulan kecil, dan satu bahasa.
- Yang nggak dibahas: pengujian online (A/B), learning to rank, evaluasi RAG, dan model embedding tertentu.
- Konstanta RRF 60 dan skala nilai 0 sampai 3 adalah konvensi umum, bukan standar tunggal.
- Terakhir ditinjau: 26 Oktober 2026.