لو سألت Claude عن سياسة الإجازات في شركتك، هيخترع رد. مش لأنه كذاب، لأنه ما يعرفش الشركة دي أصلاً. RAG بيحل المشكلة دي بفكرة سطر واحد: قبل ما تسأل النموذج، هاتله بنفسك الإجابة من ملفاتك.
ما هي RAG؟ Retrieval-Augmented Generation بالعربي
RAG اختصار لـ Retrieval-Augmented Generation — التوليد المعزَّز بالاسترجاع. الاسم معقد، الفكرة بسيطة جداً ولو فهمتها مرة واحدة هتفهم كل تطبيقات الـ AI الحديثة في الشركات.
المشكلة باختصار
أي نموذج لغوي زي Claude أو GPT اتدرّب على بيانات حتى تاريخ معين، وما يعرفش:
- ملفات شركتك الداخلية ووثائق المنتج بتاعك.
- مقالات ودراسات اتنشرت بعد تاريخ تدريبه.
- قاعدة بيانات العملاء أو السجل التشغيلي.
- تعديلات حصلت في القانون أو السياسة الأسبوع اللي فات.
لما تسأله عن أي حاجة من دول، عنده خياران: يقول "ما أعرفش"، أو يخترع إجابة تبان معقولة. للأسف، السلوك الافتراضي بيميل للاختراع. ده اللي اسمه Hallucination.
مثال للمبتدئ: أمين مكتبة جدتك
تخيل معايا. عندك أمين مكتبة جامعي قرأ ملايين الكتب من زمان (ده Claude). جاءلك سؤال عن وصفة كيكة جدتك بالظبط. هو ممكن يجاوبك من خبرته العامة بكيك عادي، لكن مش هيعرف وصفة جدتك المخصوصة.
الحل: قبل ما يجاوب، تقوله "استنى لحظة، هات دفتر وصفات جدتي الأول، افتح الصفحة المتعلقة بالكيك، اقرأها، وبعد كده جاوب". ده بالظبط اللي RAG بتعمله. بياخد سؤالك، يبحث في ملفاتك عن الجزء المتعلق بالسؤال، يضيف الجزء ده للسؤال، وبعدين يبعت الكل لـ LLM.
الفكرة الأساسية: RAG في ثلاث خطوات
- Retrieval (الاسترجاع): ابحث في ملفاتك عن المحتوى المتعلق بالسؤال.
- Augmentation (التعزيز): ضيف المحتوى ده لسؤال المستخدم في نفس الـ prompt.
- Generation (التوليد): ابعت الـ prompt المعزَّز للموديل وخلّيه يجاوب من السياق ده فقط.
النتيجة: الموديل بيجاوب من معلومات حقيقية في ملفاتك، مش من ذاكرته العامة. ولو السؤال خارج نطاق ملفاتك، بتقوله صراحة "لو الإجابة مش في السياق، قول مش موجود"، فبيقولها بدل ما يخترع.
التعريف العلمي الدقيق
RAG هي معمارية بتدمج بين نظامين منفصلين كانوا قبل كده بيشتغلوا لوحدهم:
- Retriever: نظام بحث (في الإنتاج عادة Vector Database زي pgvector أو Pinecone أو Qdrant) بيخزّن ملفاتك على شكل Embeddings — متّجهات أرقام بتمثل المعنى الدلالي للنص. لما يجي سؤال، بيتحوّل لمتّجه برضه ويتقارن بأقرب الفقرات في الفضاء الدلالي.
- Generator: نموذج لغوي (Claude, GPT, Llama) بياخد النتائج المسترجَعة كسياق إضافي ويولّد الإجابة النهائية.
الورقة الأصلية لـ RAG اتنشرت من Facebook AI Research في 2020 (Lewis et al., NeurIPS 2020) وكانت أول تطبيق علمي لدمج البحث مع التوليد في pipeline واحد قابل للتدريب.
مثال كود شغّال على Anthropic SDK
ده أبسط RAG ممكن تكتبه. السكربت بياخد سؤال، يبحث بكلمات مفتاحية في ملف نصي، يبعت أعلى 5 سطور لـ Claude، ويرجّع الإجابة:
import anthropic
from pathlib import Path
client = anthropic.Anthropic()
def simple_rag(question: str, docs_path: str) -> str:
docs = Path(docs_path).read_text(encoding="utf-8")
# Retrieval: ابحث عن الفقرات اللي فيها كلمات من السؤال
relevant = [
line for line in docs.split("\n")
if any(word in line for word in question.split())
][:5]
if not relevant:
return "مش موجود في المصادر المتاحة."
# Augmentation: ضيف السياق للسؤال
context = "\n".join(relevant)
prompt = f"""جاوب من السياق ده فقط. لو الإجابة مش موجودة، قول "مش موجود في المصادر".
السياق:
{context}
السؤال: {question}"""
# Generation: ابعت لـ Claude
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
print(simple_rag("ما هي سياسة الإجازات السنوية؟", "policies.txt"))
البحث ده بدائي عن قصد (keyword matching) عشان تفهم المبدأ. في الإنتاج تستبدل البحث بالكلمات بـ Embeddings + Vector Search — هتلاقي الفرق هائل في جودة الاسترجاع، خصوصاً مع العربي اللي بيتغيّر فيه شكل الكلمة (إجازة، إجازات، أجازة) لكن المعنى واحد.
أرقام من الواقع: ليه RAG مهمة فعلاً
دراسة Stanford HAI سنة 2024 على نماذج LLM في السياق القانوني الأمريكي قاست نسبة الهلوسة على أسئلة قضائية حقيقية:
- بدون RAG: نسبة الهلوسة وصلت 88% على أسئلة قانونية متخصصة.
- مع RAG: نزلت لحدود 17% على نفس الأسئلة بنفس النموذج.
فرق 5x في الموثوقية مش حاجة بسيطة. وفي شركات بنفّذ فيها RAG على وثائق داخلية، شفنا تقليل في "ما أعرفش" أو الإجابات الخطأ من حوالي 40% لـ 6% على أسئلة الموظفين الجدد عن السياسات.
المقايضات (Trade-offs)
كل توصية ليها ثمنها. RAG مش استثناء:
- المكسب: إجابات مبنية على مصادرك الحقيقية، تقدر تضيف معلومات جديدة بدون إعادة تدريب الموديل، وتقدر تعرض للمستخدم مصدر كل إجابة.
- الخسارة: latency زيادة من 200ms لـ 600ms حسب نوع الـ Vector DB، تكلفة تخزين الـ embeddings، وتعقيد إضافي في الـ pipeline (chunking, indexing, re-ranking).
الافتراض المهم: الكلام ده مبني على إن ملفاتك أكبر من 50,000 توكن (تقريباً 35-40 صفحة). لو ملفاتك أقل من كده، ابعتها كلها مباشرة في الـ system prompt مع Prompt Caching — هيبقى أرخص وأبسط بكتير من RAG، وأدق غالباً.
متى لا تستخدم RAG
- ملفاتك صغيرة جداً (أقل من 50K توكن): Context Window في موديلات 2026 بيوصل 200K توكن. ابعت كل ملفاتك في system prompt مع Prompt Caching وخلّصت. RAG هنا over-engineering.
- سؤالك عام مش مرتبط بملفات معينة: زي "اشرحلي ازاي يشتغل HTTP" أو "ما هو الفرق بين REST و GraphQL". هنا معرفة الموديل العامة كافية أكتر من أي ملف عندك.
- محتاج دقة 100% في نصوص حساسة (طبية أو قانونية حرجة): حتى مع RAG، الموديل ممكن يأوّل المصدر غلط. في الحالات دي، اعرض للمستخدم النص الأصلي حرفياً بدل ما تخلّي LLM يلخّصه.
- بياناتك بتتغيّر كل ثانية: RAG بتعمل index مسبق. لو الداتا real-time (أسعار، حجوزات لحظية)، استخدم Tool Use بدل RAG عشان النموذج يستعلم مباشرة وقت السؤال.
الخطوة التالية
افتح ملف نصي عندك دلوقتي (سياسة شركة، FAQ، أو وثيقة منتج)، وحط فيه 5-10 صفحات. شغّل الكود اللي فوق على سؤال واحد ولاحظ هل الإجابة طلعت من السياق فعلاً ولا الموديل ضرب من خارجه. لو طلعت من السياق، أنت عملت أبسط RAG ممكن. الخطوة بعد كده: استبدل البحث بالكلمات بـ Embeddings باستخدام voyage-3 من Voyage AI أو text-embedding-3-small من OpenAI — وقتها هتبدأ تحس بالفرق على نصوص عربية متنوعة.
المصادر
- Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020.
- Anthropic Documentation — Embeddings & RAG patterns:
docs.claude.com/en/docs/build-with-claude/embeddings - Stanford HAI (2024). Hallucinating Law: Legal Mistakes with Large Language Models.
- pgvector Project Documentation:
github.com/pgvector/pgvector - Voyage AI — Multilingual Embeddings benchmark report (2025).