لم يعد بناء نظام التوليد المعزز بالاسترجاع (RAG) مجرد ربط قاعدة بيانات متجهية بنموذج لغوي كبير (LLM). إنه يتعلق بهندسة خط أنابيب موثوق وقابل للقياس. بالنسبة للمطورين من المستوى المتوسط والمتقدم، تكمن أكبر التحديات ليس في التنفيذ، بل في التقييم. كيف تعرف ما إذا كان نظامك يعمل حقًا عندما يفشل؟ تكمن الإجابة في ربط دقة الاسترجاع بموثوقية التوليد.
مشكلة العزلة في تقييم RAG
تقوم الفرق تقليديًا بتقييم الاسترجاع والتوليد بشكل منفصل. قد تحسب Recall@K للمسترجع الخاص بك، ثم تقيس بشكل مستقل معدل الهلوسة في مولدك. وعلى الرغم من فائدة هذا النهج، إلا أنه يغفل الرابط السببي الحاسم بين المكونين. يمكن لمجموعة استرجاع عالية الدقة أن تؤدي إلى توليد غير موثوق إذا كانت هندسة الأوامر (Prompt Engineering) سيئة. وعلى العكس من ذلك، حتى إذا كان التوليد سلسًا، فقد يكون هلوسيًا إذا فشل مكون الاسترجاع في العثور على السياق الصحيح. لبناء خطوط أنابيب إنتاجية قوية، يجب أن نتعامل مع RAG كنظام متكامل من البداية للنهاية.
تعريف المقاييس الأساسية
لربط هذه المكونات، نحتاج إلى النظر في مقاييس محددة تسد الفجوة. تقيس دقة السياق ما إذا كانت المستندات المسترجعة ذات صلة بالسؤال. وتقيس موثوقية التوليد (أو موثوقية الإجابة) ما إذا كانت الإجابة المولدة مدعومة فعليًا بالسياق المسترجع، دون إضافة معرفة خارجية أو هلوسات.
من خلال مراقبة كلا المقياسين، يمكنك إنشاء مصفوفة تشخيصية. إذا كانت دقة السياق عالية ولكن الموثوقية منخفضة، فإن الأمر يتطلب تحسين الأوامر (Prompts). وإذا كانت دقة السياق منخفضة، فإن نموذج التضمين (Embedding Model) أو استراتيجية تقسيم النص (Chunking) هي عنق الزجاجة.
تنفيذ الربط في الكود
لننظر إلى مثال عملي باستخدام بايثون وإطار عمل تقييم افتراضي. سنقوم بمحاكاة فحص نتحقق فيه من أن الإجابة المولدة تعتمد فقط على السياق المقدم.
def evaluate_faithfulness(question, context, answer):
"""
يستخدم نموذج لغوي كبير كحكم لتحديد ما إذا كانت الإجابة موثوقة
بالنسبة للسياق المقدم.
"""
prompt = f"""
حدد ما إذا كانت الإجابة التالية موثوقة بالنسبة للسياق.
السؤال: {question}
السياق: {context}
الإجابة: {answer}
أخرج 'True' فقط إذا كانت الإجابة مدعومة بالسياق،
أو 'False' إذا كانت تحتوي على هلوسات.
"""
response = llm_client.generate(prompt)
return response.strip() == 'True'
# مثال على الاستخدام
qa_pair = {
"question": "ما هي عاصمة فرنسا؟",
"retrieved_docs": "باريس هي عاصمة فرنسا.",
"generated_answer": "باريس هي عاصمة فرنسا."
}
is_faithful = evaluate_faithfulness(
qa_pair["question"],
qa_pair["retrieved_docs"],
qa_pair["generated_answer"]
)
print(f"فحص الموثوقية: {is_faithful}")
التطبيق العملي في بيئة الإنتاج
في بيئة الإنتاج، يجب تسجيل هذه المقاييس جنبًا إلى جنب مع استعلامات المستخدمين. من خلال تتبع الربط بمرور الوقت، يمكنك تحديد أنماط التراجع. على سبيل المثال، بعد تحديث مخطط قاعدة البيانات المتجهية الخاصة بك، قد ترى انخفاضًا في دقة السياق يؤدي في النهاية إلى انخفاض في الموثوقية. يسمح لك اكتشاف هذا مبكرًا بالتراجع أو إعادة ضبط المعاملات قبل أن يلاحظ المستخدمون النهائيون التدهور.
الخاتمة
يتطلب التنفيذ الناجح لـ RAG الانتقال إلى ما وراء المقاييس المعزولة. من خلال ربط دقة الاسترجاع بموثوقية التوليد، تحصل على رؤية شاملة لصحة نظامك. لا يساعد هذا النهج في تصحيح الأخطاء فحسب، بل يبني أيضًا ثقة أصحاب المصلحة في موثوقية تطبيقاتك المدعومة بالذكاء الاصطناعي. ابدأ بقياس الرحلة من البداية للنهاية اليوم لضمان أن يكون نظام RAG الخاص بك ليس ذكيًا فحسب، بل موثوقًا به أيضًا.