Mengukur Dampak Pemeringkatan Ulang
Jalankan pengujian tolok ukur sebelum dan sesudah yang membandingkan pengambilan satu tahap dengan pengambilan dua tahap beserta pemeringkatan ulang, sambil mengukur NDCG, MRR, dan kualitas jawaban dari awal hingga akhir.
Mengukur Dampak Pemeringkatan Ulang adalah pelajaran AI Engineering Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Engineering Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Mengapa Mengukur Dampak Pemeringkatan Ulang?
Pemeringkatan ulang menambah latensi dan biaya pada pipeline Anda. Tanpa pengukuran, Anda tidak dapat menentukan apakah kompleksitas tambahan tersebut sepadan. Pengujian tolok ukur mengukur peningkatan kualitas pengambilan dan kualitas jawaban dari awal hingga akhir sehingga Anda dapat mengambil keputusan berdasarkan informasi. Pengujian ini juga mengungkap jenis kueri yang paling diuntungkan, sehingga Anda dapat menerapkan pemeringkatan ulang secara selektif, bukan pada setiap permintaan.
Membangun Kumpulan Test Emas
Tolok ukur yang andal memerlukan kumpulan test emas: kumpulan kueri yang dipasangkan dengan ID dokumen yang telah diketahui relevan. Buatlah dengan mengambil sampel kueri pengguna nyata dari log aplikasi Anda, mengidentifikasi dokumen yang relevan secara manual atau melalui anotasi ahli, lalu menyusunnya ke dalam format terstruktur. Kumpulan test yang terdiri dari 50–200 kueri sudah memadai untuk sebagian besar keperluan evaluasi RAG.
golden_test_set = [
{
'query': 'How does pgvector HNSW indexing improve search speed?',
'relevant_doc_ids': ['doc_042', 'doc_107'],
},
{
'query': 'What is the difference between BM25 and dense retrieval?',
'relevant_doc_ids': ['doc_015'],
},
{
'query': 'How to implement reciprocal rank fusion in Python?',
'relevant_doc_ids': ['doc_093', 'doc_094'],
},
# ... 47 more entries
]
print(f'Test set size: {len(golden_test_set)} queries')
print(f'Avg relevant docs per query: {sum(len(e["relevant_doc_ids"]) for e in golden_test_set) / len(golden_test_set):.1f}')Metrik Pengambilan: NDCG, MRR, Rasio Keberhasilan
Gunakan tiga metrik yang saling melengkapi untuk mengevaluasi kualitas pengambilan. Rasio Keberhasilan pada K mengukur apakah setidaknya satu dokumen yang relevan muncul dalam K hasil teratas. MRR (Mean Reciprocal Rank) mengukur rata-rata kebalikan peringkat dari dokumen relevan pertama. NDCG pada K (Normalized Discounted Cumulative Gain) mengukur kualitas pemeringkatan dengan memberikan bobot lebih besar pada posisi yang lebih tinggi daripada posisi yang lebih rendah.
def compute_retrieval_metrics(results: list[str], relevant_ids: set, k: int = 5):
results_at_k = results[:k]
relevant_found = [r for r in results_at_k if r in relevant_ids]
# Hit rate
hit = 1 if relevant_found else 0
# MRR
rr = 0
for i, doc_id in enumerate(results_at_k, start=1):
if doc_id in relevant_ids:
rr = 1.0 / i
break
# NDCG (binary relevance)
import math
dcg = sum(
1.0 / math.log2(i + 1)
for i, doc_id in enumerate(results_at_k, start=1)
if doc_id in relevant_ids
)
ideal = sum(1.0 / math.log2(i + 1) for i in range(1, min(len(relevant_ids), k) + 1))
ndcg = dcg / ideal if ideal > 0 else 0
return {'hit': hit, 'rr': rr, 'ndcg': ndcg}Dasar: Pengambilan Padat Satu Tahap
Sebelum mengukur dampak pemeringkatan ulang, tetapkan dasar menggunakan pengambilan padat satu tahap. Jalankan setiap kueri dalam kumpulan test Anda melalui pengambil bi-encoder, kumpulkan ID dokumen yang telah diperingkatkan, lalu hitung rata-rata NDCG, MRR, dan rasio keberhasilan. Dasar ini menunjukkan titik awal peningkatan Anda — jika dasar Anda sudah mencapai 0.95 NDCG@5, ruang peningkatan melalui pemeringkatan ulang menjadi sangat kecil.
def evaluate_pipeline(retriever_fn, test_set: list[dict], k: int = 5) -> dict:
all_metrics = []
for entry in test_set:
query = entry['query']
relevant = set(entry['relevant_doc_ids'])
results = retriever_fn(query, top_k=k)
result_ids = [r['id'] for r in results]
metrics = compute_retrieval_metrics(result_ids, relevant, k)
all_metrics.append(metrics)
n = len(all_metrics)
return {
f'hit_rate@{k}': sum(m['hit'] for m in all_metrics) / n,
f'mrr@{k}': sum(m['rr'] for m in all_metrics) / n,
f'ndcg@{k}': sum(m['ndcg'] for m in all_metrics) / n,
}Menjalankan Tolok Ukur Sebelum dan Sesudah
Jalankan fungsi evaluasi yang sama pada pengambil satu tahap dan pengambil dua tahap dengan pemeringkatan ulang. Tampilkan hasil berdampingan agar peningkatan (atau ketiadaannya) langsung terlihat. Lacak latensi per kueri bersama metrik kualitas — peningkatan kualitas pengambilan sebesar 5 persen mungkin tidak sepadan dengan kenaikan latensi sebesar 400 md, bergantung pada persyaratan SLA aplikasi Anda.
import time
def evaluate_with_latency(retriever_fn, test_set, k=5):
metrics_list = []
latencies = []
for entry in test_set:
t0 = time.perf_counter()
results = retriever_fn(entry['query'], top_k=k)
latencies.append((time.perf_counter() - t0) * 1000)
result_ids = [r['id'] for r in results]
metrics_list.append(compute_retrieval_metrics(
result_ids, set(entry['relevant_doc_ids']), k
))
n = len(metrics_list)
return {
f'hit_rate@{k}': sum(m['hit'] for m in metrics_list) / n,
f'ndcg@{k}': sum(m['ndcg'] for m in metrics_list) / n,
'p50_latency_ms': sorted(latencies)[n // 2],
'p99_latency_ms': sorted(latencies)[int(n * 0.99)],
}
baseline = evaluate_with_latency(dense_retrieval_fn, golden_test_set)
two_stage = evaluate_with_latency(two_stage_fn, golden_test_set)
print('Baseline:', baseline)
print('Two-stage:', two_stage)Menafsirkan Peningkatan NDCG
Peningkatan umum dari penambahan pemeringkatan ulang cross-encoder pada pengambilan padat berkisar antara 0.05 hingga 0.15 NDCG@5 absolut, yang setara dengan sekitar 5–15 poin persentase. Peningkatannya lebih besar ketika: (1) kueri Anda beragam dan memiliki banyak parafrasa, (2) korpus Anda memiliki banyak potongan yang hampir relevan, atau (3) pengambil tahap pertama Anda lemah. Jika peningkatan NDCG kurang dari 0.02, manfaatnya mungkin tidak sepadan dengan kompleksitas tambahan.
# Interpreting benchmark results
example_results = {
'baseline': {'hit_rate@5': 0.78, 'ndcg@5': 0.64, 'p99_latency_ms': 35},
'two_stage': {'hit_rate@5': 0.89, 'ndcg@5': 0.77, 'p99_latency_ms': 287},
}
delta_ndcg = example_results['two_stage']['ndcg@5'] - example_results['baseline']['ndcg@5']
delta_latency = example_results['two_stage']['p99_latency_ms'] - example_results['baseline']['p99_latency_ms']
print(f'NDCG improvement: +{delta_ndcg:.2f} (+{delta_ndcg/example_results["baseline"]["ndcg@5"]*100:.0f}%)')
print(f'Latency increase: +{delta_latency}ms')
# NDCG improvement: +0.13 (+20%) — clearly worth the 252ms latency costPengukuran Kualitas Jawaban dari Awal hingga Akhir
Metrik pengambilan mengukur apakah dokumen yang tepat berhasil diambil, tetapi ukuran akhirnya adalah kualitas jawaban dari awal hingga akhir. Gunakan penilai LLM untuk mengevaluasi apakah jawaban yang dihasilkan dari konteks yang diperingkatkan ulang lebih benar dan lebih setia dibandingkan jawaban dari konteks satu tahap. Berikan skor pada skala 1–5 untuk ketepatan, kesetiaan, dan relevansi, lalu hitung rata-ratanya di seluruh kumpulan test Anda.
from openai import OpenAI
client = OpenAI()
JUDGE_PROMPT = '''
Rate the following answer on a scale of 1-5 for correctness and faithfulness to the context.
Question: {question}
Context: {context}
Answer: {answer}
Ground truth: {ground_truth}
Return a JSON with fields: {"correctness": int, "faithfulness": int, "explanation": str}
'''
def judge_answer(question, context, answer, ground_truth):
prompt = JUDGE_PROMPT.format(
question=question, context=context,
answer=answer, ground_truth=ground_truth,
)
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'},
)
import json
return json.loads(response.choices[0].message.content)Analisis Terstratifikasi Berdasarkan Jenis Kueri
Metrik rata-rata dapat menyembunyikan perbedaan penting antarjenis kueri. Bagi kumpulan test Anda ke dalam beberapa kategori — pencarian fakta (siapa, apa, kapan), kueri prosedural (cara melakukan sesuatu), kueri konseptual (mengapa, jelaskan), dan kueri teknis (kode error, nama API) — lalu hitung metrik secara terpisah untuk setiap kelompok. Pemeringkatan ulang sering kali paling membantu pada kueri konseptual dan prosedural, ketika pemahaman semantik lebih penting daripada pencocokan kata kunci.
def stratified_eval(retriever_fn, test_set, k=5):
groups = {'factual': [], 'procedural': [], 'conceptual': [], 'technical': []}
for entry in test_set:
q = entry['query'].lower()
if any(w in q for w in ['how to', 'how do', 'steps to']):
groups['procedural'].append(entry)
elif any(w in q for w in ['why', 'explain', 'what is the reason']):
groups['conceptual'].append(entry)
elif any(c.isupper() for c in q.split()) or 'error' in q:
groups['technical'].append(entry)
else:
groups['factual'].append(entry)
for group_name, group_entries in groups.items():
if group_entries:
metrics = evaluate_pipeline(retriever_fn, group_entries, k)
print(f'{group_name} ({len(group_entries)} queries): ndcg@{k}={metrics[f"ndcg@{k}"]:.3f}')Pengujian Regresi dengan Integrasi CI
Jalankan tolok ukur pengambilan Anda sebagai test regresi dalam CI. Tetapkan ambang batas minimum yang dapat diterima untuk NDCG@5, MRR, dan rasio keberhasilan. Setiap perubahan pipeline yang menyebabkan metrik turun di bawah ambang batas akan menggagalkan build CI, sehingga regresi kualitas pengambilan tidak sampai dirilis ke produksi. Hal ini terutama penting setelah mengubah ukuran potongan, model embedding, atau model pemeringkatan ulang.
# pytest integration for retrieval quality gates
import pytest
MIN_NDCG_5 = 0.70
MIN_HIT_RATE_5 = 0.85
def test_retrieval_quality_meets_threshold():
metrics = evaluate_pipeline(production_retriever_fn, golden_test_set, k=5)
assert metrics['ndcg@5'] >= MIN_NDCG_5, (
f'NDCG@5 {metrics["ndcg@5"]:.3f} below threshold {MIN_NDCG_5}'
)
assert metrics['hit_rate@5'] >= MIN_HIT_RATE_5, (
f'Hit rate {metrics["hit_rate@5"]:.3f} below threshold {MIN_HIT_RATE_5}'
)
# Run with: pytest tests/test_retrieval.py -vMemvisualisasikan Metrik Pengambilan
Angka mentah sulit ditafsirkan di antara banyak eksperimen. Buat tabel perbandingan sederhana atau diagram batang yang menampilkan NDCG, MRR, rasio keberhasilan, dan latensi secara berdampingan untuk pipeline dasar, hanya hibrida, dan hibrida dengan pemeringkatan ulang. Melacak metrik ini dari waktu ke waktu saat Anda melakukan peningkatan akan menghasilkan riwayat peningkatan pengambilan yang membantu memandu keputusan optimasi berikutnya.
def print_comparison_table(results: dict[str, dict]):
headers = ['Pipeline', 'NDCG@5', 'MRR@5', 'Hit@5', 'P99 ms']
print('|'.join(f'{h:20}' for h in headers))
print('-' * (len(headers) * 21))
for pipeline_name, metrics in results.items():
row = [
pipeline_name,
f'{metrics.get("ndcg@5", 0):.3f}',
f'{metrics.get("mrr@5", 0):.3f}',
f'{metrics.get("hit_rate@5", 0):.3f}',
f'{metrics.get("p99_latency_ms", 0):.0f}',
]
print('|'.join(f'{v:20}' for v in row))
results = {
'Dense only': {'ndcg@5': 0.64, 'mrr@5': 0.68, 'hit_rate@5': 0.78, 'p99_latency_ms': 35},
'Hybrid RRF': {'ndcg@5': 0.71, 'mrr@5': 0.74, 'hit_rate@5': 0.84, 'p99_latency_ms': 55},
'Hybrid + Rerank': {'ndcg@5': 0.77, 'mrr@5': 0.81, 'hit_rate@5': 0.89, 'p99_latency_ms': 287},
}
print_comparison_table(results)Menindaklanjuti Hasil Tolok Ukur
Setelah menjalankan tolok ukur, gunakan hasilnya untuk mengambil keputusan konkret. Jika pemeringkatan ulang meningkatkan NDCG kurang dari 0.03, jangan gunakan pemeringkatan ulang dan fokuslah pada peningkatan tahap pertama. Jika rasio keberhasilan rendah, tahap pertama Anda tidak menemukan dokumen yang relevan — tingkatkan ukuran kumpulan kandidat atau beralihlah ke pengambilan hibrida. Jika kualitas jawaban dari awal hingga akhir meningkat secara signifikan meskipun peningkatan pengambilan tergolong kecil, pemeringkat ulang mungkin berhasil menampilkan kalimat yang sangat relevan dan digunakan LLM secara efektif, meskipun posisi peringkatnya tidak berubah.
Pemeriksaan Singkat
Uji pemahaman Anda tentang pengukuran dampak pengambilan dan pemeringkatan ulang dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini Anda telah mempelajari: membangun kumpulan test emas dengan dokumen relevan yang telah diketahui merupakan hal penting sebelum mengukur kualitas pengambilan, NDCG, MRR, dan rasio keberhasilan adalah tiga metrik inti pengambilan yang secara bersama-sama mengukur kualitas pemeringkatan secara menyeluruh, dan kualitas jawaban dari awal hingga akhir menggunakan penilai LLM merupakan ukuran utama peningkatan pipeline. Selalu jalankan tolok ukur pengambilan sebagai test regresi dalam CI. Selanjutnya, kita akan membahas streaming LLM untuk menampilkan token saat dihasilkan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengukur Dampak Pemeringkatan Ulang” gratis?
Ya — teks lengkap “Mengukur Dampak Pemeringkatan Ulang” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Engineering Academy, upgrade ke CoddyKit PRO. Kursus AI Engineering Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengukur Dampak Pemeringkatan Ulang”?
Jalankan pengujian tolok ukur sebelum dan sesudah yang membandingkan pengambilan satu tahap dengan pengambilan dua tahap beserta pemeringkatan ulang, sambil mengukur NDCG, MRR, dan kualitas jawaban d… Kamu berlatih AI Engineering Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Engineering Academy?
Tidak diperlukan pengalaman sebelumnya. AI Engineering Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Mengukur Dampak Pemeringkatan Ulang” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Engineering Academy ini?
Ya. Setiap pelajaran AI Engineering Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa Pengambilan Dua Tahap Berhasil
- Pemeringkatan Ulang Cross-Encoder dengan Cohere dan BGE
- Kompresi Kontekstual dan Penyaringan Relevansi
- Mengukur Dampak Pemeringkatan Ulang