دليل RAG الكامل: من المستند إلى إجابة موثوقة
خط أنابيب الاسترجاع المعزّز بمراحله الست، وأين ينكسر فعلًا في الإنتاج، وما تقوله أوراق BEIR وDPR و«الضياع في المنتصف» عن كل قرار تتخذه فيه.
في كل مرة يُطلب منّي تشخيص نظام استرجاع معزّز «يهلوس»، أبدأ من المكان نفسه: أعرض المقاطع التي وصلت فعلًا إلى النموذج. في أغلب الحالات ينتهي التشخيص عند هذه الخطوة — المقطع الذي يحمل الجواب لم يكن بينها. النموذج لم يهلوس، بل أجاب عن سؤال لم نعطه أدواته.
الاسترجاع المعزّز (Retrieval-Augmented Generation — RAG) طُرح في ورقة Lewis وزملائه عام ٢٠٢٠ [1] كطريقة لوصل نموذج توليدي بذاكرة خارجية قابلة للتحديث بلا إعادة تدريب. الفكرة صمدت، وصارت المعمارية الافتراضية لأي مساعد يعمل على معرفة خاصة. لكن ما لم تصمد هو الانطباع بأنها «مكوّن واحد تركّبه».
المشكلة في سياق حقيقي
فريق دعم لديه ٤٠٠٠ صفحة توثيق. العرض التجريبي ممتاز، وبعد أسبوعين من التشغيل تظهر ثلاثة أنماط فشل متكرّرة:
- إجابة واثقة بلا مصدر: النموذج يذكر مهلة زمنية لا ترد في أي مستند.
- «لا أعرف» في سؤال موثّق: الجواب داخل جدول في ملف PDF، والتقطيع مزّق الجدول فلم يعد أي مقطع يحوي السؤال وجوابه معًا.
- إجابة من نسخة مؤرشفة: السياسة القديمة أقرب دلاليًّا للسؤال من السارية، ولا حقل تاريخ يميّزهما.
واحد فقط من الثلاثة مشكلة توليد. الاثنان الآخران مشكلتا استرجاع وحوكمة بيانات. هذا التمييز هو ما يوفّر أسابيع من العبث بالتوجيهات.
المفهوم: ست مراحل لا واحدة
| # | المرحلة | ما يحدث فيها | ما ينكسر إن أُهملت |
|---|---|---|---|
| ١ | الاستيعاب | استخراج نصّ نظيف من PDF/HTML/Word مع بياناته الوصفية | نصّ مشوّه يفسد كل ما بعده |
| ٢ | التقطيع | تقسيم النصّ إلى مقاطع تحفظ المعنى وحدوده | جداول ممزّقة وإجابات ناقصة |
| ٣ | التضمين | تحويل كل مقطع إلى متجه عددي | استرجاع ضعيف بلا سبب ظاهر |
| ٤ | الفهرسة | تخزين المتجهات مع النصّ والبيانات الوصفية | تعذّر الترشيح بالتاريخ أو النسخة |
| ٥ | الاسترجاع | بحث دلالي وكلمي، ثم إعادة ترتيب | وصول المقطع الخاطئ إلى السياق |
| ٦ | التوليد | إجابة مقيّدة بالمقاطع مع استشهاد | هلوسة واثقة بلا مصدر |
لماذا لا يكفي البحث الدلالي وحده
أظهرت ورقة Dense Passage Retrieval [2] أن الاسترجاع الكثيف يتفوّق على BM25 بفارق ٩–١٩ نقطة في دقّة أعلى ٢٠ نتيجة على مجموعات أسئلة مفتوحة — حين يُدرَّب على بيانات من المجال نفسه. لكن تقييم BEIR [3] الذي فحص نماذج الاسترجاع على ١٨ مجموعة متنوّعة انتهى إلى نتيجة مزعجة للمتحمّسين: خارج نطاق التدريب، يبقى BM25 خصمًا عنيدًا يتفوّق على كثير من النماذج الكثيفة.
الخلاصة العملية لمن يبني على مستندات مؤسسية لم يُدرَّب عليها أي نموذج: لا تراهن على أسلوب واحد. البحث الهجين ليس ترفًا هندسيًّا بل استجابة مباشرة لهذه النتيجة.
التنفيذ خطوة بخطوة
المثال بأصغر قدر من الاعتمادات — الهدف فهم الميكانيكا. جُرّب على Python 3.11.
# pip install sentence-transformers==3.0.1 faiss-cpu==1.8.0
from sentence_transformers import SentenceTransformer
import faiss, numpy as np
model = SentenceTransformer("intfloat/multilingual-e5-base")
# [٢] تقطيع بسيط بحدود فقرات مع تراكب
def chunk(text: str, size: int = 800, overlap: int = 120) -> list[str]:
parts, start = [], 0
while start < len(text):
end = min(start + size, len(text))
parts.append(text[start:end])
start = end - overlap # التراكب يمنع قطع الجملة عند الحدّ
return parts
chunks = chunk(open("policy.txt", encoding="utf-8").read())
# [٣] التضمين — البادئات إلزامية في عائلة E5
vectors = model.encode([f"passage: {c}" for c in chunks], normalize_embeddings=True)
# [٤] الفهرسة — الجداء الداخلي على متجهات مطبَّعة = تشابه جيب التمام
index = faiss.IndexFlatIP(vectors.shape[1])
index.add(np.asarray(vectors, dtype="float32"))
# [٥] الاسترجاع
def retrieve(question: str, k: int = 5) -> list[str]:
q = model.encode([f"query: {question}"], normalize_embeddings=True)
scores, ids = index.search(np.asarray(q, dtype="float32"), k)
return [chunks[i] for i in ids[0]]
ثلاث نقاط تُهمَل كثيرًا في هذه الأسطر:
- البادئات ليست زينة: عائلة E5 [4] دُرّبت بصيغة
query:وpassage:، وإسقاطها يخفض جودة الاسترجاع بلا رسالة خطأ واحدة. - التطبيع يحدّد ما تقيسه: على متجهات مطبَّعة يصبح الجداء الداخلي مكافئًا لتشابه جيب التمام؛ بدونه تقارن أطوالًا لا اتجاهات.
IndexFlatIPبحث شامل دقيق ١٠٠٪ وتكلفته خطّية. عند مئات الآلاف من المقاطع ينتقل الأمر إلى فهرس تقريبي مثل HNSW [5] بمقايضة معلومة بين الاستدعاء والسرعة.
المرحلة السادسة: تقييد التوليد وترتيب السياق
SYSTEM = """أجب من المقاطع المرفقة وحدها.
إن لم تكفِ المقاطع للإجابة فقل: «لا تكفي المستندات المتاحة للإجابة».
اذكر بعد كل جملة رقم المقطع الذي استندت إليه بالشكل [١]."""
هذه التعليمة تمنح النموذج مخرجًا مشروعًا عند نقص المعلومة، وتفرض استشهادًا يجعل المراجعة ممكنة. لكن التفصيل الذي يفوت كثيرين هو موضع المقاطع: أظهرت دراسة Lost in the Middle [6] أن أداء النماذج يبلغ ذروته حين تكون المعلومة ذات الصلة في بداية السياق أو نهايته، وينخفض انخفاضًا ملموسًا حين تُدفن في المنتصف — والمنحنى على شكل حرف U.
ترجمتها الهندسية مباشرة: ضع أقوى المقاطع في الطرفين لا في الوسط، ولا تحشُ عشرين مقطعًا «احتياطًا».
القياس: كل مرحلة برقمها
| المرحلة | المقياس | ماذا يعني |
|---|---|---|
| الاسترجاع | Recall@k |
هل وصل المقطع الصحيح ضمن أعلى k؟ |
| الاسترجاع | MRR |
ما رتبته؟ الأول أم الخامس؟ |
| التوليد | الإخلاص (Faithfulness) | هل كل جملة مدعومة بالمقاطع؟ |
| التوليد | ملاءمة الجواب | هل أجاب عن السؤال المطروح؟ |
القاعدة التي أعمل بها: إن كان Recall@5 دون ٠٫٨ فلا تلمس التوجيه ولا تبدّل النموذج؛ العطل قبلهما. إطار RAGAS [7] يحسب مقاييس التوليد آليًّا، لكن نقطة البداية تبقى مجموعة ذهبية صغيرة — خمسون سؤالًا حقيقيًّا مع مقطعها الصحيح، تُكتب مرة وتوفّر شهورًا من التخمين.
متى لا يصلح هذا الحل
- الحسابات والتجميعات: «كم عميلًا اشترك في الربع الأخير؟» سؤال SQL؛ الاسترجاع الدلالي لا يجمع أرقامًا.
- قاعدة معرفة صغيرة: عشرون صفحة تُوضع في السياق مباشرة، ويُوفَّر خط الأنابيب كاملًا.
- أسئلة تحتاج المستند كاملًا: «لخّص عقد ١٢٠ صفحة» معالجة تسلسلية لا استرجاعًا.
- معرفة لحظية: الأسعار وحالة المخزون تُقرأ من واجهة برمجية، لا من فهرس يُبنى ليلًا.
الأخطاء الشائعة
- تقطيع أعمى بطول ثابت يمزّق الجداول والقوائم — السبب الأول لفشل الاسترجاع في المستندات التقنية.
- فهرس بلا بيانات وصفية: بلا تاريخ ونسخة لا يمكن فصل الساري عن المؤرشف.
kكبير بلا إعادة ترتيب: تشتيت للنموذج وزيادة في التكلفة، وأثر منتصف السياق يلتهم المكسب.- نموذج تضمين أحادي اللغة على نصّ عربي: ضجيج مضمون.
- فهرس يُبنى مرة: المستندات تتغيّر، وبلا خط تحديث يتقادم النظام بصمت.
- الحكم بالانطباع: «جرّبته على عشرة أسئلة» ليس قياسًا.
الخلاصة العملية
- استخرج النصّ مع بياناته الوصفية (المصدر، التاريخ، النسخة، الصلاحية).
- قطّع على حدود دلالية لا على عدد حروف.
- اختر نموذج تضمين يدعم العربية، وقِسه على بياناتك أنت.
- ادمج الدلالي مع BM25 ثم أعد الترتيب.
- رتّب المقاطع فتضع الأقوى في طرفَي السياق.
- قيّد التوليد، وافرض الاستشهاد، وأتِح جواب «لا أعرف».
- ابنِ مجموعة ذهبية من ٥٠ سؤالًا، وقِس الاسترجاع قبل التوليد.
الأسئلة الشائعة
ما الفرق بين RAG والضبط الدقيق؟
RAG يضيف معرفة وقت الاستعلام وتُحدَّث بإعادة فهرسة تستغرق دقائق، بينما الضبط الدقيق يغيّر سلوك النموذج ويحتاج إعادة تدريب لأي تحديث. المعرفة المتغيّرة إلى RAG، والسلوك والصيغة إلى الضبط الدقيق، وكثير من الأنظمة الناضجة يجمع الاثنين.
هل ألغت نوافذ السياق الطويلة الحاجة إلى RAG؟
لا. حتى مع نافذة تتّسع لمئات الآلاف من الرموز، الحشو مكلف وبطيء، وتُظهر دراسة Lost in the Middle أن الدقة تتراجع حين تُدفن المعلومة وسط سياق طويل. الاسترجاع يبقى مرشّحًا يُدخل الأقلّ الأكثر صلة.
كم يجب أن يكون حجم المقطع؟
لا رقم عالمي. نقطة بداية شائعة ٤٠٠–٨٠٠ رمزًا مع تراكب ١٠–١٥٪، ثم يُضبط بالقياس على مجموعتك. المستندات ذات البنية الواضحة تُقطَّع على بنيتها لا على طول ثابت.
كيف أمنع الإجابة من مستند قديم؟
بحقل وصفي للتاريخ أو حالة الصلاحية، وترشيح صريح عليه قبل البحث الدلالي، مع عزل النسخ المؤرشفة في مجموعة منفصلة أو حذفها من الفهرس.
هل أحتاج قاعدة بيانات متجهات مخصّصة؟
تحت مئة ألف مقطع تكفي مكتبة مثل FAISS [8] أو امتداد متجهات في قاعدة علائقية قائمة. الحاجة إلى قاعدة متخصصة تبدأ مع التوسّع الأفقي والتحديث اللحظي وترشيح البيانات الوصفية المعقّد.
المراجع
- Lewis, P. et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020. arXiv:2005.11401
- Karpukhin, V. et al. Dense Passage Retrieval for Open-Domain Question Answering. EMNLP 2020. arXiv:2004.04906
- Thakur, N. et al. BEIR: A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models. arXiv:2104.08663
- Wang, L. et al. Text Embeddings by Weakly-Supervised Contrastive Pre-training (E5). arXiv:2212.03533
- Malkov, Y. & Yashunin, D. Efficient and Robust Approximate Nearest Neighbor Search Using HNSW Graphs. arXiv:1603.09320
- Liu, N. et al. Lost in the Middle: How Language Models Use Long Contexts. TACL 2024. arXiv:2307.03172
- Es, S. et al. RAGAS: Automated Evaluation of Retrieval Augmented Generation. arXiv:2309.15217
- Johnson, J., Douze, M. & Jégou, H. Billion-scale Similarity Search with GPUs (FAISS). arXiv:1702.08734
- Gao, Y. et al. Retrieval-Augmented Generation for Large Language Models: A Survey. arXiv:2312.10997
أدوات مذكورة في هذا المقال
- فينيكسArize Phoenixأداة رصد وتتبّع مفتوحة المصدر: تعرض أثر كل استدعاء ومقاطعه المسترجَعة وتكلفته وكمونه.
- لاما إندكسLlamaIndexإطار عمل لبناء خطوط الاسترجاع: تحميل المصادر، تقطيعها، فهرستها، ثم استرجاعها وإعادة ترتيبها.
- هايستاكHaystackإطار خطوط أنابيب صريح: كل مرحلة مكوّن معرَّف بمدخلاته ومخرجاته، فيسهل تتبّعها واختبارها.
اقرأ بعده
اختيار نموذج تضمين للعربية: منهجية قياس لا قائمة توصيات
لماذا لا تكفي لوحة MTEB لاختيار نموذج تضمين عربي، وكيف تبني اختبارًا على بياناتك في ساعتين، وأي أربعة معايير تحكم القرار فعلًا.
اقرأ المقالنافذة السياق الطويلة: هل ألغت الحاجة إلى RAG؟
ما الذي تغيّره نوافذ السياق الكبيرة فعلًا، ولماذا يتراجع أداء النماذج حين تُدفن المعلومة وسط سياق طويل، ومتى يكون الحشو أرخص من الاسترجاع.
اقرأ المقالقواعد بيانات المتجهات: متى تحتاج واحدة فعلًا؟
الفرق بين مكتبة بحث متجهات وقاعدة بيانات متجهات، ومتى يكفيك pgvector أو FAISS، وما الذي يبرّر فعلًا الانتقال إلى قاعدة متخصصة في الإنتاج.
اقرأ المقالنشرة إسناد الأسبوعية
ثلاثة أشياء مفيدة كل أسبوع: ورقة بحثية مشروحة، قياس عملي، وخطأ شائع رأيناه في الإنتاج. بلا حشو وبلا رعايات مخفية.