یه مرور سریع
تا اینجا یاد گرفتیم چطور دادهها رو Chunk کنیم، Embed کنیم، تو Vector Database ذخیره کنیم، جستجو کنیم و با Prompt مناسب جواب تولید کنیم. ولی یه سؤال بزرگ مونده: از کجا بفهمیم این سیستم واقعاً خوب کار میکنه؟
بدون ارزیابی، داری تو تاریکی تیر میاندازی. ممکنه فکر کنی RAG ات عالیه، ولی کاربرا جوابهای بیربط بگیرن. یا ممکنه یه تغییر کوچیک تو Chunking بدی و کل سیستم خراب بشه بدون اینکه بفهمی.
RAG Triad — سهگانه ارزیابی
ارزیابی RAG با سه معیار اصلی شروع میشه که بهشون میگن RAG Triad. هر کدوم یه جنبه مختلف از سیستم رو میسنجن.
۱. Context Relevance — آیا تکههای درست رو پیدا کردی؟
اول از همه باید ببینی مرحله بازیابی (Retrieval) خوب کار میکنه یا نه. یعنی وقتی کاربر سؤال میپرسه، تکههایی که از Vector Database برمیگردن واقعاً مرتبط هستن؟
فرض کن کاربر میپرسه «چطور رمز عبور رو عوض کنم؟» و سیستم تکهای درباره «تاریخچه شرکت» برمیگردونه. واضحه Context Relevance پایینه.
چطور بسنجیم؟
# ایده ساده: از یه LLM بخواه ارزیابی کنه
evaluation_prompt = """
سؤال کاربر: {question}
تکه بازیابیشده: {retrieved_chunk}
آیا این تکه برای پاسخ به سؤال مرتبط است؟
امتیاز بده: 0 (بیربط) تا 1 (کاملاً مرتبط)
"""
میتونی این کار رو برای هر تکه بازیابیشده انجام بدی و میانگین بگیری.
۲. Groundedness — آیا جواب بر اساس Context هست؟
حتی اگه تکههای درست رو پیدا کرده باشی، LLM ممکنه جوابی بده که تو اون تکهها نیست. یعنی Hallucination کنه.
مثلاً تکهها میگن «محصول X دو سال گارانتی داره» ولی LLM جواب میده «محصول X سه سال گارانتی داره». Context درسته، ولی جواب Grounded نیست.
چطور بسنجیم؟
evaluation_prompt = """
Context: {retrieved_chunks}
جواب تولیدشده: {generated_answer}
هر جمله از جواب را بررسی کن:
- آیا این جمله مستقیماً از Context قابل استنتاج است؟
- امتیاز: 0 (ساختگی) تا 1 (کاملاً مبتنی بر Context)
"""
۳. Answer Relevance — آیا جواب به سؤال ربط داره؟
این معیار میسنجه که آیا جواب نهایی واقعاً سؤال کاربر رو جواب میده. ممکنه Context درست باشه، Hallucination هم نباشه، ولی جواب به سؤال ربط نداشته باشه.
مثلاً کاربر میپرسه «چطور رمز عوض کنم؟» و سیستم جواب میده «رمز عبور باید حداقل ۸ کاراکتر باشه». درسته، ولی سؤال رو جواب نداده.
چطور بسنجیم؟
evaluation_prompt = """
سؤال: {question}
جواب: {generated_answer}
آیا این جواب مستقیماً سؤال کاربر را پاسخ میدهد؟
امتیاز: 0 (بیربط) تا 1 (کاملاً پاسخگو)
"""
رابطه بین سه معیار
این سه معیار مکمل همدیگن. اگه هر سه بالا باشن، سیستمت خوب کار میکنه:
- Context Relevance بالا + Groundedness بالا + Answer Relevance پایین = جستجو خوبه، LLM بد جواب میده
- Context Relevance پایین + هر چیز دیگه = مشکل تو مرحله بازیابیه
- Context Relevance بالا + Groundedness پایین = LLM داره Hallucination میکنه
RAGAS — فریمورک ارزیابی RAG
RAGAS (Retrieval Augmented Generation Assessment) یه فریمورک اوپنسورسه که ارزیابی RAG رو خودکار میکنه. اسمش بامزهست ولی کارش جدیه.
نصب و استفاده ساده
pip install ragas
from ragas import evaluate
from ragas.metrics import (
context_relevancy,
faithfulness,
answer_relevancy,
context_precision,
context_recall
)
# دادههای ارزیابی
eval_data = {
"question": ["سؤال ۱", "سؤال ۲", ...],
"answer": ["جواب ۱", "جواب ۲", ...],
"contexts": [["تکه ۱-۱", "تکه ۱-۲"], ...],
"ground_truth": ["جواب صحیح ۱", "جواب صحیح ۲", ...]
}
# ارزیابی
results = evaluate(
dataset=eval_data,
metrics=[
context_relevancy,
faithfulness,
answer_relevancy
]
)
print(results)
# {'context_relevancy': 0.82, 'faithfulness': 0.91, 'answer_relevancy': 0.87}
معیارهای RAGAS
- Faithfulness: معادل Groundedness. آیا جواب وفادار به Context هست؟
- Answer Relevancy: آیا جواب به سؤال مرتبطه؟
- Context Precision: آیا تکههای مرتبط در رتبههای بالا هستن؟
- Context Recall: آیا همه اطلاعات لازم بازیابی شدن؟
نکته: RAGAS از LLM برای ارزیابی استفاده میکنه. یعنی هزینه داره. برای هر ارزیابی، چندین فراخوانی API لازمه.
ارزیابی دستی vs خودکار
ارزیابی دستی
سادهترین روش: یه مجموعه سؤال-جواب درست کن و خودت (یا تیمت) جوابهای سیستم رو بررسی کن.
# مجموعه تست ساده
test_cases = [
{
"question": "چطور رمز عوض کنم؟",
"expected_answer": "از منوی تنظیمات، بخش امنیت، گزینه تغییر رمز",
"expected_sources": ["doc_security_v2.pdf"]
},
# ...
]
مزایا: دقیقه، متوجه مشکلات ظریف میشی
معایب: وقتگیره، مقیاسپذیر نیست، قضاوت آدمها متفاوته
ارزیابی خودکار با LLM
از یه LLM دیگه (یا همون LLM) بخواه جوابها رو ارزیابی کنه. همون چیزی که RAGAS انجام میده.
مزایا: سریعه، مقیاسپذیره، قابل تکراره
معایب: LLM خودش هم ممکنه اشتباه ارزیابی کنه، هزینه API داره
ترکیب هر دو — بهترین رویکرد
عملاً بهترین کار اینه:
- یه مجموعه تست طلایی (Golden Test Set) با ۵۰-۱۰۰ سؤال درست کن و دستی ارزیابی کن
- برای ارزیابیهای روزانه و بعد از هر تغییر، از ارزیابی خودکار استفاده کن
- هر ماه مجموعه تست طلایی رو آپدیت کن
شکستهای رایج — کجا RAG خراب میشه؟
۱. Missing Context (زمینه ناقص)
اطلاعات لازم اصلاً تو Knowledge Base نیست. مثلاً کاربر درباره یه قابلیت جدید سؤال میپرسه که هنوز مستنداتش اضافه نشده.
راهحل: مانیتور کن چه سؤالاتی جواب «نمیدونم» میگیرن. اینا نشوندهنده خلأ تو Knowledge Base هستن.
۲. Wrong Context (زمینه اشتباه)
تکههای بیربط بازیابی میشن. ممکنه مشکل از Embedding باشه، از Chunking باشه، یا از اینکه سؤال مبهمه.
راهحل: جستجوی ترکیبی استفاده کن. Metadata Filtering اضافه کن. سؤال رو قبل از جستجو بازنویسی کن.
۳. Hallucination (توهم)
LLM اطلاعاتی میگه که تو Context نیست. معمولاً وقتی اتفاق میافته که Prompt به اندازه کافی محدودکننده نیست.
راهحل: Prompt رو سفتتر کن. دمای LLM رو پایین بیار (temperature = 0). از مدلهای بهتر استفاده کن.
۴. Incomplete Answer (جواب ناقص)
جواب درسته ولی کامل نیست. مثلاً ۳ مرحله داره ولی فقط ۲ تاش رو میگه.
راهحل: top_k رو بیشتر کن. Chunk Size رو بررسی کن — شاید تکهها خیلی کوچیکن.
۵. Outdated Information (اطلاعات قدیمی)
Knowledge Base آپدیت نشده و جوابها قدیمین.
راهحل: یه پایپلاین آپدیت خودکار بساز. Metadata تاریخ بذار و تکههای جدیدتر رو ترجیح بده.
ساختن مجموعه تست — قدم به قدم
بذار عملی بگم چطور یه مجموعه تست خوب بسازی:
قدم ۱ — جمعآوری سؤالات واقعی
از لاگهای سیستم، سؤالات واقعی کاربرا رو جمع کن. اگه هنوز سیستم لانچ نشده، از تیم پشتیبانی بخواه رایجترین سؤالات رو لیست کنن.
قدم ۲ — دستهبندی سؤالات
categories = {
"factual": ["قیمت X چنده؟", "گارانتی Y چقدره؟"],
"how_to": ["چطور نصب کنم؟", "چطور تنظیم کنم؟"],
"troubleshooting": ["چرا کار نمیکنه؟", "خطای Z چیه؟"],
"comparison": ["فرق X و Y چیه؟"],
"out_of_scope": ["آب و هوا فردا چطوره؟"]
}
قدم ۳ — نوشتن جوابهای مرجع
برای هر سؤال، جواب درست رو بنویس. این جوابها «Ground Truth» هستن.
قدم ۴ — اجرا و مقایسه
for test in test_cases:
rag_answer = rag_system.query(test["question"])
scores = {
"context_relevance": evaluate_context(test, rag_answer),
"groundedness": evaluate_groundedness(rag_answer),
"answer_relevance": evaluate_answer(test, rag_answer)
}
log_results(test, rag_answer, scores)
A/B Testing — مقایسه دو نسخه
وقتی میخوای یه تغییر بدی (مثلاً Chunk Size رو عوض کنی یا مدل Embedding رو تغییر بدی)، A/B Testing بهترین راه سنجشه.
# ایده ساده A/B Testing
for question in test_questions:
answer_a = rag_v1.query(question) # نسخه فعلی
answer_b = rag_v2.query(question) # نسخه جدید
score_a = evaluate(question, answer_a)
score_b = evaluate(question, answer_b)
results.append({
"question": question,
"v1_score": score_a,
"v2_score": score_b,
"winner": "v2" if score_b > score_a else "v1"
})
# نتیجه نهایی
v2_win_rate = sum(1 for r in results if r["winner"] == "v2") / len(results)
print(f"V2 در {v2_win_rate:.0%} موارد بهتر بود")
نکته مهم: حتماً از یه مجموعه سؤال ثابت استفاده کن. اگه هر بار سؤالات متفاوت باشن، نمیتونی مقایسه درستی کنی.
جمعبندی
تو این اپیزود یاد گرفتی که:
- RAG Triad سه معیار اصلی ارزیابیه: Context Relevance، Groundedness، Answer Relevance
- RAGAS یه فریمورک آماده برای ارزیابی خودکاره
- ترکیب ارزیابی دستی و خودکار بهترین رویکرده
- شکستهای رایج RAG چیا هستن و چطور تشخیصشون بدی
- چطور یه مجموعه تست خوب بسازی
- A/B Testing چطور کمکت میکنه تغییرات رو بسنجی
حالا میدونی سیستمت چقدر خوب کار میکنه. ولی آیا میشه بهترش کرد؟ قطعاً! تو اپیزود بعدی درباره تکنیکهای پیشرفته RAG صحبت میکنیم — Reranking، Query Expansion، HyDE و چیزهای جالب دیگهای که کیفیت RAG رو به طرز چشمگیری بالا میبرن.
نظرات
هنوز نظری ثبت نشده. اولین نفر باشید!
نظر خود را بنویسید