Yeniden Sıralamanın Etkisini Ölçme
Tek aşamalı getirme ile yeniden sıralamalı iki aşamalı getirmeyi karşılaştıran, öncesi ve sonrası ölçümleri içeren bir kıyaslama çalıştırın; NDCG, MRR ve uçtan uca yanıt kalitesini ölçün.
Yeniden Sıralamanın Etkisini Ölçme, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.
Yeniden Sıralamanın Etkisi Neden Ölçülür?
Yeniden sıralama, işlem hattınıza gecikme ve maliyet ekler. Ölçüm yapmadan, eklenen karmaşıklığın buna değip değmediğini yanıtlayamazsınız. Karşılaştırmalı ölçüm, getirme kalitesindeki ve uçtan uca yanıt kalitesindeki iyileşmeyi sayısallaştırarak bilinçli bir karar vermenizi sağlar. Ayrıca hangi sorgu türlerinin en çok yarar sağladığını ortaya çıkarır; böylece yeniden sıralamayı her istekte uygulamak yerine seçerek uygulayabilirsiniz.
Altın Standartta Bir Test Kümesi Oluşturma
Güvenilir bir karşılaştırmalı ölçüm için altın standartta bir test kümesi gerekir: bilinen şekilde ilgili olan belge kimlikleriyle eşleştirilmiş sorgulardan oluşan bir koleksiyon. Bu kümeyi, uygulama günlüklerinizden gerçek kullanıcı sorgularını örnekleyerek, ilgili belgeleri manuel olarak veya uzman açıklamasıyla belirleyerek ve bunları yapılandırılmış bir biçimde düzenleyerek oluşturun. Çoğu RAG değerlendirme amacı için 50-200 sorgudan oluşan bir test kümesi yeterlidir.
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}')Getirme Ölçütleri: NDCG, MRR, İsabet Oranı
Getirme kalitesini değerlendirmek için birbirini tamamlayan üç ölçüt kullanın. K'deki İsabet Oranı, en az bir ilgili belgenin ilk K sonuç arasında yer alıp almadığını ölçer. MRR (Ortalama Karşılıklı Sıra), ilk ilgili belgenin sırasının karşılıklı değerinin ortalamasını ölçer. K'deki NDCG (Normalize Edilmiş İndirimli Birikimli Kazanç), üst sıralara alt sıralardan daha fazla ağırlık vererek sıralama kalitesini ölçer.
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}Temel Çizgi: Tek Aşamalı Yoğun Getirme
Yeniden sıralamanın etkisini ölçmeden önce, tek aşamalı yoğun getirmeyi kullanarak bir temel çizgi oluşturun. Test kümenizdeki her sorguyu iki kodlayıcılı getirici üzerinden çalıştırın, sıralanmış belge kimliklerini toplayın ve ortalama NDCG, MRR ile isabet oranını hesaplayın. Bu temel çizgi, ne kadarlık bir iyileştirmeyle başladığınızı gösterir — temel çizginiz zaten 0,95 NDCG@5 ise yeniden sıralamanın iyileştirme alanı çok azdır.
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,
}Öncesi ve Sonrası Karşılaştırmalı Ölçümünü Çalıştırma
Aynı değerlendirme işlevini hem tek aşamalı getiriciniz hem de yeniden sıralama kullanan iki aşamalı getiriciniz üzerinde çalıştırın. İyileşmeyi (veya iyileşme olmadığını) hemen görünür kılmak için sonuçları yan yana yazdırın. Kalite ölçütlerinin yanı sıra sorgu başına gecikmeyi de izleyin — uygulamanızın SLA gereksinimlerine bağlı olarak, getirme kalitesinde yüzde 5'lik bir artış 400 ms'lik gecikme artışına değmeyebilir.
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)NDCG İyileşmelerini Yorumlama
Yoğun getirmeye çapraz kodlayıcıyla yeniden sıralama eklemek, genellikle mutlak NDCG@5 değerinde 0,05 ile 0,15 arasında iyileşme sağlar; bu da yaklaşık 5-15 yüzde puanına karşılık gelir. İyileşme şu durumlarda daha büyük olur: (1) sorgularınız çok çeşitli ve çok sayıda yeniden ifade içeriyorsa, (2) derleminizde neredeyse ilgili olan çok sayıda parça varsa veya (3) ilk aşamadaki getiriciniz zayıfsa. NDCG iyileşmesinin 0,02'den az olduğunu görüyorsanız, elde edilen yarar ek karmaşıklığı haklı çıkarmayabilir.
# 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 costUçtan Uca Yanıt Kalitesini Ölçme
Getirme ölçütleri doğru belgelerin getirilip getirilmediğini ölçer; ancak nihai ölçüt uçtan uca yanıt kalitesidir. Yeniden sıralanmış bağlamdan oluşturulan yanıtların, tek aşamalı bağlamdan oluşturulan yanıtlara göre daha doğru ve aslına daha sadık olup olmadığını değerlendirmek için bir LLM hakemi kullanın. Doğruluk, aslına sadakat ve ilgi açısından 1-5 aralığında puan verin, ardından test kümenizin tamamında ortalamayı hesaplayın.
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)Sorgu Türüne Göre Katmanlı Analiz
Ortalama ölçütler, sorgu türleri arasındaki önemli farklılıkları gizler. Test kümenizi kategorilere ayırın — olgusal aramalar (kim, ne, ne zaman), prosedürel sorgular (nasıl yapılır), kavramsal sorgular (neden, açıklayın) ve teknik sorgular (hata kodları, API adları) — ve her grup için ölçütleri ayrı ayrı hesaplayın. Yeniden sıralama, anlamsal anlamanın anahtar sözcük eşleştirmesinden daha önemli olduğu kavramsal ve prosedürel sorgularda genellikle en çok faydayı sağlar.
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}')CI Entegrasyonuyla Gerileme Testi
Getirme karşılaştırmalı ölçümünüzü CI içinde bir gerileme testi olarak çalıştırın. NDCG@5, MRR ve isabet oranı için kabul edilebilir en düşük eşikleri belirleyin. Ölçütlerin eşik değerinin altına düşmesine neden olan herhangi bir işlem hattı değişikliği CI derlemesini başarısız kılar ve getirme kalitesindeki gerilemelerin üretime gönderilmesini önler. Bu, parça boyutlarını, gömme modellerini veya yeniden sıralama modellerini değiştirdikten sonra özellikle önemlidir.
# 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 -vGetirme Ölçütlerini Görselleştirme
Birden fazla deneyi karşılaştırırken ham sayıları yorumlamak zordur. Temel çizgi, yalnızca karma ve yeniden sıralama içeren karma işlem hatları için NDCG, MRR, isabet oranı ve gecikmeyi yan yana gösteren basit bir karşılaştırma tablosu veya çubuk grafik oluşturun. İyileştirmeler yaptıkça bu ölçütleri zaman içinde izlemek, gelecekteki eniyileme kararlarına yön veren bir getirme iyileştirme geçmişi oluşturur.
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)Karşılaştırmalı Ölçüm Sonuçlarına Göre Hareket Etme
Karşılaştırmalı ölçümleri çalıştırdıktan sonra somut kararlar almak için sonuçları kullanın. Yeniden sıralama NDCG'yi 0,03'ten daha az artırıyorsa bunu atlayın ve ilk aşamayı iyileştirmeye odaklanın. İsabet oranı düşükse ilk aşamanız ilgili belgeleri kaçırıyor demektir — aday kümesinin boyutunu artırın veya karma getirmeye geçin. Getirme kazanımları sınırlı olsa da uçtan uca yanıt kalitesi önemli ölçüde iyileşiyorsa yeniden sıralayıcı, sıralamadaki konum değişmese bile LLM'nin etkili şekilde kullandığı son derece ilgili cümleleri öne çıkarıyor olabilir.
Hızlı Kontrol
Bu derste getirme ve yeniden sıralamanın etkisini ölçme konusundaki anlayışınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: bilinen ilgili belgeleri içeren bir altın standartta test kümesi oluşturmak, getirme kalitesini ölçmeden önce çok önemlidir; NDCG, MRR ve isabet oranı, birlikte sıralama kalitesini kapsamlı biçimde ölçen üç temel getirme ölçütüdür ve bir LLM hakemi kullanarak uçtan uca yanıt kalitesini ölçmek, işlem hattındaki iyileşmenin nihai ölçüsünü sağlar. Getirme karşılaştırmalı ölçümlerini her zaman CI içinde gerileme testleri olarak çalıştırın. Sırada, oluşturulurken belirteçleri görüntülemek için LLM akışını inceliyoruz.
Sıkça Sorulan Sorular
“Yeniden Sıralamanın Etkisini Ölçme” dersi ücretsiz mi?
Evet — “Yeniden Sıralamanın Etkisini Ölçme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.
“Yeniden Sıralamanın Etkisini Ölçme” dersinde ne öğreneceğim?
Tek aşamalı getirme ile yeniden sıralamalı iki aşamalı getirmeyi karşılaştıran, öncesi ve sonrası ölçümleri içeren bir kıyaslama çalıştırın; NDCG, MRR ve uçtan uca yanıt kalitesini ölçün. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Yeniden Sıralamanın Etkisini Ölçme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İki Aşamalı Getirmenin İşe Yaramasının Nedeni
- Cohere ve BGE ile Çapraz Kodlayıcı Yeniden Sıralaması
- Bağlamsal Sıkıştırma ve İlgililik Filtreleme
- Yeniden Sıralamanın Etkisini Ölçme