Kirish
RAG ishga tushdi — demo chiroyli. Shu bilan tugadi deb o’ylamang. Eval bo’lmasa, regressiya ko’rinmaydi. Chunk o’lchamini o’zgartirdingizmi, embedding yangiladingizmi, prompt’ni qattiqlashtirdingizmi — ta’sirini raqamsiz bilmaysiz. Kecha 90% to’g’ri javob bergan tizim bugun 70% ga tushishi mumkin va buni hech kim sezmaydi. Baholash qo’shimcha emas, RAG ning asosiy qismi.
Baholash ikki qatlamda: avval hujjatni topa oldikmi (retrieval), keyin topilgan hujjatga sodiq javob berdikmi (generation).
1. Retrieval metriklari
Har bir savol uchun to’g’ri chunk qaysi ekanini oldindan belgilab, golden dataset tuzasiz. Keyin Top-K natijani shu dataset’ga solishtirasiz.
| Metrika | Nima o’lchaydi | Yaxshi qiymat |
|---|---|---|
| Hit-rate@K | Javob Top-K ichida bormi (0/1) | ≥ 0.85 @ K=5 |
| Recall@K | Kerakli chunk’larning necha foizi Top-K da | ≥ 0.80 @ K=5 |
| MRR | To’g’ri chunk nechanchi o’rinda (1/rank) | ≥ 0.70 |
| Precision@K | Top-K ichida nechtasi foydali | ≥ 0.60 @ K=5 |
Hit-rate eng amaliy metrika: 100 savoldan 85 tasida to’g’ri chunk Top-5 da bo’lsa, hit-rate 0.85. Recall bir savolga bir nechta chunk kerak bo’lganda muhim.
K ni tanlash. K=3 tez va aniq, lekin kontekst yetmay qoladi. K=10 qamrovi keng, ammo shovqin ko’payadi va LLM “o’rtada yo’qolish” ga uchraydi. K=5 dan boshlang, hit-rate va precision kesishgan nuqtani toping. Ko’pincha K=5 + reranker, K=10 dan yaxshiroq.
2. Generatsiya metriklari
Topish yetarli emas — model topilgan matnga sodiq qoldimi?
Faithfulness (groundedness) — javobdagi har bir fakt kontekstda bormi? To’qilgan bo’lsa, faithfulness past. RAG da eng muhim metrika.
Relevance — javob savolga mosmi? Faithful bo’lsa ham, aloqasiz bo’lishi mumkin.
Hallucination rate — faithfulness teskarisi. 100 javobdan 12 tasi kontekstdan tashqarida bo’lsa, rate 12%.
Qanday tekshiriladi:
- Qo’lda — 20-50 namunani odam o’qiydi, har gapni “kontekstdan / to’qilgan” deb belgilaydi. Sekin, lekin ishonchli.
- LLM-as-judge — boshqa LLM ga “javob faqat kontekstdan kelib chiqqanmi?” deb so’raysiz. Tez va masshtablanadi, lekin judge ham xato qiladi — uni ham golden’da kalibrlash kerak.
Amaliy maslahat
Faithfulness ni bitta sonda jamlash o'rniga, xatolarni toifalang: "kontekstdan chetga chiqish", "raqamni noto'g'ri ko'chirish", "manbani aralashtirish". Shunda qaysi prompt yoki chunking aybdorligini tez topasiz.
3. Amaliy eval skripti
Minimal skript: retrieve() — vektor qidiruvingiz, generate() — LLM chaqiruvingiz. Sodda faithfulness uchun substring tekshiruvi, prod’da LLM judge bilan almashtiriladi.
golden = [
{"q": "Mushuklar necha km/soat yuguradi?", "expected_chunk": "mushuk_49km", "answer_keywords": ["49"]},
{"q": "Toj Mahal nimadan qurilgan?", "expected_chunk": "toj_marmar", "answer_keywords": ["marmar"]},
]
def evaluate(golden, k=5):
hits = 0
faithful = 0
for item in golden:
retrieved = retrieve(item["q"], top_k=k) # -> list[chunk_id]
answer = generate(item["q"], retrieved) # -> str
# Retrieval: hit-rate
if item["expected_chunk"] in retrieved:
hits += 1
# Generation: faithfulness (sodda check; prod'da LLM judge)
context_text = " ".join(load_text(cid) for cid in retrieved)
if all(kw.lower() in answer.lower() for kw in item["answer_keywords"]) \
and all(kw.lower() in context_text.lower() for kw in item["answer_keywords"]):
faithful += 1
print(f"Hit-rate@{k}: {hits/len(golden):.2f}")
print(f"Faithfulness: {faithful/len(golden):.2f}")
print(f"Hallucination rate: {1 - faithful/len(golden):.2f}")
evaluate(golden, k=5)
Har safar bir xil golden to’plamda yurgizing. faithfulness ni keyinchalik judge("Kontekstdan kelib chiqqanmi? Kontekst: {ctx} Javob: {ans}") ga almashtiring.
4. Xatolar tahlili
Metrikalar tushsa, sababni manba bo’yicha ajrating:
Ko'p uchraydigan xatolar
Chunking noto'g'ri: juda katta — detal ko'miladi; juda kichik — jumla uziladi. Embedding eski: indeks yangilanmagan, yangi hujjat vektorda yo'q. K noto'g'ri: K kichik — recall past, K katta — precision va faithfulness tushadi.
Avval retrieval ga qarang. Hit-rate past bo’lsa, generatsiyani ayblamang — chunking, embedding yoki K ni tuzating. Hit-rate yuqori, faithfulness past bo’lsa, prompt’ni qattiqlashtiring (“faqat kontekstdan foydalan”) va kontekst formatini tozalang.
Xulosa
RAG ni “qildim” deyish oson, isbotlash qiyin. Isbot — raqam. 20-30 ta sifatli golden savol to’plang, har biriga to’g’ri chunk’ni biriktiring va skriptni saqlab qo’ying.
Har indexing o’zgarishidan keyin eval’ni qayta yurgizing. Hit-rate va faithfulness diff’ini ko’ring — regressiya erta bilinadi, yaxshilanish taxmin emas, o’lchov bo’ladi.