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

مقدمة: يوم أن بدأ مساعدنا الذكي بـ “تأليف” القانون

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

في أحد أيام الاختبار، سأل أحد المحامين المساعد الذكي عن مادة معينة في قانون الشركات. بكل ثقة، أجاب النموذج بمادة قانونية مفصلة، برقمها وفقراتها، وبأسلوب قانوني لا غبار عليه. انبهر المحامي وقال: “ممتاز! هذا سيوفر علينا ساعات من البحث”. لكن، ولحسن حظنا، كان معنا محامٍ خبير، من هؤلاء الذين يحفظون القانون عن ظهر قلب. نظر إلى الشاشة، عقد حاجبيه، وقال بهدوء: “يا جماعة… هاي المادة مش موجودة. هالحكي كله تأليف!”.

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

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

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

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

هذه المشكلة تنبع من طبيعة تدريب هذه النماذج. يتم تدريبها على كميات هائلة من نصوص الإنترنت، وهذه البيانات قد تكون:

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

هنا يأتي دور المنقذ، تقنية RAG.

الحل السحري: “التوليد المعزز بالاسترجاع” (RAG) – شو القصة؟

RAG هي اختصار لـ Retrieval-Augmented Generation. الفكرة بسيطة وعبقرية في آن واحد، وهي تحويل النموذج اللغوي من طالب “مغلق الكتاب” يعتمد على ذاكرته فقط، إلى طالب “مفتوح الكتاب” يمكنه الرجوع إلى مصدر موثوق قبل الإجابة.

بدلاً من أن نسأل النموذج مباشرةً ويجيب من “رأسه”، يقوم نظام RAG بالخطوات التالية:

  1. الاسترجاع (Retrieval): عند طرح سؤال، يبحث النظام أولاً في قاعدة بيانات معرفية موثوقة (مستنداتك، موقعك، كتبك) عن المعلومات ذات الصلة بالسؤال.
  2. التعزيز (Augmentation): يأخذ النظام هذه المعلومات التي وجدها ويضيفها إلى سؤالك الأصلي كسياق إضافي.
  3. التوليد (Generation): يرسل السؤال الأصلي مع السياق الإضافي إلى النموذج اللغوي ويطلب منه الإجابة بناءً على المعلومات المقدمة فقط.

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

كيف يعمل نظام RAG خطوة بخطوة؟ (الجانب التقني)

الآن دعونا ندخل في التفاصيل التقنية. بناء نظام RAG يمر بمرحلتين أساسيتين: مرحلة الإعداد (تتم مرة واحدة أو بشكل دوري) ومرحلة الاستعلام (تتم مع كل سؤال).

المرحلة الأولى: تجهيز قاعدة المعرفة (Indexing)

هذه هي مرحلة بناء “الكتاب المفتوح” الذي سيستخدمه النموذج. هدفنا هو تحويل مستنداتنا (PDFs, Docs, TXT) إلى صيغة قابلة للبحث السريع والفهم الدلالي (Semantic Search).

  1. تقسيم المستندات (Chunking): لا يمكننا وضع مستند من 100 صفحة مباشرة في النموذج. نقوم بتقسيمه إلى “قطع” (chunks) أصغر، كل قطعة عبارة عن فقرة أو بضع فقرات. هذا يساعد في العثور على معلومات دقيقة ومحددة.
  2. إنشاء التضمينات (Embeddings): هذه هي الخطوة السحرية. نستخدم نموذج تضمين (Embedding Model) لتحويل كل “قطعة” نصية إلى متجه رياضي (vector). هذا المتجه هو تمثيل رقمي لمعنى النص. النصوص ذات المعاني المتقاربة يكون لها متجهات متقاربة في الفضاء الرياضي.
  3. التخزين في قاعدة بيانات متجهة (Vector Database): نقوم بتخزين هذه المتجهات (مع النص الأصلي المرتبط بها) في قاعدة بيانات متخصصة تسمى Vector Database (مثل Pinecone, ChromaDB, FAISS). هذه القاعدة مصممة للبحث عن المتجهات المتشابهة بسرعة فائقة.

