Geri Getirme Ölçütleri: İsabet Oranı, MRR ve NDCG
Sorgulardan ve ilgili belgelerden oluşan bir altın veri kümesi oluşturun; ardından geri getiricinizin doğru parçaları ne sıklıkta bulduğunu ölçmek için isabet oranını, ortalama karşılıklı sıralamayı ve NDCG'yi hesaplayın.
Geri Getirme Ölçütleri: İsabet Oranı, MRR ve NDCG, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 2. 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.
Neden Farklı Getirme Ölçütleri?
İsabet oranı, ilgili bir parçanın ilk K sonuç içinde herhangi bir yerde görünüp görünmediğini söyler; ancak sıralamada nerede göründüğünü söylemez. En iyi parçayı her zaman 5. sıraya yerleştiren bir sistem, her ikisinin de isabet oranı aynı olsa bile onu sürekli 1. sıraya yerleştiren bir sistemden daha kötüdür. MRR ve NDCG gibi daha ayrıntılı ölçütler sıralama kalitesini yakalar ve LLM'nin ve kullanıcıların kullanma olasılığının en yüksek olduğu en üst konumlara en ilgili parçaları yerleştiren sistemleri ödüllendirir.
K@ İsabet Oranı: Gözden Geçirme ve Uygulama
İsabet oranı@K en basit ölçüttür: sorguların hangi oranında en az bir ilgili parça ilk K sonuç içinde görünür? Her sorgu için ikili bir sinyal sağlar ve yorumlanması kolaydır. Getirilen kimliklerle bilinen ilgili kimlikler arasındaki kümelerin kesişimini kontrol ederek bunu hesaplayın. Çoğu RAG sistemi 5 parça getirdiği için varsayılan olarak K=5 kullanın. Getirme penceresini genişlettikçe duyarlılığın nasıl değiştiğini anlamak için isabet oranı@1, @3 ve @5 değerlerini karşılaştırın.
def hit_rate_at_k(golden_dataset, retriever, k=5):
hits = 0
for item in golden_dataset:
retrieved = retriever.retrieve(item['question'], top_k=k)
retrieved_ids = [r['id'] for r in retrieved[:k]]
relevant_ids = set(item['relevant_chunk_ids'])
if any(rid in relevant_ids for rid in retrieved_ids):
hits += 1
return hits / len(golden_dataset)
for k in [1, 3, 5, 10]:
hr = hit_rate_at_k(golden_dataset, retriever, k=k)
print(f'Hit rate@{k}: {hr:.1%}')Ortalama Karşılıklı Sıra (MRR)
MRR (Ortalama Karşılıklı Sıra), ilk ilgili parçanın göründüğü sıranın karşılıklısının ortalamasını ölçer. İlgili parça 1. sıradaysa karşılıklı sıra 1/1 = 1.0 olur. 2. sırada 0.5, 5. sırada 0.2 olur. MRR, tüm sorgular üzerinden ortalaması alınarak hesaplanır. Daha yüksek MRR, getiricinin ilgili parçaları sürekli olarak üst sıralara yerleştirdiği anlamına gelir; bu önemlidir çünkü LLM istemin başlarında konumlandırılan bağlama daha fazla dikkat eder.
def mean_reciprocal_rank(golden_dataset, retriever, top_k=10):
reciprocal_ranks = []
for item in golden_dataset:
retrieved = retriever.retrieve(item['question'], top_k=top_k)
retrieved_ids = [r['id'] for r in retrieved]
relevant_ids = set(item['relevant_chunk_ids'])
rr = 0.0
for rank, rid in enumerate(retrieved_ids, start=1):
if rid in relevant_ids:
rr = 1.0 / rank
break # only the first relevant result counts
reciprocal_ranks.append(rr)
mrr = sum(reciprocal_ranks) / len(reciprocal_ranks)
print(f'MRR@{top_k}: {mrr:.3f}')
return mrrMRR Puanlarını Yorumlama
MRR puanlarının sezgisel yorumları vardır: MRR = 1.0, ilk ilgili parçanın her zaman 1. sırada olduğu anlamına gelir (kusursuz). MRR = 0.5, genellikle 2. sırada olduğu anlamına gelir. MRR = 0.25, genellikle 4. sırada olduğu anlamına gelir; ilgili bilgi, bağlamdan kesilebilecek kadar aşağıda görünür. RAG için, en ilgili parçanızın sürekli olarak ilk iki konumda bulunmasını sağlamak üzere MRR > 0.7 hedefleyin.
# MRR interpretation table
mrr_interpretations = {
1.0: 'Perfect — relevant chunk always at rank 1',
0.5: 'Good — typically at rank 2',
0.33: 'Acceptable — typically at rank 3',
0.25: 'Weak — typically at rank 4',
0.1: 'Poor — relevant chunk rarely near the top'
}
for score, description in mrr_interpretations.items():
print(f'MRR {score:.2f}: {description}')K@ Kesinlik
Kesinlik@K, getirilen K parçanın hangi oranının gerçekten ilgili olduğunu ölçer. İkili olan isabet oranının aksine kesinlik@K, getirme sonuçlarınızdaki sinyal-gürültü oranını ölçer. Düşük kesinlik, LLM'nin ilgili parçaların yanında ilgisiz bağlam da alması anlamına gelir; bu da karışıklık veya istem enjeksiyonu riskini artırır. RAG için kesinlik@5 > 0.6 sağlıklı bir hedeftir.
def precision_at_k(golden_dataset, retriever, k=5):
precisions = []
for item in golden_dataset:
retrieved = retriever.retrieve(item['question'], top_k=k)
retrieved_ids = [r['id'] for r in retrieved[:k]]
relevant_ids = set(item['relevant_chunk_ids'])
relevant_retrieved = sum(
1 for rid in retrieved_ids if rid in relevant_ids
)
precision = relevant_retrieved / k
precisions.append(precision)
mean_precision = sum(precisions) / len(precisions)
print(f'Precision@{k}: {mean_precision:.3f}')
return mean_precisionİndirimli Birikimli Kazanç (DCG)
DCG, daha ilgili parçaları üst sıralara yerleirmeyi ödüllendiren, sıralı liste değerlendirme ölçütüdür. Getirilen parçaların uygunluk puanlarını toplar; ancak konuma göre logaritmik olarak indirger: 1. sıra tam puan alır, 2. sıraya log(2) indirimi uygulanır ve böyle devam eder. Üst sıralardaki daha yüksek uygunluklu parçalar daha yüksek DCG üretir. Normalleştirilmiş sürüm (NDCG), 0 ile 1 arasında bir puan üretmek için ideal DCG'ye (mümkün olan en iyi sıralama) böler.
import math
def dcg_at_k(relevances, k):
'''relevances[i] = 1 if chunk at rank i+1 is relevant, else 0'''
dcg = 0.0
for i, rel in enumerate(relevances[:k]):
# rank is i+1, discount is log2(rank + 1)
dcg += rel / math.log2(i + 2)
return dcg
def ndcg_at_k(retrieved_ids, relevant_ids, k):
relevances = [1 if rid in relevant_ids else 0
for rid in retrieved_ids[:k]]
actual_dcg = dcg_at_k(relevances, k)
ideal_dcg = dcg_at_k([1] * min(len(relevant_ids), k), k)
return actual_dcg / ideal_dcg if ideal_dcg > 0 else 0.0Veri Kümesi Genelinde NDCG Hesaplama
NDCG@K, arama sistemleri için altın standart getirme ölçütüdür. Aynı anda hem uygunluğu hem de sıralamadaki konumu yakalar. 0.85'lik bir NDCG@5, getiricinizin ortalama olarak teorik açıdan en iyi sıralamanın %85'i düzeyinde performans gösterdiği anlamına gelir. NDCG, sorgu başına birden fazla ilgili parçanın bulunduğu durumları ele alır (her biri bir uygunluk puanı alır) ve ilgili parçaları bulmasına rağmen çok aşağıda sıralayan sistemleri cezalandırır.
def mean_ndcg_at_k(golden_dataset, retriever, k=5):
ndcg_scores = []
for item in golden_dataset:
retrieved = retriever.retrieve(item['question'], top_k=k)
retrieved_ids = [r['id'] for r in retrieved[:k]]
relevant_ids = set(item['relevant_chunk_ids'])
score = ndcg_at_k(retrieved_ids, relevant_ids, k)
ndcg_scores.append(score)
mean = sum(ndcg_scores) / len(ndcg_scores)
print(f'NDCG@{k}: {mean:.4f}')
return mean
# Compute all retrieval metrics together
hit_rate = hit_rate_at_k(golden_dataset, retriever, k=5)
mrr = mean_reciprocal_rank(golden_dataset, retriever, top_k=5)
ndcg = mean_ndcg_at_k(golden_dataset, retriever, k=5)Otomatik Ölçütler için RAGAS Kullanma
RAGAS kitaplığı, RAG sistemleri için üretime hazır bir değerlendirme çerçevesi sağlar. LLM'yi hakem olarak kullanan bir yaklaşımla bağlam kesinliği, bağlam geri çağırması, sadakat ve yanıt uygunluğu ölçütlerini uygular. Sorularınızı, yanıtlarınızı, getirilen bağlamları ve temel gerçek yanıtlarını RAGAS'a verin; her ölçüt için puanları içeren tam bir değerlendirme raporu alın. Bu, kapsamlı bir RAG değerlendirme işlem hattı kurmanın en hızlı yoludur.
from ragas import evaluate
from ragas.metrics import (
context_precision,
context_recall,
faithfulness,
answer_relevancy
)
from datasets import Dataset
eval_data = Dataset.from_list([
{
'question': item['question'],
'answer': item['generated_answer'],
'contexts': item['retrieved_texts'],
'ground_truth': item['expected_answer']
}
for item in golden_dataset_with_answers
])
results = evaluate(
eval_data,
metrics=[context_precision, context_recall, faithfulness, answer_relevancy]
)
print(results)Ölçütleri Sorgu Kategorisine Göre Dilimleme
Genel ortalama ölçütler önemli örüntüleri gizler. Altın veri kümenizi olgusal aramalar, karşılaştırmalar, işlemsel nasıl yapılır soruları ve kapsam dışı sorular olarak kategorilere ayırın ve ölçütleri her biri için ayrı hesaplayın. Olgusal aramalarda isabet oranının %95, çok adımlı karşılaştırmalarda ise yalnızca %60 olduğunu görebilirsiniz. Kategori düzeyindeki ölçütler, toplu puanların gizlediği belirli başarısızlık modlarını ortaya çıkarır.
from collections import defaultdict
def evaluate_by_category(golden_dataset, retriever):
by_category = defaultdict(list)
for item in golden_dataset:
category = item.get('category', 'unknown')
retrieved = retriever.retrieve(item['question'], top_k=5)
retrieved_ids = {r['id'] for r in retrieved}
hit = bool(retrieved_ids & set(item['relevant_chunk_ids']))
by_category[category].append(hit)
print('Hit rate by category:')
for cat, hits in sorted(by_category.items()):
hr = sum(hits) / len(hits)
print(f' {cat}: {hr:.1%} ({sum(hits)}/{len(hits)})')Ölçütler Uyuşmadığında
Bazen ölçütler çelişkili sinyaller gönderir. İsabet oranı sabit kalırken (aynı sayıda kaçırılan sorgu) NDCG'yi artırabilirsiniz (daha iyi sıralama). Bu durum, iyileştirmenin ilgili parçaları 6. sıradan 2. sıraya taşımasına rağmen daha önce kaçırılan sorguları ilk 5'e getirmediğinde ortaya çıkar. Böyle durumlarda, iyileştirmenizin zaten başarılı olan sorgulara katkı sağlayıp başarısız olanları ihmal edip etmediğini kontrol edin. Toplu ölçütlerin yanında her zaman tek tek başarısızlık örneklerini de inceleyin.
def analyze_failures(golden_dataset, retriever, top_k=5):
failures = []
for item in golden_dataset:
retrieved = retriever.retrieve(item['question'], top_k=top_k)
retrieved_ids = {r['id'] for r in retrieved}
relevant_ids = set(item['relevant_chunk_ids'])
if not (retrieved_ids & relevant_ids):
failures.append({
'question': item['question'],
'expected_chunks': list(relevant_ids),
'retrieved_chunks': [r['id'] for r in retrieved],
'top_score': retrieved[0]['score'] if retrieved else None
})
print(f'Failures: {len(failures)}/{len(golden_dataset)}')
return failuresK@ Geri Çağırma: Getirmenin Eksiksizliği
Geri çağırma@K, tüm ilgili parçaların hangi oranının ilk K sonuçta getirildiğini ölçer. Bir sorunun dizinde 3 ilgili parçası varsa ve getiriciniz bunların 2'sini ilk 5 içinde döndürüyorsa, geri çağırma@5 = 2/3 = 0.67 olur. LLM'nin eksiksiz bir yanıt oluşturmak için birden fazla kanıt parçasına ihtiyaç duyduğu durumlarda yüksek geri çağırma önemlidir; tek bir temel parçanın bile eksik olması yanıtı eksik bırakabilir. K'yı ayarlayarak kesinlik ve geri çağırmayı dengeleyin: daha büyük K geri çağırmayı artırır, ancak kesinliği düşürür.
def recall_at_k(golden_dataset, retriever, k=5):
recalls = []
for item in golden_dataset:
retrieved = retriever.retrieve(item['question'], top_k=k)
retrieved_ids = set(r['id'] for r in retrieved[:k])
relevant_ids = set(item['relevant_chunk_ids'])
if not relevant_ids:
continue # skip items with no annotated relevant chunks
retrieved_relevant = retrieved_ids & relevant_ids
recall = len(retrieved_relevant) / len(relevant_ids)
recalls.append(recall)
mean_recall = sum(recalls) / len(recalls)
print(f'Recall@{k}: {mean_recall:.3f}')
return mean_recallKısa Kontrol
Bu dersteki Yapay Zekâ Mühendisliği kavramlarını anlayıp anlamadığınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: ikili varlık ölçütü olarak isabet oranı@K; ortalama ilk ilgili parça sırasını ölçmek için MRR; getirme sinyal-gürültü oranı için kesinlik@K; altın standart sıralı ölçüt olarak NDCG@K; ayrıca bağlam kesinliği, geri çağırma, sadakat ve yanıt uygunluğu ile RAG değerlendirmesini otomatikleştirmek için RAGAS kitaplığı. Sırada üretim ölçütlerini ve sadakat ölçümünü daha derinlemesine inceleyeceğiz.
Yapay zeka eğitmeniyle Python öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 30
- Dersler
- 120
Sıkça Sorulan Sorular
“Geri Getirme Ölçütleri: İsabet Oranı, MRR ve NDCG” dersi ücretsiz mi?
Evet — “Geri Getirme Ölçütleri: İsabet Oranı, MRR ve NDCG” 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.
“Geri Getirme Ölçütleri: İsabet Oranı, MRR ve NDCG” dersinde ne öğreneceğim?
Sorgulardan ve ilgili belgelerden oluşan bir altın veri kümesi oluşturun; ardından geri getiricinizin doğru parçaları ne sıklıkta bulduğunu ölçmek için isabet oranını, ortalama karşılıklı sıralamayı… 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 2. dersidir.
“Geri Getirme Ölçütleri: İsabet Oranı, MRR ve NDCG” 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
- RAG'de Değerlendirmenin Önemi
- Geri Getirme Ölçütleri: İsabet Oranı, MRR ve NDCG
- Oluşturma Ölçütleri: Sadakat ve Yanıt Uygunluğu
- Otomatik Değerlendirme Düzeneği Oluşturma