نموذجنا اللغوي كان يهذي: كيف أنقذتنا تقنية RAG من جحيم هلوسة الذكاء الاصطناعي؟

ليلة كادت أن تكون كارثية: قصة “المحامي الآلي” الذي فقد صوابه

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

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

ولّعت معنا! كيف يمكن أن نسلّم نظاماً لشركة محاماة قد يسبب كارثة قانونية بمعلومة خاطئة واحدة؟ هل كل هذا الجهد سيذهب سدى؟ هنا توقفنا وسألنا أنفسنا: “شو القصة؟ ليش النموذج بسوي هيك؟”. لم تكن المشكلة في “ذكاء” النموذج، بل في “ذاكرته”. كان يتصرف كطالب ذكي جداً قرأ كل كتب العالم، لكنه حين يُسأل عن ملاحظة محددة في دفتره الخاص، يبدأ بالتخمين بناءً على ثقافته العامة بدلاً من فتح الدفتر والبحث فيه. وهنا، أضاء في ذهني مصباح الحل: استرجاع المعلومات المعزز (Retrieval-Augmented Generation – RAG).


ما هي “الهلوسة” التي كادت أن تدمر مشروعنا؟

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

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

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

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

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

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

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

لنقسم العملية إلى مراحل بسيطة وواضحة:

  1. مرحلة الفهرسة (Indexing): هذه المرحلة تحدث مرة واحدة في البداية (أو كلما تغيرت بياناتك).
    • تقطيع البيانات (Chunking): نقوم بأخذ مستنداتك (ملفات PDF، صفحات ويب، نصوص…) وتقطيعها إلى أجزاء صغيرة (Chunks).
    • التحويل إلى متجهات (Embedding): كل جزء صغير من النص يتم تحويله إلى تمثيل رقمي يسمى “متجه” (Vector) باستخدام نموذج خاص (Embedding Model). هذا المتجه هو بمثابة “بصمة” عددية لمعنى هذا النص.
    • التخزين في قاعدة بيانات متجهة (Vector Database): يتم تخزين كل هذه المتجهات مع النصوص الأصلية المقابلة لها في قاعدة بيانات متخصصة في البحث عن المتجهات المتشابهة بسرعة، مثل Pinecone, ChromaDB, أو FAISS.
  2. مرحلة الاسترجاع والتوليد (Retrieval & Generation): هذه المرحلة تحدث مع كل سؤال يطرحه المستخدم.
    • استعلام المستخدم: يسأل المستخدم سؤالاً، مثلاً: “ما هي شروط إنهاء العقد في قضية العميل س؟”.
    • تحويل الاستعلام: يتم تحويل سؤال المستخدم أيضاً إلى “متجه” باستخدام نفس نموذج الـ Embedding.
    • البحث عن التشابه (Similarity Search): يقوم النظام بالبحث في قاعدة البيانات المتجهة عن أجزاء النصوص (Chunks) التي تملك متجهات هي الأكثر شبهاً وقرباً من متجه سؤال المستخدم. هذا يعني أنه يبحث عن النصوص الأكثر صلة بالمعنى.
    • تعزيز موجه الأوامر (Prompt Augmentation): الآن، بدلاً من إرسال السؤال للنموذج اللغوي مباشرة، نقوم ببناء “موجه أوامر” (Prompt) جديد ومحسن. يكون شكله كالتالي:

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

      السياق: [هنا نضع أجزاء النصوص ذات الصلة التي استرجعناها من قاعدة البيانات]

      سؤال المستخدم: [هنا نضع سؤال المستخدم الأصلي]"

    • التوليد (Generation): أخيراً، يستقبل النموذج اللغوي هذا الموجه المعزز ويقوم بتوليد إجابة دقيقة ومبنية على المعلومات الموثوقة التي قدمناها له في السياق.

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


خلونا نوسّخ إيدينا: مثال عملي بسيط باستخدام Python

الكلام النظري جميل، لكن دعونا نرى كيف يبدو هذا بشكل عملي. سنستخدم مكتبة langchain الشهيرة لتسهيل العملية.

h3>أولاً: التجهيزات والمكتبات

ستحتاج لتثبيت بعض المكتبات. افتح الطرفية (Terminal) واكتب:

pip install langchain openai chromadb tiktoken

ثانياً: الكود خطوة بخطوة

لنفترض أن لدينا ملف نصي بسيط اسمه my_data.txt يحتوي على معلوماتنا الموثوقة.


# 1. استيراد المكتبات اللازمة
import os
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.chat_models import ChatOpenAI

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

