كانت نماذجنا تهذي: كيف أنقذنا ‘التوليد المعزز بالاسترجاع’ (RAG) من جحيم الهلوسة؟

يا جماعة الخير، السلام عليكم ورحمة الله وبركاته. معكم أخوكم أبو عمر.

خلوني أحكي ليكم قصة صارت معي قبل فترة مش بعيدة. كنا في الشركة شغالين على مشروع طموح: بناء مساعد ذكي (Chatbot) لجامعة كبيرة، الهدف منه إنه يجاوب على أسئلة الطلاب الجدد بخصوص التسجيل، المواد، مواعيد السداد، وكل هالحكي. الأمور كانت ماشية تمام، والنموذج اللغوي (LLM) اللي استخدمناه كان عبقري… أو هيك كنا مفكرين.

بعد إطلاق النسخة التجريبية بأسبوع، بلشت توصلنا الشكاوى. طالب بسأل عن آخر موعد لدفع الرسوم، الشات بوت بعطيه تاريخ من السنة الماضية. طالبة بتسأل عن متطلبات مادة “البرمجة المتقدمة”، فبعطيها وصف لمادة “تاريخ الفن الحديث”. الكارثة الكبرى كانت لما طالب سأله “هل في منحة للمتفوقين؟”، والجواب كان “نعم بالتأكيد، منحة كاملة لكل من معدله فوق الـ 80%”… طبعاً هالحكي ما إله أي أساس من الصحة! الجامعة ما بتقدم هيك منحة بالمرة.

يومها حسيت الأرض بتدور فيي. “شو القصة يا جماعة؟ النموذج تبعنا صار يهلوس!”، قلتها للفريق واجتمعنا اجتماع طارئ. النموذج كان يبدع، يخترع معلومات من لا شيء، وبكل ثقة! كانت لحظة صعبة، لكنها كانت المدخل لواحد من أهم المفاهيم اللي غيرت طريقة شغلنا مع الذكاء الاصطناعي: الـ RAG.

ما هي “الهلوسة”؟ ولماذا نماذجنا اللغوية ليست مجنونة!

قبل ما نحكي عن الحل، خلينا نفهم المشكلة بالزبط. “الهلوسة” (Hallucination) في عالم الذكاء الاصطناعي مش مرض نفسي، هي ببساطة وصف لظاهرة قيام النموذج اللغوي بتوليد معلومات تبدو منطقية وصحيحة، لكنها في الواقع خاطئة أو لا أساس لها في بيانات التدريب.

تخيل معي إنك بتسأل طالب ذكي جداً، حافظ آلاف الكتب، عن موضوع معين ما قرأ عنه ولا كلمة. شو راح يعمل؟ على الأغلب راح يحاول “يألّف” إجابة بناءً على كل المعرفة العامة اللي عنده، عشان ما يبين إنه ما بيعرف. الإجابة ممكن تطلع قريبة من الصح، وممكن تطلع شطحة كبيرة. هاد بالزبط اللي بيعمله النموذج اللغوي.

النماذج اللغوية الكبيرة (LLMs) مثل GPT-4 وغيرها، تم تدريبها على كميات هائلة من بيانات الإنترنت حتى تاريخ معين. هي لا “تعرف” الحقيقة، بل هي بارعة جداً في التنبؤ بالكلمة التالية في الجملة بناءً على سياق إحصائي. عندما تسألها عن شيء خارج نطاق تدريبها (مثل سياسات جامعتنا المحدثة) أو عن حدث جديد، فإنها تبدأ في “التخمين” بأفضل طريقة ممكنة، وهذا هو منبع الهلوسة.

الحل ليس سحراً، بل هندسة ذكية: مرحباً بـ RAG

هنا يأتي دور “التوليد المعزز بالاسترجاع” أو Retrieval-Augmented Generation (RAG). الاسم ممكن يكون معقّد شوي، بس الفكرة بسيطة وعبقرية.

بدل ما نترك النموذج اللغوي “يسرح بخياله”، إحنا بنعطيه “كتاب مفتوح” وبنقول له: “تفضل، اقرأ هاي الصفحة وجاوب من خلالها فقط”.

الـ RAG هو ببساطة تقنية بتدمج قوة النماذج اللغوية على الفهم والتوليد، مع القدرة على الوصول لمعلومات خارجية ومحددة وموثوقة في الوقت الفعلي. بدل ما يعتمد النموذج على ذاكرته القديمة (بيانات التدريب)، صار عنده القدرة إنه يبحث في قاعدة بيانات خاصة فينا قبل ما يجاوب.

