نموذجنا اللغوي كان يهذي: كيف أنقذتنا تقنية 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 متيناً، وشاهد كيف يتحول تطبيقك إلى مصدر للمعرفة يمكن الوثوق به. شغل مرتب ومضمون! 😉

أبو عمر

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

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

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

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

آخر المدونات

التكنلوجيا المالية Fintech

كانت قراراتنا الائتمانية صندوقاً أسود: كيف أنقذنا ‘الذكاء الاصطناعي القابل للتفسير’ (XAI) من جحيم التحيز والشكاوى التنظيمية؟

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

16 مايو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كانت أعطالنا تباغتنا في منتصف الليل: كيف أنقذنا Prometheus من جحيم المراقبة التفاعلية؟

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

16 مايو، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

طلبات الدمج تموت في الانتظار: كيف أنقذ “ميثاق مراجعة الكود” فريقنا من جحيم التأخير والجدل؟

أتذكر ذلك اليوم جيداً، طلب دمج (Pull Request) عالق لأسبوع، ونقاش حاد بين اثنين من أفضل المبرمجين حول تفصيل بسيط. كانت هذه هي القشة التي...

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

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

أشارككم قصة حقيقية من قلب المعركة البرمجية، وكيف تحولنا من فوضى الأخطاء المرئية بعد كل تحديث إلى ثقة وهدوء بفضل اختبارات التراجع البصري (Visual Regression...

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

كان مطورنا الجديد ينتظر أياماً: كيف أنقذتنا ‘أتمتة إعداد البيئة’ من جحيم الأسبوع الأول الضائع؟

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

15 مايو، 2026 قراءة المزيد
نصائح برمجية

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

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

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

كانت خدماتنا تتحدث في نفس الوقت: كيف أنقذتنا ‘المعمارية القائِمَة على الأحداث’ (EDA) من جحيم الاقتران المحكم؟

في ليلة إطلاق عصيبة، كادت خدماتنا المترابطة أن تُغرق المشروع بأكمله. أروي لكم كيف تحولنا من فوضى الاقتران المحكم إلى مرونة المعمارية القائمة على الأحداث...

15 مايو، 2026 قراءة المزيد
ذكاء اصطناعي

كانت نماذجنا تموت بصمت: كيف أنقذتنا ‘مراقبة تعلم الآلة’ (ML Monitoring) من كارثة التنبؤات الفاسدة؟

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

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