# 2. تحميل وتقطيع البيانات
# لنفترض أن لدينا ملف my_data.txt يحتوي على:
# "سياسة الإجازات في شركتنا تمنح الموظفين 21 يوماً إجازة سنوية.
# يجب تقديم طلب الإجازة قبل أسبوعين على الأقل.
# الإجازات المرضية تتطلب تقريراً طبياً."

loader = TextLoader('my_data.txt')
documents = loader.load()

# تقطيع النص إلى أجزاء أصغر
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_documents(documents)

# 3. إنشاء الـ Embeddings وتخزينها في قاعدة بيانات متجهة (ChromaDB)
# سيتم إنشاء قاعدة البيانات في مجلد على جهازك
persist_directory = 'db'
embedding = OpenAIEmbeddings()

vectordb = Chroma.from_documents(documents=texts, 
                                 embedding=embedding,
                                 persist_directory=persist_directory)
vectordb.persist()
vectordb = None # نفرغ الذاكرة

# الآن أصبحت بياناتنا مفهرسة وجاهزة

# 4. بناء سلسلة RAG للاستعلام
vectordb = Chroma(persist_directory=persist_directory, 
                  embedding_function=embedding)
retriever = vectordb.as_retriever()

# هنا ننشئ السلسلة التي تربط كل شيء ببعضه
qa_chain = RetrievalQA.from_chain_type(llm=ChatOpenAI(model_name="gpt-3.5-turbo"), 
                                  chain_type="stuff", 
                                  retriever=retriever)

# 5. طرح الأسئلة ورؤية النتائج!
query = "كم عدد أيام الإجازة السنوية للموظفين؟"
response = qa_chain.run(query)
print(f"السؤال: {query}")
print(f"الإجابة: {response}")

query_tricky = "ما هي سياسة الشركة بخصوص سيارات الموظفين؟"
response_tricky = qa_chain.run(query_tricky)
print(f"nالسؤال: {query_tricky}")
print(f"الإجابة: {response_tricky}")

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


نصائح أبو عمر من قلب الميدان

بعد تطبيق RAG في مشاريع عديدة، تعلمت بعض الدروس التي لا تجدها دائماً في التوثيق الرسمي. إليك بعضها:

  • جودة التقطيع (Chunking) هي مفتاح النجاح: لا تقطع النصوص بشكل عشوائي. فكر في بنية مستنداتك. هل من الأفضل التقطيع عند كل فقرة؟ عند كل عنوان؟ التقطيع الجيد يحافظ على السياق ويؤدي لنتائج أفضل.
  • لا تهمل البيانات الوصفية (Metadata): عند تخزين المتجهات، أرفق معها بيانات وصفية مثل اسم الملف الأصلي، رقم الصفحة، أو تاريخ الإنشاء. هذا يسمح لك لاحقاً بعرض المصادر للمستخدم (“الإجابة مأخوذة من مستند X، صفحة 5”)، مما يزيد من ثقة المستخدم بشكل هائل.
  • الاسترجاع ليس كل شيء، الترتيب مهم (Re-ranking): أحياناً، أفضل 5 نتائج من قاعدة البيانات المتجهة قد لا تكون هي الأفضل فعلاً. يمكنك إضافة خطوة “إعادة ترتيب” (Re-ranking) باستخدام نموذج أصغر وأسرع لترتيب هذه النتائج الخمس قبل إرسالها للنموذج اللغوي الكبير.
  • هندسة الأوامر (Prompt Engineering) لا تزال ملكة: الطريقة التي تصيغ بها الموجه النهائي للنموذج اللغوي تؤثر بشكل كبير على جودة الإجابة. جرب صيغاً مختلفة مثل “أنت خبير في… استخدم السياق التالي للإجابة…” حتى تصل لأفضل نتيجة.

الخلاصة… من الآخر

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

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

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

أبو عمر

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

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

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

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

آخر المدونات

ذكاء اصطناعي

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

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

15 أبريل، 2026 قراءة المزيد
خوارزميات

حساباتنا كانت تعيد اختراع العجلة: كيف أنقذتنا البرمجة الديناميكية من جحيم التكرار؟

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

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

ميزانيتنا كانت تتبخر: كيف أنقذتنا ‘نماذج الإحالة المبنية على البيانات’ من جحيم تخمين عائد الاستثمار؟

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

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

من الفوضى إلى التناغم: دليلك لبناء نظام تصميم (Design System) يوحّد المطورين والمصممين

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

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

كائناتنا كانت تتحدث لغة مختلفة عن جداولنا: كيف أنقذنا ‘الـ ORM’ من جحيم الترجمة اليدوية لـ SQL؟

أشارككم قصة من أيام البرمجة الأولى، وكيف أن تقنية الـ ORM نقلتنا من معاناة كتابة استعلامات SQL يدوياً إلى عالم من الإنتاجية والكود النظيف. هذه...

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