كيف يعمل الـ RAG خطوة بخطوة؟

العملية بتمر بمراحل واضحة ومنطقية:

  1. الاستعلام (Query): المستخدم (الطالب في قصتنا) يسأل سؤال: “ما هي مواعيد التسجيل للفصل الصيفي 2024؟”.
  2. الاسترجاع (Retrieval): هنا يبدأ السحر. بدل ما نرسل السؤال مباشرة للـ LLM، نظامنا يقوم أولاً بالبحث في قاعدة معرفة خاصة وموثوقة (Knowledge Base). قاعدة المعرفة هاي ممكن تكون ملفات PDF (مثل دليل الطالب)، مستندات وورد، محتوى موقع الجامعة، أو أي مصدر معلومات نثق فيه.
  3. التعزيز (Augmentation): النظام بيلاقي أكثر المستندات أو الفقرات صلة بالسؤال. مثلاً، بلاقي صفحة من دليل التسجيل فيها جدول مواعيد الفصل الصيفي. يقوم النظام بأخذ هذه المعلومات “المُسترجعة” ويدمجها مع السؤال الأصلي في “prompt” جديد ومحسن.
  4. التوليد (Generation): أخيراً، يتم إرسال هذا الـ prompt المعزز إلى النموذج اللغوي (LLM) مع تعليمة واضحة: “بناءً على السياق التالي، أجب عن السؤال. السياق: [محتوى صفحة مواعيد التسجيل…]. السؤال: ما هي مواعيد التسجيل للفصل الصيفي 2024؟”.

والنتيجة؟ النموذج الآن لا “يهلوس”، بل يلخص ويصيغ إجابة دقيقة ومبنية 100% على المصدر الموثوق الذي قدمناه له. مشكلة الهلوسة اختفت تقريباً!

قواعد البيانات المتجهية (Vector Databases): المكتبة الذكية

قد تسأل، كيف تتم عملية “الاسترجاع” الذكية هذه؟ كيف يعرف النظام أي جزء من آلاف المستندات هو الأكثر صلة؟ الجواب يكمن في مفهومين: التضمين (Embeddings) وقواعد البيانات المتجهية (Vector Databases).

  • التضمين (Embeddings): هي عملية تحويل النصوص إلى أرقام (متجهات/vectors) بطريقة تحافظ على المعنى الدلالي. يعني، جملة “مواعيد التسجيل” وجملة “متى أستطيع تسجيل المواد” راح يكونوا قريبين جداً من بعض في الفضاء الرقمي، حتى لو الكلمات مختلفة.
  • قواعد البيانات المتجهية (Vector Databases): مثل `ChromaDB`, `Pinecone`, `Weaviate`، هي قواعد بيانات مصممة خصيصاً لتخزين والبحث في هذه المتجهات الرقمية بكفاءة وسرعة فائقة. لما يجي سؤال جديد، بنحوله لمتجه وبنطلب من قاعدة البيانات هاي إنها تعطينا المتجهات (أي النصوص) الأقرب له في المعنى.

يلا نشتغل: مثال عملي بالكود

حكينا كثير، خلينا نكتب شوية كود. راح نستخدم لغة Python ومكتبة LangChain الشهيرة لتبسيط العملية.

الخطوة 0: التجهيز (Setup)

أولاً، نحتاج لتثبيت المكتبات اللازمة. تأكد أن لديك مفتاح API من OpenAI.


pip install langchain langchain-openai langchain-community chromadb

الخطوة 1: تجهيز قاعدة المعرفة والمستخدم

لنفترض أن لدينا هذا المستند البسيط كمصدر للمعلومات.


import os
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
from langchain_core.prompts import ChatPromptTemplate

# تأكد من وضع مفتاح OpenAI API كمتغير بيئة
# os.environ["OPENAI_API_KEY"] = "sk-..."

# هذا هو مصدر المعرفة الموثوق الخاص بنا
knowledge_base_text = """
تعلن جامعة النجاح عن بدء فترة السحب والإضافة للفصل الدراسي الثاني 2024.
تبدأ الفترة من يوم الأحد 15/9/2024 وتنتهي يوم الخميس 19/9/2024.
يجب على جميع الطلبة مراجعة مرشديهم الأكاديميين قبل تثبيت جداولهم.
لا يوجد أي تمديد بعد هذا التاريخ.
"""

