RAG Evaluation: 'ভালো RAG' কীভাবে মাপব? (faithfulness, relevance)

RAG মাপার পদ্ধতি (Series 08, Episode 06)

🔴 ADVANCED Series 08 — Generative AI Engineering Episode 06 / 09

📑 এই পর্বে যা যা আছে

🧩 ১. গল্প: "ভালো হয়েছে" — কিন্তু কতটা?

Rahim reranking যোগ করার পর boss-কে বলল "এখন RAG অনেক ভালো"। Boss পাল্টা জিজ্ঞেস করলেন — "কতটা ভালো? আগের চেয়ে ২০% ভালো, নাকি ২%? কোন প্রশ্নে খারাপ করছে? তুমি প্রমাণ কী দেখাবে?" Rahim চুপ। তার কাছে "মনে হচ্ছে ভালো" ছাড়া কোনো সংখ্যা নেই।

Maya: "এটাই junior আর senior-এর সবচেয়ে বড় পার্থক্য। যে RAG মাপতে পারে না, সে RAG উন্নত করতে পারে না — কারণ কোন পরিবর্তন সাহায্য করল আর কোনটা ক্ষতি করল, সে জানবে না। RAG evaluation শেখো — interview-তেও এই একটা প্রশ্ন তোমাকে আলাদা করে দেবে।"

২. সমস্যা: চোখে দেখা evaluation স্কেল করে না

৫টা প্রশ্নের উত্তর চোখে পড়ে "ঠিক আছে" বলা যায়। কিন্তু ৫০০টা প্রশ্ন? বা reranker বদলালে পুরো system আবার যাচাই? manual eval ধীর, subjective ও পুনরাবৃত্তিহীন। দরকার — পরিমাপযোগ্য, পুনরাবৃত্তিযোগ্য metric, যাতে প্রতিটা পরিবর্তনের প্রভাব সংখ্যায় দেখা যায়।

মূল দর্শন: "তুমি যা মাপতে পারো না, তা উন্নত করতে পারো না।" RAG evaluation = আপনার system-এর report card।

🧩 ৩. RAG-এর দুই অংশ আলাদা করে মাপা

RAG দুটো ধাপ — retrieval আর generation। উত্তর খারাপ হলে দোষ কার? আলাদা না মাপলে বোঝা যায় না।

প্রশ্ন → [ Retrieval ] → context → [ Generation ] → উত্তর │ │ Retrieval মাপো: Generation মাপো: সঠিক chunk এল কি? context মেনে উত্তর দিল কি?
উত্তর খারাপ + retrieval খারাপ → chunking/rerank ঠিক করুন। উত্তর খারাপ + retrieval ঠিক → prompt/generation ঠিক করুন। এই diagnosis-ই evaluation-কে মূল্যবান করে।

📊 ৪. মূল metric: faithfulness, answer relevance, context relevance

Metricকী মাপেকম হলে সমস্যা
Faithfulnessউত্তর কি শুধু context থেকে? (বানায়নি তো?)hallucination হচ্ছে
Answer relevanceউত্তর কি আসলে প্রশ্নের উত্তর দিল?এড়িয়ে/অপ্রাসঙ্গিক উত্তর
Context relevanceretrieved chunk কি প্রশ্নের সাথে প্রাসঙ্গিক?retrieval দুর্বল
এই তিনটা হলো RAG eval-এর হৃদয় (ragas-এর মতো tool এগুলোই মাপে)। faithfulness হলো hallucination-এর উল্টো — উচ্চ faithfulness মানে model context-এর বাইরে যায়নি।

🪜 ৫. তিন স্তরে বোঝা

Level 1 — সহজ intuition

একটা open-book পরীক্ষার খাতা দেখা ভাবুন। তিনটা প্রশ্ন করবেন: (১) ছাত্র কি বইয়ের বাইরে থেকে বানিয়ে লিখেছে? (faithfulness) (২) আসল প্রশ্নের উত্তর দিয়েছে, নাকি ঘুরিয়ে? (answer relevance) (৩) সে যে পৃষ্ঠা খুলেছিল, সেটা কি ঠিক পৃষ্ঠা? (context relevance)।

Level 2 — technical ভাবে কী হচ্ছে

প্রতিটা metric ০-১ স্কেলে স্কোর দেয়। faithfulness = উত্তরের claim গুলোর কত অংশ context দিয়ে সমর্থিত। answer relevance = উত্তর ও প্রশ্নের semantic মিল। context relevance = retrieved chunk-এর কত অংশ আসলে কাজে লেগেছে।

