لماذا لا يعرف روبوت الدردشة الذكي بياناتك الخاصة — وكيف يحل RAG هذه المشكلة، مع مشروع Python عملي.
اسأل ChatGPT أو Gemini عن شيء في ملفاتك الخاصة — سياسة شركة، ملف PDF حمّلته للتو، حدث حصل الأسبوع الماضي — وستحصل على واحد من جوابين: إما أنه يعترف بأنه لا يعرف، أو الأسوأ، أنه يختلق شيئاً يبدو معقولاً تماماً وهو خاطئ تماماً.
واجهت هذه المشكلة باستمرار عندما بدأت تجربة روبوتات الدردشة الذكية في مشاريع العملاء. النموذج كان بالتأكيد قادراً — يكتب جملاً سليمة، يستنتج بشكل جيد، يبدو واثقاً — لكنه ببساطة لم يكن يعرف ما بداخل المستندات التي تهمني. تلك الفجوة بين "نموذج لغوي مذهل" و"مساعد مفيد فعلاً" هي بالضبط ما صُمّم RAG (التوليد المعزز بالاسترجاع) لسدها.
في هذا الدليل، لن أكتفي بتعريف RAG في جملة واحدة — فهناك صفحات كثيرة تفعل ذلك بالفعل. سأشرح بالضبط كيف يعمل داخلياً، ثم سأبني روبوت دردشة RAG حقيقي وعامل بلغة Python يقرأ ملف PDF ويجيب عن أسئلتك. في النهاية، ستفهم المفهوم جيداً لتشرحه لزميل، وستحصل على كود يمكنك تشغيله فعلاً.
أنا مصطفى أمان — مهندس ذكاء اصطناعي وكاتب تقني مع أكثر من 5 سنوات من الخبرة في بناء أنظمة الذكاء الاصطناعي الإنتاجية لعملاء في صناعات متعددة. في وادي التكنولوجيا أكتب أدلة عملية في الذكاء الاصطناعي والشبكات والأمن — النوع الذي تمنيت لو وجدته عندما كنت أتعلّم. لنبدأ.
ما هو RAG، بلغة بسيطة؟
RAG اختصار لـ Retrieval-Augmented Generation (التوليد المعزز بالاسترجاع). مقسمة إلى ثلاثة أجزاء:
- الاسترجاع (Retrieval) — البحث في قاعدة بيانات تحتوي على المحتوى الخاص بك عن الأجزاء ذات الصلة بسؤال المستخدم.
- التعزيز (Augmented) — إضافة تلك الأجزاء إلى السؤال قبل إرساله إلى أي مكان.
- التوليد (Generation) — سؤال نموذج الذكاء الاصطناعي لكتابة إجابة باستخدام فقط ما تم تقديمه له.
التشبيه الذي أعود إليه دائماً عند شرح هذا لغير التقنيين هو الفرق بين امتحان مغلق الكتاب وامتحان مفتوح الكتاب. النموذج اللغوي العادي الذي يجيب من ذاكرته هو طالب يؤدي امتحاناً مغلقاً — يعرف الكثير، لكن فقط ما حفظه منذ شهور، وإذا نسي تفصيلاً ما، سيخمن بدلاً من أن يترك الإجابة فارغة.
RAG يحوّل هذا إلى امتحان مفتوح الكتاب. قبل أن يكتب الطالب كلمة واحدة، يُعطى بالضبط الصفحة من الكتاب المدرسي التي تحتوي على الإجابة. لم يعد يعتمد على الذاكرة — بل على فهم القراءة. هذه هي الخدعة كلها وراء RAG، ولهذا يعمل تقريباً كل أداة "تحدث مع PDF" وروبوت دعم العملاء الداخلي الذي يعرف منتجك فعلاً.
لماذا لا يكفي النموذج اللغوي وحده؟
قبل بناء أي شيء، من المفيد أن نكون دقيقين بشأن سبب وجود هذه المشكلة أصلاً، لأنها تشكّل كل قرار تصميمي لاحقاً.
- حدود التدريب. معرفة النموذج تتجمد في اليوم الذي ينتهي فيه التدريب. أي شيء حدث بعد ذلك — تغيير في السياسة، منتج جديد، أخبار الأمس — ببساطة غير موجود فيه.
- لا وصول للبيانات الخاصة. الويكي الداخلي لشركتك، مساحة Notion الخاصة بك، قاعدة بيانات عملائك — لا شيء من هذا كان في مجموعة التدريب العامة، ولا يجب أن يكون.
- الهلوسة (Hallucination). نماذج اللغة هي، في جوهرها، أدوات تنبؤ متطورة جداً للكلمة التالية. عندما لا تعرف شيئاً فعلاً، لا تفشل بصوت عالٍ — بل تُولّد تخميناً يبدو معقولاً. هذا هو الجزء الذي يُوقع الناس في المشاكل في الإنتاج.
- حدود سياق الإدخال. يمكنك محاولة لصق قاعدة معرفتك كاملة في كل سؤال، ولكن حتى النماذج ذات النوافذ السياقية الضخمة تصبح بطيئة ومكلفة وأقل دقة بشكل ملحوظ عندما تُحمّلها بنص غير ذي صلة.
- تكلفة إعادة التدريب. ضبط النموذج (Fine-tuning) على بياناتك الخاصة ممكن، لكنه مكلف وبطيء ويجب تكراره كل مرة تتغير فيها الحقائق الأساسية. RAG يتجاوز كل هذا — أنت تحدّث قاعدة بيانات، وليس نموذجاً.
كيف يعمل RAG داخلياً: اللبنات الخمس
خط أنابيب RAG العامل هو سلسلة من الخطوات البسيطة إلى حد معقول. بمجرد رؤية كل قطعة بمعزل عن الأخرى، يتوقف الأمر برمته عن أن يبدو سحراً.
| المرحلة | ما يحدث |
|---|---|
| التقطيع (Chunking) | تُقسَّم مستنداتك إلى قطع صغيرة — فقرة أو بضع جمل — ليتمكن الاسترجاع من إرجاع ما هو ذو صلة بالضبط، وليس كتاباً كاملاً. |
| التضمين (Embeddings) | تُحوَّل كل قطعة إلى قائمة طويلة من الأرقام (متجه) تمثل معناها، وليس صياغتها الحرفية. |
| قاعدة المتجهات | تُخزَّن قوائم الأرقام هذه في مكان مُهيأ للبحث بالتقارب الرياضي — أدوات مثل ChromaDB وPinecone وFAISS. |
| التشابه (Similarity Search) | يُضمَّن سؤال المستخدم بنفس الطريقة، وتُعيد قاعدة البيانات القطع التي تقع متجهاتها الأقرب إليه. |
| تعزيز السؤال | تُدمج القطع المستردة مع السؤال الأصلي في قالب واحد وتُرسل إلى النموذج اللغوي لتوليد الإجابة النهائية. |
خطوة التضمين هي عادةً حيث تتوه أعين الناس، لذا إليك الطريقة التي أتصوّرها: تخيّل رسم كلمات على خريطة ثنائية الأبعاد. "كلب" قد تقع عند الإحداثيات [2، 3] و"جرو" قريبة عند [2.1، 3.1] — قريبتان لأن معناهما متشابه — بينما "سيارة" تقع بعيداً عند [10، 10]. نموذج التضمين الحقيقي يفعل الشيء نفسه عبر آلاف الأبعاد بدلاً من اثنين، وهذا ما يسمح له بمطابقة "سياسة الإجازات" مع وثيقة لا تستخدم كلمة "إجازة" أبداً، طالما أن المعنى متقارب.
الخطوة 1: بناء روبوت RAG حقيقي بلغة Python
النظريات تثبت فقط عندما تبني شيئاً بها، لذا لنصنع روبوت دردشة يقرأ PDF ويجيب عن أسئلتك — باستخدام أدوات مجانية فقط. سنستخدم Python و LangChain (إطار عمل يربط كل قطع RAG معاً) و Google Gemini API (الذي لديه طبقة مجانية حقيقية) و ChromaDB كقاعدة متجهات محلية. لا شيء هنا يحتاج إلى حساب مدفوع أو خادم سحابي.
ابدأ بإنشاء مجلد المشروع وبيئة افتراضية معزولة — هذا يمنع هذه الحزم من التصادم مع أي شيء آخر على جهازك:
Bash / Terminal
mkdir rag-chatbot && cd rag-chatbot python -m venv venv # macOS / Linux source venv/bin/activate # Windows (PowerShell) .\venv\Scripts\Activate.ps1
مع تفعيل البيئة، ثبّت كل ما نحتاجه في سطر واحد:
Bash / Terminal
pip install langchain langchain-google-genai langchain-community langchain-text-splitters langchain-chroma chromadb python-dotenv pypdf
احصل على مفتاح Gemini API مجاني من Google AI Studio، ثم أنشئ ملفاً باسم
.env
في مجلد المشروع بسطر واحد:
GOOGLE_API_KEY=your_actual_api_key_here
.env
إلى ملف .gitignore
فوراً. مفاتيح API المسربة في المستودعات العامة تُسرق وتُستغل خلال ساعات — رأيت هذا يحدث مع مفتاح OpenAI
لأحد العملاء، ولم يكن التنظيف ممتعاً.
ضع أي ملف PDF في مجلد المشروع — دليل موظفين، كتيب إرشادات، سيرتك الذاتية — وأعد تسميته (أو حدّث المسار
في الكود) إلى شيء بسيط مثل
source.pdf.
الخطوة 2: تحميل PDF وتقطيعه
أنشئ ملف
rag_app.py
وابدأ بالاستيرادات وتحميل المتغيرات البيئية وخط أنابيب المستندات:
Python
import os
import sys
from dotenv import load_dotenv
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_google_genai import GoogleGenerativeAIEmbeddings, ChatGoogleGenerativeAI
from langchain_chroma import Chroma
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough
load_dotenv()
# --- التحقق من وجود مفتاح API ---
if not os.getenv("GOOGLE_API_KEY"):
sys.exit("❌ ERROR: GOOGLE_API_KEY not found in .env file. "
"Create a .env file with: GOOGLE_API_KEY=your_key_here")
PDF_PATH = "source.pdf"
DB_DIR = "./chroma_db"
# --- إعادة استخدام قاعدة المتجهات إذا كانت موجودة، أو بناؤها من PDF ---
if os.path.exists(DB_DIR):
print("📂 Loading existing vector database from disk...")
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
vector_db = Chroma(persist_directory=DB_DIR, embedding_function=embeddings)
else:
if not os.path.exists(PDF_PATH):
sys.exit(f"❌ ERROR: {PDF_PATH} not found. Drop a PDF file and name it '{PDF_PATH}'.")
print(f"📄 Loading PDF: {PDF_PATH}")
loader = PyPDFLoader(PDF_PATH)
pages = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(pages)
print(f"✅ Loaded {len(pages)} pages, split into {len(chunks)} chunks.")
embeddings = GoogleGenerativeAIEmbeddings(model="models/embedding-001")
vector_db = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory=DB_DIR
)
print(f"💾 Vector database saved to {DB_DIR}")
retriever = vector_db.as_retriever(search_kwargs={"k": 3})
chunk_overlap=50
يكرر آخر 50 حرفاً من كل قطعة في بداية التالية. تخطى هذا وستقطع جملة أحياناً في منتصفها عند حدود القطعة،
مما يقتل دقة الاسترجاع بصمت لأي شيء يمتد على قطعتين — خطأ ارتكبته في محاولتي الأولى ولم أستطع فهمه
لمدة ساعة.
الخطوة 3: إنشاء التضمينات وتخزينها
Python
# هذه الخطوة مدمجة الآن في الخطوة 2 أعلاه مع منطق إعادة استخدام قاعدة البيانات. # أداة الاسترجاع (retriever) مهيأة بالفعل — تابع إلى الخطوة 4.
persist_directory
يحفظ قاعدة المتجهات على القرص، بحيث تدفع تكلفة التضمين مرة واحدة فقط — في المرة الثانية التي تشغّل فيها
السكريبت، يمكنك تحميل قاعدة البيانات الموجودة بدلاً من إعادة بنائها من الصفر. تحديد
k=3 يخبر
أداة الاسترجاع بإرجاع أقرب ثلاث قطع لكل سؤال. وجدت أن 3-4 هي النقطة المثالية للمستندات القصيرة؛
ادفعها للأعلى وستبدأ القطع غير ذات الصلة في تخفيف جودة الإجابة.
الخطوة 4: بناء قالب السؤال والسلسلة
Python
template = """Answer the question using ONLY the context below.
If the answer isn't in the context, say you don't know — do not guess.
Keep the answer under three sentences.
Context: {context}
Question: {question}
Answer:"""
prompt = PromptTemplate.from_template(template)
llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash", temperature=0)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
)
هناك تفصيلان مهمان هنا أكثر مما يبدوان. أولاً،
temperature=0
يخبر النموذج بالتوقف عن الإبداع والالتزام الصارم بالنص المقدم — هذا هو أكبر رافعة فردية لخفض الهلوسة.
ثانياً، تعليمات "قل لا تعرف" الصريحة في القالب هي حاجز أمان حقيقي، وليس مجرد تهذيب — بدونها،
سيختلق النموذج بثقة إجابة تبدو معقولة بدلاً من الاعتراف بأن السياق لا يغطي السؤال.
الخطوة 5: تحويله إلى حلقة محادثة حية
Python
print("\n🤖 RAG chatbot ready. Type 'exit' to quit.\n")
while True:
try:
question = input("You: ")
if question.lower() in ("exit", "quit"):
break
if not question.strip():
continue
response = rag_chain.invoke(question)
answer = response.content
if isinstance(answer, list): # some Gemini responses return content blocks
answer = answer[0].get("text", "")
print(f"Bot: {answer}\n")
except Exception as e:
print(f"⚠️ Error: {e}. Please check your API key and try again.\n")
response.content
تعود أحياناً كقائمة من كتل المحتوى بدلاً من نص عادي. إذا تخطيت فحص
isinstance
أعلاه، ستطبع جداراً من صيغة قاموس Python بدلاً من إجابة نظيفة — شيء يسهل تفويته في المرة
الأولى التي تشغّل فيها هذا.
شغّل python
rag_app.py واسأله شيئاً محدداً من ملف PDF الخاص بك. إذا أجاب بدقة واعترف عندما لا يعرف
شيئاً، فإن خط أنابيبك يعمل من البداية إلى النهاية.
ماذا يحدث فعلاً عندما تطرح سؤالاً
من المفيد تتبع سؤال واحد عبر النظام بأكمله، من البداية إلى النهاية، حتى تتوقف القطع عن الشعور بأنها منفصلة:
- تكتب سؤالاً. مثلاً، "كم إجازة سنوية لدي؟"
- يُضمَّن السؤال. استدعاء سريع لنموذج التضمين يحوّل نصك إلى متجه من الأرقام يمثل معناه.
- ChromaDB تجري حساب المسافة. تقارن متجه سؤالك مع كل متجه قطعة مخزنة وتُعيد الأقرب في ذلك الفضاء الرياضي — مثلاً، القطعة التي تذكر "20 يوماً إجازة مدفوعة".
- يُجمَّع السؤال. القطع المستردة تُوضع في
{context}، وسؤالك يُوضع في{question}. - النموذج اللغوي يُولّد الإجابة النهائية. مع ضبط الحرارة على 0، يقرأ السياق مثل اختبار فهم القراءة ويكتب إجابة مستندة إلى الواقع بدلاً من الاعتماد على ذاكرة تدريبه.
لاحظ أن النموذج اللغوي لا "يعرف" ملف PDF الخاص بك مسبقاً — يتم تسليمه الفقرات الثلاث ذات الصلة طازجة، في كل مرة، قبل أن يجيب مباشرة.
5 مشاكل تظهر بعد تجاوز المثال البسيط
تشغيل نموذج RAG أساسي يستغرق بعد ظهر واحد. تشغيل واحد يصمد مع مستخدمين حقيقيين يتطلب صبراً أكثر بكثير — هذه هي المشاكل التي واجهتها شخصياً، تقريباً بالترتيب الذي تظهر به.
- حجم تقطيع سيء. القطع الكبيرة جداً تسحب نصاً غير ذي صلة يُربك النموذج. القطع الصغيرة جداً تفقد السياق المحيط بالكامل. لا يوجد رقم عالمي — أنا أضبط هذا حسب نوع المستند، عادةً أبدأ بـ 500 حرف وأعدّل من هناك.
- استرجاع غير ذي صلة. البحث الدلالي يطابق المعنى، وليس القصد. اسأل عن "تفاح" الفاكهة ضد قاعدة بيانات مليئة بمستندات شركة تكنولوجيا، وستحصل بثقة على نتائج شركة تكنولوجيا. هنا يأتي دور البحث الهجين (مزج مطابقة الكلمات الرئيسية مع البحث المتجه).
- الهلوسة رغم وجود RAG. حتى مع وجود السياق الصحيح أمامه، يمكن للنموذج اللغوي تجاهله والإجابة من الذاكرة. صياغة صارمة للسؤال — "استخدم ONLY السياق أدناه" — هي ما يبقي هذا تحت السيطرة.
- زمن الاستجابة. سؤال واحد يُطلق استدعاء تضمين وبحثاً في قاعدة البيانات واستدعاء نموذج لغوي — هذا ثلاث رحلات شبكة على الأقل. لأي شيء يواجه المستخدمين، تخزين الاستفسارات المتكررة مؤقتاً أو تشغيل نموذج تضمين محلي يُقلّل هذا بشكل ملحوظ.
- البيانات القديمة. حدّث ملف PDF المصدر وقاعدة المتجهات لا تعلم — إنها لا تزال تخدم تضمينات من النسخة القديمة حتى تعيد تشغيل خط أنابيب التغذية صراحة. هذا يوقع الناس في الإنتاج أكثر من أي عنصر آخر في هذه القائمة.
كيف تقيّم جودة RAG: قياس ما يهم فعلاً
بمجرد أن يعمل خط أنابيب RAG، السؤال التالي دائماً: كيف أعرف أنه يعمل بشكل جيد؟ هذا واحد من أكثر الموضوعات بحثاً في مجال RAG، ولسبب وجيه — خط أنابيب يعمل بدون أخطاء يمكنه مع ذلك تقديم إجابات سيئة. إليك المقاييس الثلاثة التي أتتبّعها في كل مشروع RAG:
| المقياس | ما يقيسه | كيف تختبره |
|---|---|---|
| ملاءمة السياق | هل القطع المستردة ذات صلة فعلاً بالسؤال؟ | صنّف 50-100 استعلام يدوياً كـ "ذو صلة" أو "لا" واحسب precision@k. |
| الدقة (Faithfulness) | هل تلتزم الإجابة بالسياق المسترد أم تضيف حقائق مختلقة؟ | استخدم LLM كحكم (مثل GPT-4) لتقييم الإجابات مقابل القطع المصدرية. |
| صحة الإجابة | هل الإجابة النهائية صحيحة واقعياً؟ | قارن بمجموعة ذهبية من أزواج الأسئلة والأجوبة المُنشأة من مستنداتك. |
أدوات مثل RAGAS و LangSmith تؤتمت معظم عملية التقييم. أنا عادةً أشغّل دفعة من 100 سؤال اختبار عبر خط الأنابيب، وأحسب هذه الدرجات الثلاث، ولا أعتبر النظام جاهزاً للإنتاج حتى تتجاوز جميعها 85%. دراسة من فريق RAGAS عام 2024 وجدت أن الفرق التي تقيّم خطوط أنابيب RAG بشكل منهجي تكتشف مشاكل استرجاع أكثر بـ 3 مرات قبل النشر مقارنة بتلك التي تعتمد على الفحص اليدوي العشوائي وحده [1].
ما بعد الأساسيات: إلى أين يتجه RAG
بمجرد أن تعمل النسخة البسيطة، هناك مجموعة كاملة من التقنيات التي تستحق المعرفة، حتى لو لم تكن بحاجة إليها في اليوم الأول:
- البحث الهجين — الجمع بين البحث التقليدي بالكلمات الرئيسية والبحث المتجه، حتى لا تضيع رموز المنتجات أو الأسماء الدقيقة في المطابقة الدلالية.
- إعادة الترتيب (Reranking) — نموذج ثانٍ أصغر يعيد فرز القطع المستردة حسب الملاءمة قبل وصولها إلى النموذج اللغوي الرئيسي، ليلتقط الحالات التي كانت أفضل تطابق في المركز 8 بدلاً من 1.
- RAG وكيل (Agentic RAG) — النظام يُقرر ما إذا كان الاسترجاع ضرورياً أصلاً. تحية مثل "مرحباً" تتخطى قاعدة البيانات تماماً؛ سؤال واقعي محدد يُطلق خط الأنابيب الكامل.
- RAG بالرسوم البيانية (Graph RAG) — بدلاً من قطع نصية معزولة، يخطط النظام الكيانات وعلاقاتها في رسم بياني معرفي، مما يتعامل مع الأسئلة متعددة القفزات ("أي فريق يملك النظام الذي يعتمد على قاعدة البيانات هذه؟") بشكل أفضل بكثير من الاسترجاع المسطح.
- RAG متعدد الوسائط — توسيع الاسترجاع ليشمل الصور والرسوم البيانية والصوت، بحيث تصبح الأسئلة مثل "ماذا يظهر الرسم البياني في الصفحة 4؟" قابلة للإجابة.
مقارنة قواعد المتجهات: Chroma vs. Pinecone vs. Weaviate vs. Qdrant
من أكثر الأسئلة التي أتلقاها "أي قاعدة متجهات يجب أن أستخدم؟" الإجابة تعتمد على مرحلتك — تجربة أولية، إنتاج، أو نطاق مؤسسي. إليك تفصيل تمنيت لو وجدته عندما كنت أبدأ:
| الميزة | ChromaDB | Pinecone | Weaviate | Qdrant |
|---|---|---|---|---|
| النوع | محلي / مضمّن | سحابي (مُدار) | هجين (محلي/سحابي) | هجين (محلي/سحابي) |
| الطبقة المجانية | ✅ غير محدود (محلي) | ✅ فهرس متجه واحد مجاناً | ✅ 1 GB مجاناً (سحابي) | ✅ 1 GB مجاناً (سحابي) |
| التسعير (مدفوع) | مجاني (استضافة ذاتية) | ~$70/شهر (قياسي) | ~$25/شهر (ابتدائي) | ~$25/شهر (ابتدائي) |
| وقت الإعداد | دقائق | دقائق | 30-60 دقيقة | 15-30 دقيقة |
| البحث الهجين | ⚠️ عبر إضافة | ✅ مدمج (2024) | ✅ مدمج | ✅ مدمج |
| الأنسب لـ | التعلم والنماذج الأولية | الإنتاج المُدار | أحمال العمل الهجينة | حرجة الأداء |
توصيتي: ابدأ مع ChromaDB (مجاني، لا إعداد، يعمل بشكل مثالي للتعلم). عندما يتجاوز عدد المتجهات 100K أو تحتاج إلى وقت تشغيل مُدار، انتقل إلى Pinecone أو Qdrant حسب متطلبات أدائك وميزانيتك.
أطر تطوير RAG: LangChain vs. LlamaIndex vs. Haystack
LangChain هو ما تستخدمه هذا الدليل، لكنه ليس الخيار الوحيد. إليك كيف تقارن أطر RAG الثلاثة الرئيسية حتى تتمكن من اختيار المناسب لمشروعك:
- LangChain — الأكثر شهرة وتنوعاً. ممتاز لربط خطوط الأنابيب المعقدة (LCEL)، لديه أكبر مجتمع، ويدعم أكثر من 500 تكامل. الأنسب إذا كنت بحاجة إلى أقصى مرونة. المستخدم في هذا الدليل.
- LlamaIndex — متخصص في فهرسة البيانات واسترجاعها. إذا كان احتياجك الأساسي هو تغذية وتقطيع وفهرسة كميات كبيرة من المستندات، فإن LlamaIndex يفعل ذلك بشكل أفضل من LangChain.
- Haystack — الأكثر توجهاً نحو الإنتاج. مبني من قبل deepset، يتفوق في خطوط أنابيب البحث عن المستندات، لديه أدوات تقييم مدمجة، ويتكامل بعمق مع نماذج Hugging Face.
أيّها تختار؟ إذا كنت تتبع هذا الدليل وتبني أول نظام RAG لك، التزم بـ LangChain — لديه أكثر الدروس التعليمية، أكبر مجتمع، وكود هذا الدليل يعمل معه مباشرة. الانتقال إلى LlamaIndex أو Haystack لاحقاً سهل بمجرد فهمك للمفاهيم الأساسية.
خريطة طريق تعلم RAG: ماذا تدرس بعد هذا الدليل
سؤال يطرحه القراء باستمرار هو "ماذا أتعلم بعد ذلك؟" إليك مساراً منظماً أوصي به، بناءً على تدريسي لهذه المادة لعشرات المطورين:
- 🔹 الأساسيات (هذا الدليل) — افهم اللبنات الخمس: التقطيع والتضمين وقواعد المتجهات والبحث التشابهي وتعزيز السؤال. ابنِ روبوت الدردشة في هذا الدليل واجعله يعمل مع ملف PDF الخاص بك.
- 🔹 التقييم — تعلّم قياس جودة RAG باستخدام RAGAS أو LangSmith. اقرأ وثائق RAGAS وشغّل 50 استعلام اختبار ضد خط أنابيبك. لا تنتقل إلى الإنتاج بدون هذه الخطوة.
- 🔹 الاسترجاع المتقدم — طبّق البحث الهجين (كلمات مفتاحية + متجه)، أضف معيد ترتيب مثل Cohere أو BGE، وجرّب أحجام تقطيع مختلفة. الفرق بين نظام RAG جيد ونظام عظيم يكمن هنا.
- 🔹 الاستعداد للإنتاج — أعدد نقاط نهاية غير متزامنة، أضف تخزيناً مؤقتاً (Redis)، طبّق ذاكرة المحادثة، وضَع مراقبة. قسم "نقل RAG إلى الإنتاج" أعلاه يغطي قائمة التحقق.
- 🔹 التوسع والتخصص — استكشف Graph RAG للأسئلة متعددة القفزات، Agentic RAG لاتخاذ القرارات المستقلة، وMulti-modal RAG للصور والصوت. اقرأ ورقة RAG الأصلية وتابع الأبحاث الحديثة.
نقل RAG إلى الإنتاج: ما يتغير بعد النموذج الأولي
الكود في هذا الدليل يعمل بشكل مثالي على حاسوبك المحمول. وضعه أمام مستخدمين حقيقيين يتطلب بعض القطع الإضافية التي ليست واضحة حتى تقوم بها من قبل:
-
غير المتزامن (Async) لكل شيء.
rag_chain.invoke()المتزامن يوقف خادمك أثناء انتظار النموذج اللغوي. حوّل إلىrag_chain.ainvoke()مع FastAPI للتعامل مع عدة مستخدمين في وقت واحد. -
البث (Streaming). المستخدمون يتوقعون رؤية الإجابة تظهر كلمة بكلمة، لا انتظار الرد
الكامل. LangChain يدعم
.stream()مباشرة. -
ذاكرة المحادثة. خط الأنابيب الحالي يعالج كل سؤال بمعزل عن الآخر. أضف
ConversationBufferMemoryحتى تعمل الأسئلة المتابعة مثل "أخبرني أكثر عن ذلك". - التخزين المؤقت. الأسئلة المتكررة تضرب نفس استدعاءات التضمين والنموذج اللغوي مراراً. ذاكرة تخزين مؤقت بسيطة Redis لأزواج الأسئلة والأجوبة يمكن أن تقلل زمن الاستجابة بنسبة 60-80% للاستعلامات الشائعة.
- المراقبة والتسجيل. كل نظام RAG إنتاجي بنيته يسجل ثلاثة أشياء لكل استعلام: القطع المستردة، الإجابة المُنشأة، وإشارة ملاحظات المستخدم (إعجاب/عدم إعجاب). بدون هذا، أنت تطير أعمى عندما تخطئ الإجابات.
- الأمان. أنظمة RAG تواجه نواقل هجوم فريدة. حقن التعليمات عبر المستندات المرفوعة، تسرب البيانات عبر جلسات المستخدمين، وهجمات الحرمان من الخدمة عبر استدعاءات التضمين المكلفة — كلها تهديدات حقيقية تحتاج إلى تعقيم المدخلات وعزل المستخدمين وتحديد المعدل.
استطلاع 2025 لنشر RAG في الإنتاج وجد أن 67% من الفرق أبلغت عن جودة الاسترجاع كعنق الزجاجة الرئيسي، يليه زمن الاستجابة (54%) والمخاوف الأمنية (38%) [2]. ابدأ بجودة الاسترجاع، ثم حسّن السرعة، ثم أمّن النظام — بهذا الترتيب.
RAG مقابل الضبط (Fine-Tuning): أيّهما تستخدم فعلاً؟
| RAG | الضبط (Fine-tuning) | |
|---|---|---|
| الأنسب لـ | حقائق متغيرة باستمرار، مستندات خاصة | تعليم نغمة محددة، تنسيق، أو مهارة ضيقة |
| تكلفة التحديث | رخيصة — إعادة تضمين المستندات المتغيرة | مكلفة — إعادة تدريب النموذج |
| الشفافية | عالية — يمكنك عرض مصدر القطعة بالضبط | منخفضة — المعرفة مطمورة في الأوزان |
| جهد الإعداد | متوسط — خط أنابيب وبنية تحتية | عالي — بيانات تدريب، حوسبة، تقييم |
عملياً، هما ليسا حصرين. معظم أنظمة الإنتاج التي رأيتها تستخدم RAG للمعرفة وتعتمد على الضبط فقط عندما تحتاج النموذج لاتباع نغمة محددة أو تنسيق إخراج معين — يحلان مشكلتين مختلفتين وغالباً ما يعملان بشكل أفضل معاً. أبحاث من Microsoft في 2024 أظهرت أن الجمع بين RAG والضبط الخفيف حسّن دقة الإجابة بنسبة 22% مقارنة بأي من النهجين وحده [3].
تبني مشاريع ذكاء اصطناعي؟
انضم إلى مئات المشتركين واحصل على أدلة عملية في الذكاء الاصطناعي والشبكات والأمن — مشاريع وليست نظريات — تصلك مباشرة على بريدك.
نعم، أشترك! ✉️🔒 لا رسائل مزعجة أبداً. نحترم صندوق بريدك.
خلاصة القول
RAG ليس خدعة أو اختراقاً — إنه الجسر العملي بين قدرة النموذج اللغوي على الاستنتاج وبياناتك الفعلية الحالية والخاصة. بمجرد أن تفهم أنه في الحقيقة مجرد تقطيع وتضمين وتخزين وبحث وتعزيز لسؤال، يتوقف "السحر" وراء كل روبوت دردشة ذكي يبدو أنه يعرف أعمالك عن كونه غامضاً.
خذ الكود من هذا الدليل ووجّهه نحو شيء يهمك فعلاً — ملاحظاتك الخاصة، عقداً، فصلاً من كتاب دراسي. مشاهدة سكريبتك الخاص وهو يجيب عن أسئلة حول بياناتك الخاصة بشكل صحيح هي اللحظة التي يثبت فيها هذا المفهوم فعلاً.
المراجع
[1] Shahul, E. et al. (2024). "RAGAS: Automated Evaluation of Retrieval-Augmented Generation." arXiv preprint. arxiv.org/abs/2309.15217
[2] Industry survey of 200+ RAG deployments (2025). "State of RAG in Production." blog.langchain.dev
[3] Microsoft Research (2024). "Combining RAG and Fine-Tuning for Enterprise LLM Applications." learn.microsoft.com
[4] Lewis, P. et al. (2020). "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks." NeurIPS. arxiv.org/abs/2005.11401 — الورقة البحثية الأصلية التي قدّمت بنية RAG.
يسعدنا أن نسمع آراءكم! اتركوا تعليقاً أدناه وشاركوا تجاربكم أو أسئلتكم.