مقاييس التوليد: الأمانة وملاءمة الإجابة
استخدموا RAGAS لقياس مدى أمانة الإجابات المولّدة للسياق المسترجع، ومدى معالجتها لسؤال المستخدم فعلًا من دون هلوسة.
مقاييس التوليد: الأمانة وملاءمة الإجابة درس مجاني في AI Engineering Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Engineering Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.
قياس مرحلة التوليد
حتى عندما يعثر نظام الاسترجاع على الأجزاء المثالية، قد تظل مرحلة التوليد عرضة للفشل. فقد يتجاهل LLM السياق المسترجَع ويجيب اعتمادًا على ذاكرته المعلَّمية، أو يسيء تفسير ما يقوله السياق، أو يجيب عن سؤال مختلف قليلًا عن السؤال المطروح. تحدد مقاييس التوليد هذه الإخفاقات بشكل مستقل عن الاسترجاع، مما يتيح لكم تحديد كل مشكلة وإصلاحها. ومقياسا التوليد الأساسيان هما الأمانة وصلة الإجابة.
الأمانة: التعريف
تقيس الأمانة ما إذا كان من الممكن تتبّع كل ادعاء في الإجابة المُولَّدة مباشرةً إلى السياق المسترجَع. ولا تقدم الإجابة الأمينة أي معلومات غير موجودة في السياق. تُقاس الأمانة على مستوى الادعاء: تُجزّأ الإجابة إلى عبارات ذرية فردية، ثم يُتحقق من دعم السياق لكل عبارة. وتساوي درجة الأمانة نسبة الادعاءات المدعومة.
# Faithfulness = supported_claims / total_claims
example_answer = (
'Employees receive 15 vacation days per year. '
'Remote work is allowed on Wednesdays and Fridays. '
'The CEO is John Smith.'
)
example_context = (
'15 vacation days are granted annually. '
'Remote work is permitted on Wednesdays and Fridays.'
)
# Claim 1: 15 vacation days — SUPPORTED
# Claim 2: Remote work Wed+Fri — SUPPORTED
# Claim 3: CEO is John Smith — NOT IN CONTEXT (hallucinated)
# Faithfulness = 2/3 = 0.67تنفيذ الأمانة باستخدام LLM بوصفه مُقيِّمًا
الطريقة العملية الأكثر لقياس الأمانة على نطاق واسع هي استخدام LLM قوي بوصفه مُقيِّمًا. وجّهوا نموذج LLM المُقيِّم إلى تجزئة الإجابة إلى ادعاءات فردية، ثم التحقق من كل ادعاء مقابل السياق. يعيد المُقيِّم قائمة بالادعاءات المصنفة SUPPORTED أو UNSUPPORTED، ثم تحسبون نسبة الادعاءات المدعومة. يتوسع هذا الأسلوب ليشمل آلاف التقييمات في الساعة، وبتكلفة بضعة سنتات لكل تقييم.
import json
def evaluate_faithfulness(answer, context, llm_client):
prompt = (
'Task: Evaluate the faithfulness of an answer against a context.\n\n'
f'Context:\n{context}\n\n'
f'Answer:\n{answer}\n\n'
'Steps:\n'
'1. Break the answer into individual atomic claims.\n'
'2. For each claim, check if it is supported by the context.\n'
'3. Return JSON: {"claims": [{"text": "...", "supported": true/false}], "score": 0.0-1.0}'
)
response = llm_client.chat.completions.create(
model='gpt-4o',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}]
)
return json.loads(response.choices[0].message.content)صلة الإجابة: التعريف
يقيس مدى ملاءمة الإجابة ما إذا كانت الإجابة المُولَّدة تتناول سؤال المستخدم فعلًا. فقد تكون الإجابة شديدة الأمانة، لكنها مع ذلك لا تصيب جوهر السؤال — على سبيل المثال، إذا سأل المستخدم: «كيف أعيد تعيين كلمة المرور؟» وكانت الإجابة تشرح بالتفصيل سياسة الأمان العامة للشركة من دون ذكر إجراء إعادة تعيين كلمة المرور. وتُعدّ ملاءمة الإجابة مستقلة عن الأمانة: فقد تكون أمينًا (لا تقول إلا أشياء ضمن السياق)، لكن إجابتك غير ملائمة (لا تتناول ما سُئل عنه).
قياس مدى ملاءمة الإجابة
تقيس RAGAS مدى ملاءمة الإجابة باستخدام تقنية ذكية للتوليد العكسي: إذ يُولّد نموذج LLM المُقيِّم عدة أسئلة افتراضية يُفترض أن تكون الإجابة المُولَّدة جوابًا عنها، ثم يقيس مدى تشابه هذه الأسئلة المُولَّدة مع السؤال الأصلي باستخدام تشابه جيب التمام للتمثيلات. ويشير التشابه المرتفع بين الأسئلة الافتراضية المُولَّدة والسؤال الأصلي إلى ارتفاع مدى ملاءمة الإجابة.
def evaluate_answer_relevance(question, answer, llm_client, embed_fn):
# Generate hypothetical questions for this answer
prompt = (
f'Given this answer: "{answer}"\n\n'
'Generate 3 questions that this answer would be a good response to.\n'
'Return as JSON: {"questions": ["...", "...", "..."]}'
)
response = llm_client.chat.completions.create(
model='gpt-4o-mini',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}]
)
hyp_questions = json.loads(response.choices[0].message.content)['questions']
# Measure similarity to original question
orig_embedding = embed_fn(question)
hyp_embeddings = [embed_fn(q) for q in hyp_questions]
similarities = [cosine_similarity(orig_embedding, e) for e in hyp_embeddings]
return sum(similarities) / len(similarities)استدعاء السياق: هل استرجعنا معلومات كافية؟
يقيس استدعاء السياق ما إذا كان السياق المسترجَع يحتوي على معلومات كافية للإجابة عن السؤال بشكل صحيح. ويفحص إجابة الحقيقة المرجعية جملةً جملة: هل يمكن إسناد كل جملة إلى إحدى الكتل المسترجَعة؟ يعني ارتفاع استدعاء السياق أن أداة الاسترجاع عثرت على كل ما يلزم. أما انخفاضه فيعني أن معلومات أساسية كانت مفقودة من الكتل المسترجَعة، ولذلك لا يستطيع نموذج LLM الإجابة بشكل صحيح مهما كانت جودة التوليد.
def evaluate_context_recall(ground_truth_answer, retrieved_contexts, llm_client):
prompt = (
f'Ground truth answer:\n{ground_truth_answer}\n\n'
f'Retrieved context:\n{",".join(retrieved_contexts)}\n\n'
'For each sentence in the ground truth answer, determine if it '
'can be attributed to the retrieved context.\n'
'Return JSON: {"sentences": [{"text": "...", "in_context": true/false}], "recall": 0.0-1.0}'
)
response = llm_client.chat.completions.create(
model='gpt-4o',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}]
)
return json.loads(response.choices[0].message.content)دقة السياق: هل الكتل المسترجَعة ملائمة؟
تقيس دقة السياق ما إذا كانت الكتل المسترجَعة مفيدة فعلًا للإجابة عن السؤال. وتعني دقة السياق المرتفعة أن الكتل المسترجَعة مرتبطة ارتباطًا وثيقًا بالسؤال. أما دقة السياق المنخفضة فتعني أن كثيرًا من الكتل المسترجَعة ضوضاء خارجة عن الموضوع، ويتعين على نموذج LLM قراءتها واستبعادها، مما يزيد خطر الالتباس. وتُقاس دقة السياق بالتحقق من الكتل المسترجَعة التي استُخدمت أو أُشير إليها فعلًا في الإجابة المُولَّدة.
def evaluate_context_precision(question, answer, retrieved_contexts, llm_client):
precision_scores = []
for i, context in enumerate(retrieved_contexts, 1):
prompt = (
f'Question: {question}\n\n'
f'Context chunk {i}: {context}\n\n'
f'Answer: {answer}\n\n'
'Was this context chunk useful in generating the answer? '
'Return JSON: {"useful": true/false, "reason": "..."}'
)
response = llm_client.chat.completions.create(
model='gpt-4o-mini',
response_format={'type': 'json_object'},
messages=[{'role': 'user', 'content': prompt}]
)
result = json.loads(response.choices[0].message.content)
precision_scores.append(1.0 if result['useful'] else 0.0)
return sum(precision_scores) / len(precision_scores)استخدام RAGAS لجميع المقاييس دفعةً واحدة
تطبّق مكتبة RAGAS مقاييس RAG الأساسية الأربعة — دقة السياق، واستدعاء السياق، والأمانة، ومدى ملاءمة الإجابة — ضمن إطار عمل واحد. وتتولى داخليًا استدعاءات نموذج LLM المُقيِّم. مرّر مجموعة بيانات تحتوي على الأسئلة، والإجابات المُولَّدة، والسياقات المسترجَعة، وإجابات الحقيقة المرجعية، لتحصل على تقرير شامل بالدرجات. وتدعم RAGAS أيضًا التقييم غير المتزامن، بحيث يمكنك تقييم مئات الأمثلة بالتوازي.
from ragas import evaluate
from ragas.metrics import (
faithfulness, answer_relevancy,
context_precision, context_recall
)
from datasets import Dataset
# Build evaluation dataset
eval_samples = [
{
'question': item['question'],
'answer': item['generated_answer'],
'contexts': item['retrieved_texts'],
'ground_truth': item['expected_answer']
}
for item in test_results
]
eval_dataset = Dataset.from_list(eval_samples)
results = evaluate(eval_dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall]
)
results.to_pandas().to_csv('eval_results.csv', index=False)تشخيص المشكلات باستخدام مجموعات المقاييس
يكشف الجمع بين المقاييس عن مشكلات محددة في النظام. أمانة منخفضة + دقة سياق مرتفعة → يتجاهل نموذج LLM السياق ويختلق معلومات (أصلح صياغة المطالبة). استدعاء سياق منخفض + أمانة مرتفعة → تفوّت أداة الاسترجاع كتلًا أساسية، لكن نموذج LLM ينقل بأمانة ما عثر عليه (أصلح تقسيم النصوص أو التمثيلات). مدى ملاءمة إجابة منخفض + أمانة مرتفعة → الكتل المسترجَعة مرتبطة بالموضوع ارتباطًا جانبيًا، ويناقشها نموذج LLM بأمانة لكنه لا يجيب عن السؤال (حسّن تصفية الاسترجاع أو إعادة صياغة الاستعلام).
# Diagnostic matrix
diagnostics = [
{
'condition': 'Low faithfulness + High context precision',
'cause': 'LLM ignoring context, answering from parametric memory',
'fix': 'Strengthen system prompt: "Answer ONLY from the provided context"'
},
{
'condition': 'Low context recall + High faithfulness',
'cause': 'Retriever missing relevant chunks',
'fix': 'Improve chunking strategy, embedding model, or increase top-k'
},
{
'condition': 'Low answer relevance + High context recall',
'cause': 'Retrieved context is off-topic; LLM is answering wrong question',
'fix': 'Add query rewriting or improve metadata filters'
}
]التقييم البشري للمعايرة
ترتبط مقاييس التقييم بواسطة LLM بحكم البشر، لكنها لا تتطابق معه تمامًا. عاير مقاييسك الآلية بأن تطلب من 3 مُقيّمين بشريين تسجيل درجات عينة عشوائية من 50 مخرجًا من حيث الأمانة ومدى ملاءمة الإجابة، باستخدام مقياس من 1 إلى 5. احسب مدى الاتفاق بين تقييم نموذج LLM ومتوسط التقييم البشري. وإذا كان نموذج LLM يمنح درجات أعلى أو أقل منهجيًا مقارنة بالبشر، فطبّق معامل تصحيح. تمنحك المقاييس الآلية المُعايرة الثقة في أن تحسن الدرجات يعكس تحسنًا حقيقيًا في الجودة.
from scipy.stats import spearmanr
def calibrate_judge_vs_humans(samples):
'''samples: [{"llm_score": 0.9, "human_score": 4.2}, ...]'''
llm_scores = [s['llm_score'] for s in samples]
human_scores = [s['human_score'] / 5.0 for s in samples] # normalize to 0-1
correlation, pvalue = spearmanr(llm_scores, human_scores)
print(f'LLM-Human Spearman correlation: {correlation:.3f} (p={pvalue:.4f})')
mean_llm = sum(llm_scores) / len(llm_scores)
mean_human = sum(human_scores) / len(human_scores)
bias = mean_llm - mean_human
print(f'LLM bias vs humans: {bias:+.3f}')
return correlation, biasتحديد أهداف المقاييس لبيئة الإنتاج
قبل نشر نظام RAG في بيئة الإنتاج، حدّد الحدود الدنيا للمقاييس التي يجب أن يستوفيها النظام. ومن الأهداف الشائعة في بيئة الإنتاج: أمانة > 0.90 (أقل من 10% من ادعاءات الإجابة مختلقة)، ومدى ملاءمة الإجابة > 0.80 (أكثر من 80% من الإجابات تتناول السؤال فعلًا)، ودقة السياق > 0.60 (معظم الكتل المسترجَعة ملائمة)، واستدعاء السياق > 0.75 (معظم الحقائق الأساسية متاحة في السياق المسترجَع). ولا ينبغي نشر الأنظمة التي لا تستوفي هذه الحدود قبل إجراء مزيد من التحسينات.
PRODUCTION_THRESHOLDS = {
'faithfulness': 0.90,
'answer_relevancy': 0.80,
'context_precision': 0.60,
'context_recall': 0.75
}
def check_production_readiness(metrics):
ready = True
print('Production readiness check:')
for metric, threshold in PRODUCTION_THRESHOLDS.items():
score = metrics.get(metric, 0)
status = 'PASS' if score >= threshold else 'FAIL'
print(f' {metric}: {score:.2f} (>= {threshold}) -> {status}')
if status == 'FAIL':
ready = False
print(f'Overall: {"READY" if ready else "NOT READY"}')
return readyتحقق سريع
اختبر مدى فهمك لمفاهيم هندسة الذكاء الاصطناعي الواردة في هذا الدرس.
مراجعة الدرس
تعلّمت في هذا الدرس: الأمانة بوصفها مقياسًا على مستوى الادعاء يتحقق مما إذا كانت كل عبارة في الإجابة مدعومة بالسياق المسترجَع، ومدى ملاءمة الإجابة بوصفه مقياسًا يحدد ما إذا كانت الإجابة تتناول السؤال الفعلي، واستدعاء السياق ودقته لقياس جودة الاسترجاع من منظور التوليد، ومكتبة RAGAS للتقييم الآلي متعدد المقاييس. وفي الخطوة التالية، سنجمع كل هذه المقاييس في أداة تقييم آلية يمكنك تشغيلها عند كل تغيير.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «مقاييس التوليد: الأمانة وملاءمة الإجابة» مجاني؟
نعم — نص درس «مقاييس التوليد: الأمانة وملاءمة الإجابة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Engineering Academy، انتقل إلى CoddyKit PRO. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.
ماذا ستتعلم في «مقاييس التوليد: الأمانة وملاءمة الإجابة»؟
استخدموا RAGAS لقياس مدى أمانة الإجابات المولّدة للسياق المسترجع، ومدى معالجتها لسؤال المستخدم فعلًا من دون هلوسة. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Engineering Academy؟
لا تُشترط خبرة سابقة. AI Engineering Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «مقاييس التوليد: الأمانة وملاءمة الإجابة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Engineering Academy هذا؟
نعم. كل درس في AI Engineering Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا يهم التقييم في RAG
- مقاييس الاسترجاع: معدل الإصابة وMRR وNDCG
- مقاييس التوليد: الأمانة وملاءمة الإجابة
- بناء أداة تقييم آلية