# هذا هو سؤال المستخدم
user_question = "متى آخر يوم للسحب والإضافة؟"

الخطوة 2: بناء سلسلة الـ RAG

الآن سنقوم بتقطيع النص، إنشاء قاعدة بيانات متجهة في الذاكرة، وبناء السلسلة الكاملة.


# 1. تهيئة النماذج اللازمة
llm = ChatOpenAI(model="gpt-4o")
embeddings = OpenAIEmbeddings()

# 2. تقطيع النص إلى أجزاء صغيرة (chunks)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
docs = text_splitter.create_documents([knowledge_base_text])

# 3. إنشاء قاعدة بيانات متجهة من أجزاء النص
# سيقوم Chroma بتحويل النصوص إلى متجهات باستخدام OpenAIEmbeddings وتخزينها
vector_store = Chroma.from_documents(docs, embeddings)

# 4. إنشاء "المسترجع" (Retriever) الذي يبحث في قاعدة البيانات
retriever = vector_store.as_retriever()

# 5. إنشاء قالب الـ Prompt الذي يوجه الـ LLM
prompt = ChatPromptTemplate.from_template("""
أجب على سؤال المستخدم بناءً على السياق التالي فقط.
إذا كانت الإجابة غير موجودة في السياق، قل بوضوح "لا أملك معلومات كافية للإجابة".

<context>
{context}
</context>

السؤال: {input}
""")

# 6. بناء السلسلة التي تدمج المستندات مع الـ prompt
document_chain = create_stuff_documents_chain(llm, prompt)

# 7. بناء سلسلة الاسترجاع الكاملة (RAG Chain)
retrieval_chain = create_retrieval_chain(retriever, document_chain)

# 8. تشغيل السلسلة والحصول على الإجابة
response = retrieval_chain.invoke({"input": user_question})

print("--- السؤال ---")
print(response["input"])
print("n--- الإجابة ---")
print(response["answer"])
print("n--- المستندات المستخدمة ---")
for doc in response["context"]:
    print(doc.page_content)

إذا قمت بتشغيل هذا الكود، ستكون المخرجات شيئًا كهذا:


--- السؤال ---
متى آخر يوم للسحب والإضافة؟

--- الإجابة ---
بناءً على المعلومات المتوفرة، آخر يوم لفترة السحب والإضافة هو يوم الخميس 19/9/2024.

--- المستندات المستخدمة ---
تعلن جامعة النجاح عن بدء فترة السحب والإضافة للفصل الدراسي الثاني 2024.
تبدأ الفترة من يوم الأحد 15/9/2024 وتنتهي يوم الخميس 19/9/2024.
يجب على جميع الطلبة مراجعة مرشديهم الأكاديميين قبل تثبيت جداولهم.
لا يوجد أي تمديد بعد هذا التاريخ.

لاحظ كيف أن الإجابة دقيقة ومباشرة ومستندة بالكامل على السياق الذي تم استرجاعه. لو سألت الآن “ما هي رسوم التسجيل؟”، سيجيب النموذج بـ “لا أملك معلومات كافية للإجابة”، لأنه صادق ومقيد بالمصدر.

نصائح من خبرة أبو عمر

بعد شغل ومشاريع كثيرة استخدمنا فيها الـ RAG، جمعت لكم شوية نصائح عملية:

  • “النظافة من الإيمان… وكمان نظافة البيانات”: جودة نظام الـ RAG من جودة قاعدة المعرفة. إذا كانت مستنداتك فوضوية، قديمة، أو غير دقيقة، ستحصل على إجابات سيئة. استثمر وقتاً في تنظيف وتنظيم مصادر معلوماتك. Garbage in, garbage out.
  • “مش كل إشي بده RAG”: لا تعقد الأمور بدون داعي. إذا كان تطبيقك يحتاج إبداعاً أو حواراً عاماً، قد يكون النموذج اللغوي وحده كافياً. الـ RAG يلمع عندما تحتاج لإجابات دقيقة مبنية على بيانات خاصة، متغيرة، أو حديثة.
  • “حجم التقطيع مهم”: حجم الأجزاء (Chunk size) التي تقسم إليها مستنداتك يؤثر بشكل كبير على النتائج. أجزاء صغيرة جداً قد تفقد السياق، وأجزاء كبيرة جداً قد تضيع المعلومة الدقيقة. جرب أحجاماً مختلفة حتى تصل للأفضل لتطبيقك.
  • “لا تنسى الـ Metadata”: عند تخزين أجزاء النص، أضف لها بيانات وصفية (metadata) مثل اسم الملف الأصلي، رقم الصفحة، تاريخ الإنشاء. هذا يساعدك لاحقاً في تتبع مصدر المعلومة وعرضه للمستخدم، مما يزيد الثقة.