Level 3 — engineer perspective

Engineer একটা golden dataset (প্রশ্ন + expected তথ্য) বানিয়ে CI-তে eval চালায় — প্রতিটা কোড/prompt পরিবর্তনে স্কোর ওঠানামা track করে। এটা RAG-কে "vibe check" থেকে "engineering discipline"-এ নিয়ে যায়।

🎯 ৬. Retrieval metric: recall@k, precision@k, MRR

যদি জানা থাকে কোন chunk "সঠিক" (labeled), তাহলে retrieval-কে সরাসরি মাপা যায়:

RAG উন্নত করার সময় প্রথমে retrieval metric দেখুন — কারণ retrieval খারাপ হলে generation যতই ভালো হোক, উত্তর খারাপই থাকবে।

💻 ৭. Code: একটা ছোট eval harness

কেন নিজের harness? — বড় tool-এর আগে ধারণাটা হাতে বোঝা দরকার। এখানে একটা golden set-এ retrieval recall@k মাপছি (কোনো external service ছাড়াই, তাই junior-রা সহজে চালাতে পারে)।

# golden set: প্রতিটা প্রশ্নের জন্য কোন chunk_id সঠিক তা জানা golden = [ {"q": "Python job আছে?", "relevant_ids": {3, 7}}, {"q": "remote FastAPI role?", "relevant_ids": {12}}, {"q": "junior ML salary?", "relevant_ids": {5, 9}}, ] def recall_at_k(retrieved_ids, relevant_ids): if not relevant_ids: return 0.0 hit = len(set(retrieved_ids) & relevant_ids) return hit / len(relevant_ids) def evaluate(retrieve_fn, k=5): scores = [] for item in golden: ids = retrieve_fn(item["q"], k=k) # list[int] r = recall_at_k(ids, item["relevant_ids"]) scores.append(r) print(f"{item['q']:30s} recall@{k} = {r:.2f}") avg = sum(scores) / len(scores) print(f"\nAverage recall@{k} = {avg:.2f}") return avg # baseline বনাম reranked তুলনা করুন: # evaluate(vector_only_retrieve) # evaluate(retrieve_and_rerank)
এই একই harness দিয়ে "reranking যোগ করার আগে ও পরে" average recall তুলনা করলেই boss-এর প্রশ্নের সংখ্যাগত উত্তর হাতে চলে আসে।

⚖️ ৮. LLM-as-a-judge — সাবধানতাসহ

faithfulness/answer-relevance-এর মতো subjective metric-এ প্রায়ই একটা শক্তিশালী LLM-কে "বিচারক" বানানো হয় — সে উত্তর ও context দেখে ০-১ স্কোর দেয়। এটা দ্রুত ও scalable, কিন্তু নিখুঁত নয়।

সতর্কতা: LLM judge-ও ভুল করে, bias থাকে, আর নিজের ঘরানার উত্তরকে বেশি নম্বর দিতে পারে। তাই — (১) judge prompt স্পষ্ট রাখুন, (২) কিছু নমুনা মানুষ দিয়ে verify করুন, (৩) শুধু judge-এর উপর চূড়ান্ত সিদ্ধান্ত না নিয়ে retrieval metric-এর সাথে মিলিয়ে দেখুন।

🗂️ ৯. Golden dataset কীভাবে বানাবেন

ছোট কিন্তু যত্নে বানানো golden set বড় কিন্তু এলোমেলো set-এর চেয়ে অনেক বেশি কার্যকর। ৩০টা ভালো উদাহরণ দিয়েই শুরু করা যায়।

🇧🇩 ১০. বাস্তব উদাহরণ: বাংলাদেশের context

💼 ১১. Boss Question

Boss: "evaluation-এ সময় দিলে তো নতুন feature দেরি হবে। দরকার কী?"

উত্তর: eval ছাড়া প্রতিটা "improvement" আসলে অন্ধকারে ঢিল। একটা পরিবর্তন হয়তো একদিকে ভালো করছে, অন্যদিকে ভাঙছে — eval না থাকলে জানবই না, আর একদিন production-এ ভুল উত্তর গিয়ে সম্মান ও টাকা দুটোই যাবে। ছোট eval harness একবার বানালে প্রতিটা future পরিবর্তন সেকেন্ডে যাচাই হয় — এটা দীর্ঘমেয়াদে গতি বাড়ায়, কমায় না।

🔎 ১২. Job Requirement Decoder

