كيفية حل الأخطاء الشائعة في RAG

١٨ نوفمبر ٢٠٢٥

How to Solve Common RAG Failures

باختصار

  • أنظمة RAG (التوليد المعزز بالاسترجاع) تفشل غالبًا بسبب فهرسة ضعيفة، أجزاء غير ذات صلة، أو مصادر بيانات قديمة.
  • الاستعلامات الغامضة والتضمينات غير المتطابقة يمكن أن تسبب للنموذج تجاهل معلومات حاسمة.
  • سياق مسترجع ضعيف أو متضارب يؤدي إلى وهم وثقة مفرطة.
  • يمكنك اكتشاف هذه المشاكل والتخفيف منها عبر التقييم المنهجي، حلقات التغذية الراجعة، والقابلية للمراقبة.
  • إعادة التدريب المستمر، محاذاة التضمينات، واستراتيجيات تقسيم أفضل هي مفتاح الموثوقية في الإنتاج.

ما ستتعلمه

  1. الأسباب الجذرية وراء فشول RAG الشائعة — ولماذا تحدث.
  2. كيفية تشخيص فشول الاسترجاع مقابل فشول التوليد.
  3. طرق عملية لإصلاح مشاكل الفهرسة، التقسيم، وعدم تطابق التضمينات.
  4. كيفية مراقبة وقياس أداء RAG في الإنتاج.
  5. استراتيجيات لتقليل الوهم وضمان الاتساق الحقائقي.

المتطلبات الأساسية

ستستفيد أكثر من هذه المقالة إذا كنت على دراية بـ:

  • أساسيات LLMs (نماذج اللغة الكبيرة) والتضمينات المتجهية.
  • تطوير بايثون وإطارات العمل الشائعة للذكاء الاصطناعي (مثل LangChain أو LlamaIndex).
  • فهم أساسي لمفاهيم استرجاع المعلومات والبحث الدلالي.

أصبح التوليد المعزز بالاسترجاع (RAG) حجر الزاوية في أنظمة الذكاء الاصطناعي الحديثة. إنه يسد الفجوة بين معرفة النموذج الثابتة والمعلومات الديناميكية المحدثة. بدلًا من الاعتماد فقط على ما "يعرفه" نموذج LLM، يسترجع RAG الوثائق أو الفقرات ذات الصلة من مصدر خارجي — مثل قاعدة بيانات متجهية — ويُدخلها في المطالبة.

ولكن ماذا يحدث عندما تخطئ عملية الاسترجاع هذه؟

في الإنتاج، يمكن أن تفشل أنظمة RAG بطرق خفية ومُحبطة: النموذج يُنتج وهمًا، يسترجع أجزاء غير ذات صلة، أو يتجاهل حقائق حاسمة. هذه ليست مشاكل نظرية فقط — يمكن أن تؤثر مباشرة على ثقة المستخدمين، وموثوقية النظام، ونتائج الأعمال.

لنستعرض هذه أنماط الفشل، ونفهم أسبابها الجذرية، ونستكشف طرقًا عملية لإصلاحها.


فهم أنماط فشل RAG الشائعة

على مستوى عالٍ، تقع فشول RAG عادةً في واحدة من أربع فئات:

نوع الفشل السبب الجذري الأعراض الشائعة مثال
فشل الاسترجاع فهرسة ضعيفة، أجزاء غير ذات صلة، بيانات قديمة سياق خاطئ أو مفقود النموذج يجيب بحقائق غير مرتبطة
عدم تطابق التضمينات نماذج تضمين مختلفة أو انزياح متجهي بحث تشابه غير متسق النص المسترجع لا يطابق نية الاستعلام
غموض الاستعلام استعلام غامض أو غير محدد استرجاع جزئي أو غير ذي صلة النموذج يقدم إجابات غير مؤكدة أو عامة
فشل التوليد سياق ضعيف أو متضارب وهم، ثقة مفرطة النموذج يخترع تفاصيل أو يستشهد بمصادر خاطئة

يمكن أن تتسلسل هذه المشاكل — فشل الاسترجاع يؤدي إلى توليد ضعيف، الذي يظهر كوهم أو انحراف في الحقائق.