الخلاصة: من الهلوسة إلى الحقيقة الراسخة 🎯

في النهاية، تقنية الـ RAG لم تكن مجرد حل تقني لمشكلة واجهتنا، بل كانت نقلة نوعية في طريقة تفكيرنا. حولت النماذج اللغوية من “طلاب أذكياء ولكن خيالهم واسع” إلى “باحثين خبراء” يستندون إلى مصادر موثوقة. لقد أنقذت مشروعنا مع الجامعة، والأهم من ذلك، أعادت بناء ثقتنا في بناء أنظمة ذكاء اصطناعي يمكن الاعتماد عليها في تطبيقات العالم الحقيقي.

نصيحتي الأخيرة لك: لا تخف من تجربة الـ RAG. ابدأ بمشروع صغير، مستند واحد، والكود الذي شاركته معكم. شاهد بنفسك كيف يمكنك ترويض قوة النماذج اللغوية وتوجيهها لخدمة أهدافك بدقة وموثوقية. فالعالم لا يحتاج المزيد من الهلوسة، بل المزيد من الحقيقة.

بالتوفيق يا جماعة الخير.

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

​معمارية البرمجيات

نمط الخانق (Strangler Fig): كيف تخنق المونوليث القديم تدريجياً دون أن تخنق فريقك؟

أنا أبو عمر، وهذا درسي لكم عن نمط الخانق (Strangler Fig)، الاستراتيجية التي تعلمتها من الطبيعة لتحديث الأنظمة القديمة "المونوليث" خطوة بخطوة، دون المخاطرة الكبيرة...

6 مايو، 2026 قراءة المزيد
تسويق رقمي

رسائلنا التسويقية كانت تضيع: كيف أنقذنا “التخصيص الفائق” والذكاء الاصطناعي من جحيم التجاهل؟

كنا نصرخ في فراغ رقمي ورسائلنا لا تصل. في هذه المقالة، أشارككم قصة حقيقية كيف استخدمنا الذكاء الاصطناعي وتقنيات التخصيص الفائق (Hyper-personalization) لتحويل حملاتنا التسويقية...

6 مايو، 2026 قراءة المزيد
تجربة المستخدم والابداع البصري

الهمسات الرقمية: كيف تحوّل التفاعلات الدقيقة (Microinteractions) تجربة المستخدم من عادية إلى ساحرة؟

أنا أبو عمر، وفي هذه المقالة سأشارككم سرّاً من أسرار التصميم الاحترافي. سنتحدث عن "الهمسات الرقمية" أو التفاعلات الدقيقة (Microinteractions)، تلك التفاصيل الصغيرة التي تحوّل...

6 مايو، 2026 قراءة المزيد
برمجة وقواعد بيانات

كانت استعلاماتنا تبحث في كل صف: كيف أنقذتنا ‘فهارس قواعد البيانات’ من جحيم المسح الكامل للجداول (Full Table Scans)؟

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

6 مايو، 2026 قراءة المزيد
الحوسبة السحابية

كانت خوادمنا تستهلك وقتنا ومواردنا: كيف أنقذتنا ‘الحوسبة بدون خوادم’ (Serverless) من جحيم إدارة البنية التحتية؟

أنا أبو عمر، مبرمج فلسطيني، وأروي لكم قصتنا مع إدارة الخوادم التي كادت أن تقتل مشروعنا. اكتشفوا كيف حولت الحوسبة بدون خوادم (Serverless) هذا الكابوس...

6 مايو، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

كان طلب واحد يُجمّد النظام بأكمله: كيف أنقذتنا ‘طوابير الرسائل’ من جحيم المهام المتزامنة؟

أشارككم قصة حقيقية عن يوم كاد فيه طلب واحد أن يُسقط نظامنا بالكامل، وكيف كانت "طوابير الرسائل" (Message Queues) هي طوق النجاة. سنتعمق في فهم...

6 مايو، 2026 قراءة المزيد
البودكاست