المرحلة الثانية: الاستعلام والإجابة (Querying)

هنا ما يحدث عندما يطرح المستخدم سؤالاً:

  1. تضمين السؤال: يتم تحويل سؤال المستخدم نفسه إلى متجه باستخدام نفس نموذج التضمين.
  2. البحث عن التشابه (Similarity Search): يقوم النظام بأخذ متجه السؤال والبحث في قاعدة البيانات المتجهة عن “القطع” النصية التي تملك المتجهات الأكثر قربًا وتشابهًا معه. هذه هي عملية “الاسترجاع”.
  3. بناء السياق (Context Building): يتم تجميع أفضل النتائج (القطع النصية المسترجعة) لتشكيل “سياق”.
  4. توليد الإجابة: يتم إرسال طلب (prompt) إلى النموذج اللغوي الكبير، وهذا الطلب يبدو كالتالي:
    
            أنت مساعد خبير. أجب على السؤال التالي بناءً على السياق المرفق فقط. إذا كانت الإجابة غير موجودة في السياق، قل "لا أعرف الإجابة".
    
            السياق:
            [هنا نضع القطع النصية التي تم استرجاعها من قاعدة البيانات]
    
            السؤال:
            [هنا نضع سؤال المستخدم الأصلي]
    
            الإجابة:
            

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

مثال عملي بالكود: لنبني نظام RAG بسيط باستخدام Python

الحكي سهل، خلينا نشوف الكود. سنستخدم مكتبة langchain الشهيرة لتبسيط العملية، مع قاعدة بيانات ChromaDB التي تعمل في الذاكرة.

أولاً، تأكد من تثبيت المكتبات اللازمة:

pip install langchain openai chromadb tiktoken

الآن، لنكتب الكود. تخيل أن لدينا ملف my_knowledge.txt يحتوي على معلوماتنا الموثوقة:


# my_knowledge.txt
اسم شركتنا هو "حلول أبو عمر التقنية".
تأسست الشركة في مدينة نابلس عام 2020.
نحن متخصصون في حلول الذكاء الاصطناعي وتطوير الويب.
المدير التنفيذي هو أبو عمر.

وهذا هو كود بايثون لتطبيق نظام RAG على هذا الملف:


import os
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# تأكد من وضع مفتاح OpenAI API الخاص بك هنا
# os.environ["OPENAI_API_KEY"] = "sk-..."

# 1. تحميل المستند
loader = TextLoader('./my_knowledge.txt', encoding='utf-8')
documents = loader.load()

# 2. تقسيم المستند إلى قطع (Chunking)
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# 3. إنشاء التضمينات وتخزينها في قاعدة بيانات متجهة (ChromaDB)
embeddings = OpenAIEmbeddings()
# سيتم إنشاء قاعدة البيانات في الذاكرة
docsearch = Chroma.from_documents(texts, embeddings)

# 4. إعداد سلسلة RAG
# qa هي اختصار لـ Question Answering
qa = RetrievalQA.from_chain_type(
    llm=OpenAI(), 
    chain_type="stuff", 
    retriever=docsearch.as_retriever()
)

# 5. طرح الأسئلة
query1 = "ما هو اسم الشركة؟"
answer1 = qa.run(query1)
print(f"سؤال: {query1}")
print(f"جواب: {answer1}n")

query2 = "أين تأسست الشركة؟"
answer2 = qa.run(query2)
print(f"سؤال: {query2}")
print(f"جواب: {answer2}n")

query3 = "من هو رئيس وزراء كندا؟"
answer3 = qa.run(query3)
print(f"سؤال: {query3}")
print(f"جواب: {answer3}n")