1. فشول الاسترجاع: قاتل الدقة الصامت

لماذا يحدث

فشل الاسترجاع غالبًا ما ينشأ من فهرسة ضعيفة أو تقسيم غير ذي صلة. إذا كانت أجزاء الوثائق كبيرة جدًا، يصبح السياق مُخففًا؛ وإذا كانت صغيرة جدًا، يتشتت المعنى الدلالي.

بالإضافة إلى ذلك، مصادر البيانات القديمة أو غير الكاملة يمكن أن تجعل النظام يجيب بثقة بحقائق قديمة — أي يجيب بثقة بحقائق منتهية الصلاحية.

الأعراض الشائعة

  • النصوص المسترجعة متشابهة موضوعيًا لكنها غير ذات صلة دلالياً.
  • النموذج يعيد نشر معلومات قديمة أو مُهملة.
  • الاستعلام نفسه ينتج نتائج غير متسقة مع الوقت.

مثال

تخيل نظام RAG لقاعدة معرفة طبية. إذا لم يتم تحديث الفهرس بعد إصدار إرشادات سريرية جديدة، قد يوصي النموذج بثقة بعلاجات قديمة.

إصلاح فشول الاسترجاع

  1. إعادة بناء الفهارس بشكل دوري: أتمتة تحديث الفهارس عند تغيير بيانات المصدر.
  2. تحسين أحجام الأجزاء: استخدم تقسيمًا دلاليًا — قسّم النص بناءً على المعنى، وليس الطول التعسفي.
  3. إضافة فلاتر للبيانات الوصفية: علّم الوثائق بتواريخ، مؤلفين، أو فئات لتحسين دقة الاسترجاع.
  4. استخدام البحث الهجين: ادمج البحث الكلمات المفتاحية (BM25) والبحث المتجهي لتحسين الاسترجاع1.

مثال: إعادة بناء فهرس متجهي في بايثون

from sentence_transformers import SentenceTransformer
from chromadb import Client

model = SentenceTransformer('all-MiniLM-L6-v2')
client = Client()
collection = client.get_or_create_collection('docs')

def rebuild_index(docs):
    collection.delete()
    for doc_id, text in enumerate(docs):
        embedding = model.encode(text)
        collection.add(documents=[text], embeddings=[embedding], ids=[str(doc_id)])

# Usage
rebuild_index(updated_documents)

هذا يضمن أن قاعدة البيانات المتجهية تبقى متوافقة مع مصدر البيانات الأحدث.


2. عدم تطابق التضمينات: مشكلة الانزياح الخفي

ليه بيحصل

عدم تطابق التضمينات بيحصل لما تضمينات الاستعلام وتضمينات المستندات تيجي من موديلات مختلفة، أو لما موديل التضمين ينحرف مع الوقت بسبب إعادة التدريب أو الترقية.

حتى الاختلافات الصغيرة في محاذاة الفضاء المتجهي ممكن تسبب تدهور كبير في الاسترجاع2.

التأثيرات

  • الموديل بيسترجع نص متشابه لغوياً لكن دلالياً مش صحيح.
  • الاستعلامات اللي كانت بتعمل كويس فجأة بتوقف عن إرجاع نتائج ذات صلة.

الكشف

ممكن تكشف عدم تطابق التضمينات بعمل اختبارات recall للاسترجاع — قياس كم مرة المستند الصحيح يظهر في أعلى k نتيجة مسترجعة.

الحل

  • تثبيت إصدارات التضمين: ثبت على إصدار معين للموديل ووثقها.
  • إعادة تضمين كل شيء معًا: لو رفعت إصدار موديل التضمين، أعيد تضمين الاستعلامات والمستندات كمان.
  • مراقبة انزياح التشابه: تتبع توزيعات التشابه جيب التمام مع الوقت.

مثال: مراقبة الانزياح

import numpy as np

def measure_similarity_drift(old_embeddings, new_embeddings):
    similarities = [np.dot(o, n) / (np.linalg.norm(o) * np.linalg.norm(n)) for o, n in zip(old_embeddings, new_embeddings)]
    return np.mean(similarities)

