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

والله يا جماعة الخير، بذكرها زي كأنها مبارح. كنا قاعدين أنا والفريق في المكتب، بنشرب قهوتنا السادة وبنراقب “شات بوت” جديد كنا بنبنيه لشركة محاماة كبيرة. المشروع كان ضخم، والموديل اللي دربناه كان المفروض يكون “فهمان” في القانون الفلسطيني والأردني. الأمور كانت ماشية تمام، لحد ما بلّش واحد من المحامين الجداد في الشركة يسأل البوت أسئلة دقيقة شوي.

فجأة، بنشوف البوت بجاوب على سؤال بخصوص بند في عقد إيجار… وبخترع مادة قانونية من العدم! المادة مش موجودة لا في القانون الفلسطيني ولا الأردني ولا حتى في قوانين جزر الواق واق. صابنا صدمة، وضحك، وقلق بنفس الوقت. المدير عنا وجهه صار ألوان، والمحامي صار يبعت إيموجي ضحك مع دموع. النموذج اللغوي تبعنا كان “بهلوس” (Hallucinating) على أصوله. كان قاعد “بألّف حكي” وبقدمه بثقة تامة كأنه حقيقة مسلم بها. وقتها، ولعت اللمبة براسي وقلت للفريق: “يا جماعة، هيك ما بنفع. لازم نلاقي حل يخلي الموديل يلتزم بالنص، لازم نفتحله الكتاب وهو بجاوب”. ومن هنا بدأت رحلتنا الحقيقية مع تقنية غيرت كل شيء: التوليد المعزز بالاسترجاع أو ما يعرف بـ RAG.

ما هي “هلوسة” النماذج اللغورية الكبيرة (LLM Hallucination)؟

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

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

لماذا تحدث الهلوسة؟

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

المحاولات الأولى: الضبط الدقيق (Fine-Tuning) لم يكن كافيًا

في البداية، كان الحل الطبيعي اللي فكرنا فيه هو الـ Fine-Tuning. يعني نجيب كل المستندات القانونية تبعت الشركة، ونعيد تدريب النموذج عليها عشان “يفهم” السياق تبعهم بشكل أفضل. وهذا اللي عملناه.

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

نصيحة من أبو عمر: الضبط الدقيق (Fine-Tuning) مفيد جدًا لتغيير “أسلوب” أو “نبرة” النموذج، أو لتعليمه مهارة جديدة (مثلاً، تلخيص المستندات بأسلوب معين). لكنه ليس الحل الأمثل لضمان الدقة وتزويد النموذج بمعلومات حديثة أو خاصة.

طوق النجاة: التوليد المعزز بالاسترجاع (RAG)

وهنا يأتي دور البطل في قصتنا: RAG أو Retrieval-Augmented Generation. الفكرة وراها عبقرية وبسيطة بنفس الوقت، زي فكرة “الكتاب المفتوح” في الامتحان.

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

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

العملية بتمر بثلاث مراحل رئيسية، خلينا نبسطها:

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

شغل عملي: مثال كود بسيط باستخدام Python و LangChain

الحكي النظري حلو، بس خلينا نشوف كيف ممكن نعمل “شغل مرتب” ونطبق هذا الكلام عمليًا. سنستخدم مكتبة `LangChain` الشهيرة لأنها بتسهل العملية جدًا.

تخيل أن لدينا ملف `kwanen.txt` يحتوي على بعض القوانين الداخلية للشركة.


# أولاً، نصب المكتبات اللازمة
# pip install langchain openai faiss-cpu tiktoken

from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings, OpenAI
from langchain.chains import RetrievalQA

# 1. تحميل وإعداد المستندات
with open('kwanen.txt', 'r', encoding='utf-8') as f:
    raw_text = f.read()

# 2. تقسيم النص إلى أجزاء (chunks) ليسهل البحث فيها
text_splitter = CharacterTextSplitter(
    separator="n",
    chunk_size=800,
    chunk_overlap=100,
    length_function=len,
)
texts = text_splitter.split_text(raw_text)

# 3. إنشاء "التضمينات" (Embeddings) وقاعدة بيانات المتجهات (Vector Store)
# هذه هي الخطوة التي تحول نصوصنا إلى أرقام يمكن البحث فيها دلاليًا
# سنستخدم FAISS لتخزينها في الذاكرة كمثال بسيط
embeddings = OpenAIEmbeddings() # يتطلب مفتاح API من OpenAI
vectorstore = FAISS.from_texts(texts, embeddings)

# 4. إعداد سلسلة RAG
# هنا نربط كل شيء معًا: النموذج اللغوي، وقاعدة المتجهات
qa_chain = RetrievalQA.from_chain_type(
    llm=OpenAI(), # النموذج اللغوي الذي سيقوم بالصياغة
    chain_type="stuff", # طريقة دمج المستندات في الـ prompt
    retriever=vectorstore.as_retriever(), # المسترجع الذي سيبحث في قاعدة البيانات
)

# 5. طرح السؤال!
query = "ما هي سياسة الإجازات السنوية للموظفين؟"
response = qa_chain.run(query)

print(response)

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

نصائح من خبرة العُمر في بناء أنظمة RAG

  • جودة البيانات هي الأساس: نظام RAG قوي بقدر قوة البيانات التي يسترجع منها. إذا كانت مستنداتك فوضوية أو قديمة أو خاطئة، فالنتائج ستكون كذلك. “Garbage in, garbage out” كما يقول الخواجات.
  • فن تقسيم النصوص (Chunking): الطريقة التي تقسم بها مستنداتك إلى أجزاء صغيرة (chunks) تؤثر بشكل كبير على جودة الاسترجاع. لا تقسم في منتصف جملة أو فكرة. جرب استراتيجيات مختلفة مثل التقسيم الدلالي (Semantic Chunking).
  • المسترجع (Retriever) هو الملك: حتى لو كان لديك أفضل نموذج لغوي في العالم، إذا لم يتمكن المسترجع من العثور على المعلومات ذات الصلة، فلن يكون هناك فائدة. استثمر وقتًا في تحسين المسترجع، ربما باستخدام تقنيات مثل Hybrid Search التي تجمع بين البحث بالكلمات المفتاحية والبحث الدلالي.
  • لا تثق، بل تحقق (Evaluate): لا تفترض أن نظامك يعمل بشكل مثالي. قم ببناء مجموعة من الأسئلة والأجوبة النموذجية واختبر نظامك باستمرار لقياس دقته وجودة استرجاعه.

الزبدة والخلاصة

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

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

نصيحتي الأخيرة لك: لا تخف من تجربة هذه التقنيات. ابدأ صغيرًا، بمستند واحد، وجرب الكود بنفسك. العالم يتغير بسرعة، وأفضل طريقة لمواكبة التغيير هي أن تكون جزءًا منه. يلا، شدوا حيلكم! 🚀

أبو عمر

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

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

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

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

آخر المدونات

تجربة المستخدم والابداع البصري

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

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

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

كنا ندفع ثمن الخوادم حتى وهي نائمة: كيف حررتنا الحوسبة بدون خوادم (Serverless) من جحيم التكاليف الخاملة؟

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

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

كانت قاعدة بياناتنا تتوسل الرحمة: كيف أنقذتنا استراتيجية التخزين المؤقت الجانبي (Cache-Aside) من جحيم الاستعلامات؟

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

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