مستوى المقال: مبتدئ — موجّه لمن يعرف Python ويستخدم Claude أو ChatGPT API لكنه لم يُطبّق RAG عمليًا. زمن القراءة: ~9 دقائق.
RAG للمبتدئ: خلّي Claude يجاوب من ملفاتك بدون fine-tuning
لو سألت Claude "إيه سياسة الإجازات في شركتنا؟" هيقولك "مش عارف". مش لأن الموديل ضعيف — لأنه ما اتدرّبش على ملفات شركتك. الحل الشائع الغلط هو fine-tuning بميزانية $10K+. الحل الصح اسمه RAG، بيكلّفك أقل من $20 شهريًا وبيشتغل في ساعتين.
المشكلة باختصار
الموديلات اللغوية متدرّبة على بيانات الإنترنت العامة حتى تاريخ معيّن. لو عندك دليل موظفين 200 صفحة PDF، أو 5,000 تذكرة دعم سابقة، أو documentation تقنية داخلية — الموديل ما يعرفش أي حاجة منهم. RAG (Retrieval-Augmented Generation) بيحلّ ده بإنه قبل كل سؤال، يبحث في ملفاتك، يجيب الجزء المتعلق بالسؤال، ويحطّه في الـ prompt للموديل قبل ما يطلب منه يجاوب.
المثال للمبتدئ: أمين المكتبة
تخيّل إن Claude طالب جامعي ذكي جدًا. عنده شهادات في كل حاجة عامة، لكن مش حافظ كتب مكتبة كليتك بالظبط. لو سألته سؤال محدد عن "محاضرة د. أحمد رقم 7"، هيقولك "ما عرفش".
RAG بيضيف للطالب ده "أمين مكتبة". لما السؤال يجي، أمين المكتبة بيمشي على الرفوف بسرعة، يجيب 3 كتب فيها الإجابة، يحطها قدّام الطالب، وبعدين الطالب بيقرا الكتب دي ويجاوب من المحتوى ده مباشرة. لو الكتاب فيه الإجابة، الطالب بيرد صح. لو مش فيه الإجابة، الطالب بيقولك "مش متوفر في المراجع المتاحة" بدل ما يخترع كلام.
ده بالظبط اللي بيحصل في RAG: مفيش تدريب جديد للموديل، بس عملية بحث ذكية بتحصل قبل كل سؤال.
التعريف العلمي الدقيق
RAG اختصار لـ Retrieval-Augmented Generation. النظام بيتركّب من 3 طبقات شغّالة بالترتيب:
- Embedding Model: بيحوّل أي نص لـ vector (مصفوفة أرقام بطول 768 أو 1024 أو 1536). النصوص اللي معناها قريب بتطلع vectors قريبة رياضيًا. كلمة "إجازة" و"عطلة" بيكون بينهم
cosine similarity ≈ 0.89. - Vector Database: مخزن متخصص في البحث بـ cosine similarity على ملايين الـ vectors في ميلي ثانية. أمثلة: ChromaDB، Pinecone، Qdrant، pgvector.
- Generator: الـ LLM (Claude مثلاً) اللي بيستلم السؤال + الـ context المسترجع، ويولّد الإجابة بناءً عليهم بس.
لما المستخدم يسأل، السؤال نفسه بيتحوّل لـ vector عبر نفس الـ embedding model. بعدين بيتم البحث عن أقرب 3-5 chunks في الـ vector database. بعدين الـ chunks دي بتترص في prompt واحد مع السؤال وتتبعت للموديل. الموديل ملوش حق يخترع — هو محصور في الـ context اللي وصله.