avg_drift = measure_similarity_drift(old_embeddings, new_embeddings)
print(f"Average embedding drift: {avg_drift:.3f}")

لو الانزياح زاد عن حد معين (مثلاً 0.95 تشابه جيب التمام)، أعد الفهرسة.


3. استعلامات غامضة: لما الموديل ميقدرش يقرأ العقل

ليه بيحصل

أنظمة RAG بتعتمد على استعلامات واضحة وغير غامضة. لو سؤال المستخدم غامض — زي "إيه السياسة؟" — المُسترجع ممكن يجيب أجزاء مش متعلقة.

مثال

في قاعدة معرفية للشركة، "إيه السياسة؟" ممكن تشير لسياسة الإجازات أو المصروفات أو الأمن. من غير توضيح، الاسترجاع بيكون لعبة تخمين.

حل الغموض

  1. توسيع الاستعلام: استخدم LLMs لإعادة كتابة الاستعلامات الغامضة لتصبح محددة.
  2. توضيح من المستخدم: اسأل أسئلة متابعة لما النية مش واضحة.
  3. ذاكرة سياقية: حافظ على سجل المحادثة عشان تستنتج المعنى.

مثال: إعادة كتابة الاستعلام

from openai import OpenAI
client = OpenAI()

def rewrite_query(user_query):
    prompt = f"Rewrite this query to be more specific: '{user_query}'"
    response = client.chat.completions.create(
        model="gpt-4-turbo",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message.content

print(rewrite_query("What’s the policy?"))

هذه الخطوة الصغيرة ممكن تحسن بشكل كبير دقة الاسترجاع.


4. سياق ضعيف أو متضارب: فخ الوهم

ليه بيحصل

عندما يكون السياق المسترجع نادرًا أو متناقضًا، يملأ LLM الفجوات بمعرفته الخاصة — غالبًا ما يؤدي ذلك إلى هلوسة أو ثقة زائدة3.

الأعراض

  • يقوم النموذج بزَيْف الاقتباسات أو روابط URL.
  • الإجابات تبدو واثقة لكنها غير صحيحة من الناحية الواقعية.
  • ينتج نفس الاستعلام إجابات مختلفة حسب ترتيب السياق.

إصلاح تعارضات السياق

  1. رتبة السياق: استخدام rerankers (مثل cross-encoders) لإعطاء الأولوية للفقرات الأكثر صلة.
  2. إسناد المصدر: تضمين معرفات المصدر في المطالبات لمساعدة النموذج على تأصيل إجابته.
  3. تقييم الثقة: حساب مقياس ثقة الاسترجاع (مثل متوسط تشابه جيب التمام) وتحديد الاستجابات ذات الثقة المنخفضة.

مثال: استجابة واعية بالثقة

def generate_answer_with_confidence(query, retrieved_docs, threshold=0.8):
    avg_score = sum(doc['similarity'] for doc in retrieved_docs) / len(retrieved_docs)
    if avg_score < threshold:
        return "I'm not confident enough to answer based on available data."
    return llm_generate_answer(query, retrieved_docs)

هذا يساعد في منع الهلوسات ذات الثقة المفرطة في السيناريوهات ذات الصلة المنخفضة.


متى تستخدم RAG ومتى لا تستخدمها

السيناريو استخدم RAG تجنب RAG
المعرفة الديناميكية (مثل الأخبار، المستندات)
أسئلة وأجوبة واقعية محددة بالقطاع
الكتابة الإبداعية أو المهام المفتوحة
بيانات حساسة للغاية أو خاضعة للتنظيم ⚠️ فقط مع ضوابط صارمة

RAG يبرز عندما تكون الدقة الواقعية والجدة مهمة — لكنه ليس مثاليًا للمهام التي يضيف فيها الاسترجاع ضجيجًا أو تحيزًا.


مثال عملي: تصحيح الأخطاء في إنتاجية بوت الدعم

شركة SaaS طورت بوت دعم مدعوم بـ RAG. مع مرور الوقت، لاحظ المستخدمون إجابات غير متسقة. كشف التحليل عن:

  • تم ترقية نموذج التضمين بصمت.
  • كانت القطع صغيرة جدًا (مقسمة في منتصف الجملة).
  • لم يتم إعادة بناء الفهرس بعد تحديثات المستندات.

بعد إصلاح هذه المشكلات — إعادة تضمين باستخدام نماذج متسقة، تقسيم دلالي، وإعادة فهرسة ليلية — تحسنت الدقة بشكل كبير، وانخفضت الهلوسات.


المزالق الشائعة والحلول

المزلق السبب الجذري الحل
النموذج يتجاهل السياق المسترجع تنسيق المطالبات السيء الإشارة الصريحة إلى القطع المسترجعة في المطالبة
تأخير الاسترجاع مرتفع جدًا قاعدة بيانات متجهات غير فعالة أو نوافذ سياق كبيرة تخزين المتجهات مؤقتًا، واستخدام بحث الجيران الأقرب التقريبي
استمرار الهلوسة سياق ضعيف أو تشابه منخفض إضافة عتبات ثقة، وإعادة ترتيب المستندات المسترجعة
إجابات قديمة بيانات قديمة أتمتة خطوط أنابيب إعادة الفهرسة

خطوة بخطوة: تصحيح نظام RAG الفاشل

  1. التحقق من سجلات الاسترجاع: هل نتائج top-k ذات صلة بالاستعلام؟
  2. فحص تشابهات التضمين: هل درجات جيب التمام متسقة؟
  3. الاختبار مع استعلامات معروفة: استخدام أسئلة مرجعية بإجابات معروفة.
  4. قياس Recall@K: ما نسبة المستندات الصحيحة التي تظهر في النتائج العليا؟
  5. تقييم الإنشاء: مقارنة الإجابات المُولَّدة بالحقائق.

مثال: تقييم Recall@K

def recall_at_k(ground_truth_ids, retrieved_ids, k):
    hits = sum(1 for gt in ground_truth_ids if gt in retrieved_ids[:k])
    return hits / len(ground_truth_ids)

استخدم هذا المقياس لقياس جودة الاسترجاع.


المراقبة والقابلية للرصد

مراقبة أنظمة RAG ليست اختيارية — بل ضرورية. تتبع:

  • مقاييس الاسترجاع: Recall@K، متوسط الرتبة المتبادلة (MRR)
  • مقاييس الإنشاء: الأمانة، الاتساق الواقعي
  • انزياح التضمين: متوسط تشابه جيب التمام بين الإصدارات
  • التأخير: أوقات استجابة الاسترجاع والإنشاء

مثال على مخطط العمارة

graph TD
A[User Query] --> B[Query Embedding]
B --> C[Vector Search]
C --> D[Retrieved Context]
D --> E[LLM Generation]
E --> F[Response + Confidence Score]
F --> G[Feedback Loop / Monitoring]

أدوات المراقبة

  • سجل عمليات الاسترجاع الناجحة/الفاشلة.
  • احفظ أعلى k عمليات استرجاع للتقييم غير المتصل.
  • دمج التنبيهات للردود ذات الثقة المنخفضة.

اعتبارات الأمان والامتثال

  • تسرب البيانات الحساسة: لا تدمج بيانات PII الخام أو النصوص السرية. استخدم إخفاء الهوية.
  • التحكم في الوصول: قيّد مصادر الاسترجاع بناءً على صلاحيات المستخدم.
  • دفاع ضد حقن الأوامر: نَقِّي النص المسترجع قبل إرساله إلى نموذج LLM4.

قم بتنفيذ التحقق من المدخلات وتصفية المخرجات للامتثال لتوصيات أمان OWASP5.


الاختبار والتقييم المستمر

يجب اختبار أنظمة RAG مثل أي خدمة إنتاجية أخرى.

استراتيجيات الاختبار

  • اختبارات الوحدة: تحقق من وظائف تقسيم القطع والتضمين.
  • اختبارات التكامل: تأكد من عمل خطوط أنابيب الاسترجاع والتكوين من البداية إلى النهاية.
  • اختبارات الانحدار: منع انحراف الدقة بعد تحديثات النموذج أو البيانات.

مثال: اختبار تكامل Pytest

def test_retrieval_accuracy():
    query = "What is the refund policy?"
    results = retriever.retrieve(query)
    assert any("refund" in doc.text.lower() for doc in results), "No relevant docs found"

القابلية للتوسع والأداء

مع نمو مجموعتك، يمكن أن تزداد زمن استرجاع البيانات وحجم الفهرس بشكل كبير. للتوسع:

  • استخدم خوارزميات البحث بالجيران الأقرب التقريبية (ANN) مثل HNSW6.
  • قم بتنفيذ التقسيم للتخزينات المتجهية الكبيرة.
  • اخزن الاستعلامات والتضمينات المتكررة في ذاكرة التخزين المؤقت.
  • راقب أوقات إعادة بناء الفهرس وأتمتة التوسع.

الأخطاء الشائعة التي يرتكبها الجميع

  1. خلط نماذج التضمين دون إعادة فهرسة.
  2. تجاهل ترتيب السياق — يمكن لنماذج LLM أن تعطي وزنًا أكبر للقطع السابقة.
  3. التقسيم المفرط — تقسيم النص بشكل مفرط يقلل من التماسك.
  4. تخطي التقييم — الافتراض أن الاسترجاع يعمل لأنه “يبدو صحيحًا”.

دليل استكشاف الأخطاء وإصلاحها

العرض السبب المحتمل الإصلاح
روابط أو اقتباسات مُختلقة سياق ضعيف أضف بيانات الوصف للمصدر وحدود الثقة
نتائج غير ذات صلة متكررة عدم تطابق التضمين إعادة التضمين باستخدام نموذج متسق
إجابات قديمة فهرس قديم أتمتة إعادة الفهرسة
استجابات بطيئة مجمع كبير استخدم بحث ANN والتخزين المؤقت

الاستنتاجات الرئيسية

أنظمة RAG لا تتجاوز جودة خطوط استرجاعها.

  • حافظ على تزامن التضمينات والفهارس ومصادر البيانات.
  • راقب جودة الاسترجاع باستمرار.
  • تعامل مع الغموض وصراعات السياق بشكل استباقي.
  • أدخل المراقبة في كل طبقة — من سجلات الاستعلامات إلى مقاييس الثقة.

الأسئلة الشائعة

Q1: كم مرة يجب علي إعادة فهرسة بياناتي؟
A: كلما تغير محتوى المصدر بشكل كبير — عادةً يوميًا أو أسبوعيًا للبيانات الديناميكية.

Q2: ما هو حجم القطعة المثالي؟
A: اهدف إلى وحدات ذات معنى دلالي (مثل الفقرات أو الأقسام)، عادة حوالي 200–500 رمز.

Q3: هل يمكن لـ RAG القضاء على الهلوسة تمامًا؟
A: ليس تمامًا، لكن الاسترجاع القوي وتصنيف الثقة يمكن أن يقللاها.

Q4: كيف أقيس جودة الاسترجاع؟
A: استخدم مقاييس مثل Recall@K وMRR والتقييم البشري للدقة الواقعية.

Q5: هل يجب دمج RAG مع الضبط الدقيق؟
A: نعم، للمهام الخاصة بالقطاع حيث لا يكفي الاسترجاع وحده.


الخطوات التالية

  • قم بتنفيذ تسجيل الاسترجاع وتصنيف الثقة في خط أنابيب RAG الخاص بك.
  • قم بقياس Recall بشكل دوري.
  • استكشف الاسترجاع الهجين (كلمة مفتاحية + متجه) للحصول على متانة أفضل.
  • اشترك في المدونة للحصول على تحليلات متعمقة قادمة حول أطر تقييم RAG وكشف الهلوسة.

الهوامش

  1. توثيق Elastic Search BM25 – https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

  2. توثيق Sentence Transformers – https://www.sbert.net/

  3. توثيق OpenAI API – https://platform.openai.com/docs/guides/retrieval-augmented-generation

  • OWASP إرشادات حقن البرومبت – https://owasp.org/www-project-prompt-injection/

  • OWASP أعلى 10 مخاطر أمنية – https://owasp.org/www-project-top-ten/

  • ورقة خوارزمية HNSW – https://arxiv.org/abs/1603.09320