Majoritatea echipelor care construiesc sisteme RAG evaluează căutarea doar prin câteva teste manuale (‘Pare că funcționează bine’). În producție, această abordare empirică duce rapid la degradarea calității pe măsură ce baza crește. Optimizarea unui sistem de regăsire necesită metrici cantitative din Information Retrieval (IR).
Cele trei metrici fundamentale sunt: Recall@K (procentul de documente relevante regăsite în primele K rezultate returnate), MRR (Mean Reciprocal Rank) (măsoară cât de sus în listă apare primul document cu adevărat corect), și NDCG (Normalized Discounted Cumulative Gain) (evaluează dacă documentele foarte relevante sunt plasate deasupra celor parțial relevante, penalizând pozițiile inferioare prin logaritm).
Măsurarea continuă a acestor metrici pe un set de test de 100-500 de întrebări standard permite validarea matematică a oricărei schimbări: alegerea unui model de embedding nou, trecerea la căutare hibridă sau ajustarea dimensiunii fragmentelor (chunk size).
Sintaxă, opțiuni și concepte cheie
| Opțiune / Concept | Descriere practică |
|---|---|
Recall@K |
Raportul: `|Documente relevante găsite în top K| / |Total documente relevante existente|`. |
MRR (Mean Reciprocal Rank) |
Media valorilor `1 / rang`, unde rang este poziția primei potriviri corecte. |
NDCG@K |
Scor între 0 și 1 ce reflectă calitatea ordonării ierarhice a rezultatelor ponderată logaritmic. |
Ground Truth Dataset |
Setul de date etichetat ce asociază fiecare întrebare cu ID-urile fragmentelor corecte. |
MTEB Benchmark |
Standardul global deschis (Massive Text Embedding Benchmark) ce folosește aceste metrici. |
Exemple practice și configurații
Exemplul 1: Calculul metricilor MRR și Recall@5 în Python pentru evaluarea căutării
Script simplu ce măsoară eficiența unui motor de căutare vectorială.
def calculeaza_mrr(rezultate_gasite, id_corect):
for i, doc_id in enumerate(rezultate_gasite, 1):
if doc_id == id_corect:
return 1.0 / i
return 0.0
def calculeaza_recall_la_k(rezultate_gasite, id_corect, k=5):
return 1.0 if id_corect in rezultate_gasite[:k] else 0.0
# Exemplu: primul document corect (ID 42) a fost găsit pe poziția 2 dintr-un top 5:
top5 = [99, 42, 105, 12, 88]
print("MRR:", calculeaza_mrr(top5, 42)) # Ieșire: 0.5 (1/2)
print("Recall@5:", calculeaza_recall_la_k(top5, 42, 5)) # Ieșire: 1.0
Rezultat & Impact
Metrici clare și comparabile pentru benchmark-ul oricărei configurații RAG.
Greșeli frecvente și bune practici
- Optimizarea exclusivă pentru Recall@K ignorând MRR, ceea ce poate returna fragmentul critic pe locul 10, forțând LLM-ul să citească mult zgomot.
- Evaluarea sistemului pe întrebări create sintetic de același model LLM folosit și în producție, generând date de test nerealiste.