JD: "Experience evaluating LLM / RAG systems"

১. কী বোঝায়? RAG-এর quality metric দিয়ে মাপা ও উন্নত করার ক্ষমতা।
২. কেন চায়? production LLM system unreliable হলে বিপদ; মাপতে না পারলে বিশ্বাসযোগ্য করা অসম্ভব।
৩. কোন সমস্যা সমাধান করে? "মনে হচ্ছে ভালো" থেকে সংখ্যাভিত্তিক, পুনরাবৃত্তিযোগ্য মান নিয়ন্ত্রণ।
৪. junior-এর কী জানা লাগে? faithfulness/answer/context relevance, recall@k, golden set, LLM-as-judge-এর সীমা।
৫. এখনই কী master লাগে না? বড় automated eval pipeline, human-annotation ops, custom metric গবেষণা।
৬. GitHub-এ কীভাবে দেখাবে? RAG repo-তে একটা eval/ ফোল্ডার — golden set + recall script + before/after table।
৭. interview প্রশ্ন? "RAG কীভাবে evaluate করবে?", "faithfulness মানে?", "retrieval ভালো কিনা কীভাবে মাপবে?"

⚠️ ১৩. সাধারণ ভুল

ভুল ১: শুধু final উত্তর দেখা, retrieval আলাদা না মাপা। → দোষ কোথায় বোঝা যায় না।

ভুল ২: golden set না রাখা। → প্রতিবার নতুন করে চোখে যাচাই, inconsistent।

ভুল ৩: LLM-judge-কে অভ্রান্ত ভাবা। → নমুনা মানুষ দিয়ে verify করুন।

ভুল ৪: "উত্তর নেই" কেস eval-এ না রাখা। → hallucination ধরা পড়ে না।

ভুল ৫: একটাই metric-এ সব বিচার। → faithfulness + relevance + retrieval একসাথে দেখুন।

🎤 ১৪. Interview Prep

প্র: RAG system কীভাবে evaluate করবে?
উ: golden set-এ retrieval (recall@k) + generation (faithfulness, answer relevance) আলাদা মাপি; before/after তুলনা করি।

প্র: Faithfulness কী?
উ: উত্তরের claim গুলো কতটা retrieved context দিয়ে সমর্থিত — hallucination-এর উল্টো।

প্র: retrieval ভালো কিনা কীভাবে জানবে?
উ: labeled relevant chunk-এর বিপরীতে recall@k, precision@k, MRR।

প্র: LLM-as-judge-এর ঝুঁকি?
উ: bias ও ভুল করতে পারে; মানুষ দিয়ে spot-check ও অন্য metric-এর সাথে মিলিয়ে দেখা দরকার।

✍️ ১৫. হাতে-কলমে

আপনার RAG-এর জন্য ১০টা প্রশ্নের golden set বানান (২টা যেন "উত্তর নেই" ধরনের হয়)। প্রতিটার সঠিক chunk id চিহ্নিত করুন। evaluate() চালিয়ে baseline recall@5 বের করুন। তারপর chunk-size বদলে আবার চালান — recall বাড়ল না কমল, নোট করুন।

🚀 ১৬. Project Connection

flagship assistant-এ এখন একটা eval/ ফোল্ডার যোগ হলো — golden প্রশ্ন, recall script আর একটা before/after table। এটা P8-কে সত্যিকারের engineering project বানায়, এবং interview-তে "তুমি quality কীভাবে নিশ্চিত করলে?" প্রশ্নের শক্ত উত্তর দেয়। পরের episode-এ আমরা RAG থেকে সরে agents-এ যাব — যখন শুধু retrieve নয়, action নিতে হয়।

📌 ১৭. সারসংক্ষেপ ও পরবর্তী পর্ব

✓ যা মাপা যায় না, তা উন্নত করা যায় না
✓ retrieval ও generation আলাদা করে মাপুন
✓ মূল metric: faithfulness, answer relevance, context relevance
✓ retrieval metric: recall@k, precision@k, MRR
✓ golden dataset + ছোট harness = পুনরাবৃত্তিযোগ্য eval
✓ LLM-as-judge কাজের, কিন্তু verify করে ব্যবহার করুন
পরবর্তী Episode: "AI Agents" — RAG তথ্য এনে উত্তর দেয়, কিন্তু যদি assistant-কে হিসাব করতে, API কল করতে বা কয়েক ধাপ পরিকল্পনা করতে হয়? tools, function calling, memory আর agent বনাম workflow-এর পার্থক্য।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.