Talim

RAG ni baholash

RAG sifatini o'lchash: retrieval hit-rate, faithfulness va groundedness — amaliy eval skripti.

10 daqiqa o‘qishO'rta → Ilg'orMemory va RAG23 / 23
RAG eval sikli

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.

Bu dars foydali bo‘ldimi?