عند تشغيل هذا الكود، ستلاحظ أن الإجابات على السؤالين الأول والثاني ستكون دقيقة ومأخوذة من الملف. أما السؤال الثالث، الذي لا توجد إجابته في ملفنا، فالنموذج سيجيب غالبًا بـ “I don’t know” أو ما شابه، لأنه تم تقييده بالإجابة من السياق فقط. وهذا هو المطلوب تمامًا!

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

بناء أنظمة RAG هو فن وعلم. إليك بعض النصائح من تجربتي الشخصية:

  • جودة البيانات هي كل شيء: كما يقول المثل “Garbage in, garbage out”. إذا كانت قاعدة معرفتك تحتوي على معلومات خاطئة أو متضاربة، فسيقوم نظام RAG بتوليد إجابات خاطئة ولكن بثقة أكبر. نظّف بياناتك أولاً.
  • فن تقسيم النصوص (Chunking): حجم القطع (chunk size) ومقدار التداخل (overlap) يؤثران بشكل كبير على جودة البحث. قطع صغيرة جدًا قد تفقد السياق، وقطع كبيرة جدًا قد تكون غير دقيقة. جرب قيمًا مختلفة لتجد الأفضل لبياناتك.
  • اختر نموذج التضمين المناسب: هناك العديد من نماذج التضمين (من OpenAI, Hugging Face, وغيرها). بعضها أفضل للغات معينة، وبعضها أفضل للمجالات التقنية أو القانونية. ابحث واختر الأنسب لمشروعك.
  • هندسة الأوامر (Prompt Engineering) لا تزال مهمة: الطريقة التي تصيغ بها القالب (template) الذي يجمع السياق والسؤال تؤثر على جودة الإجابة النهائية. كن واضحًا في تعليماتك للنموذج.
  • التقييم والمراقبة: لا تفترض أن نظامك مثالي من اليوم الأول. قم ببناء مجموعة بيانات للتقييم (evaluation dataset) لاختبار دقة نظامك باستمرار وراقب الإجابات التي يقدمها للمستخدمين لتحديد نقاط الضعف وتحسينها.

الخلاصة: من الهلوسة إلى الثقة ✅

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

باختصار، RAG لا تجعل النموذج أذكى، بل تجعله أكثر اطلاعًا وموثوقية من خلال ربطه بمصدر الحقيقة الخاص بك. هي الجسر الذي يربط القوة التوليدية الهائلة للنماذج اللغوية بدقة بياناتك الخاصة.

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

أبو عمر

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

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

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

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

آخر المدونات

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

ذاكرة الفريق هي التوثيق الوحيد: كيف أنقذتنا ‘سجلات القرارات المعمارية’ (ADRs) من جحيم “لماذا فعلنا ذلك؟”

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

22 مايو، 2026 قراءة المزيد
خوارزميات

كان البحث عن ‘الشبيه’ في بياناتنا مثل البحث عن إبرة في الكون: كيف أنقذتنا ‘التجزئة الحساسة للموقع’ (LSH) من جحيم المقارنات الكاملة؟

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

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

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

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

22 مايو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

كان ملفي على GitHub مقبرة للمشاريع المنسية: كيف أنقذني ‘التنظيم القصصي’ من جحيم الانطباع الأول السيء؟

ملف GitHub الفوضوي كاد أن يكلّفني وظيفة أحلامي. في هذه المقالة، أشارككم كـ"أبو عمر" كيف حوّلت 'مقبرة المشاريع' هذه إلى قصة احترافية تروي مسيرتي التقنية...

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

كانت قاعدة بياناتنا تختنق: كيف أنقذتنا “النسخ المتماثلة للقراءة” (Read Replicas) من جحيم بطء الاستعلامات؟

أشارككم قصة حقيقية من قلب المعركة، عندما كاد تطبيقنا أن ينهار تحت ضغط المستخدمين. سأشرح لكم كيف كانت "النسخ المتماثلة للقراءة" (Read Replicas) طوق النجاة...

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