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

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

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

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

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

المشكلة: لما نماذجنا اللغوية “بتهلوس”

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

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

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

الحل السحري: التوليد المعزّز بالاسترجاع (RAG)

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

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

المرحلة الأولى: الفهرسة (تجهيز “الكتاب المفتوح”)

قبل ما المستخدم يسأل أي سؤال، لازم نجهز مصادر المعرفة تبعتنا (مستندات PDF، صفحات ويب، قواعد بيانات، إلخ). هاي العملية بتمر بخطوتين:

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

المرحلة الثانية: الاسترجاع والتوليد (لما يسأل المستخدم)

الآن، لما يجي المستخدم ويسأل سؤال، بتصير العملية التالية بسرعة البرق:

  1. تضمين السؤال: بنحول سؤال المستخدم هو كمان لمتجه (Vector) بنفس الطريقة اللي عملناها مع قطع المستندات.
  2. الاسترجاع (Retrieval): بنروح على قاعدة البيانات المتجهة وبنحكيلها: “يا قاعدة البيانات، أعطيني أكثر قطع نصية متّجهاتها قريبة من متجه السؤال هاد”. النظام بيرجع لنا، مثلاً، أفضل 5 قطع نصية ذات صلة بالسؤال. هاي هي “الصفحات” اللي فتحناها من “الكتاب المفتوح”.
  3. التوليد المعزز (Augmented Generation): الآن، بدل ما نسأل النموذج اللغوي سؤال المستخدم مباشرة، بنبني له “سياق” جديد (Prompt معزز). بنحكيله:

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

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

يلا نطبّق عملي: مثال كود بسيط

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

تخيل عندنا ملف نصي اسمه `my_knowledge.txt` فيه المعلومات التالية:


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

الآن، لنبني نظام RAG بسيط للإجابة على أسئلة من هذا الملف.


# أولاً، تأكد من تثبيت المكتبات اللازمة
# pip install langchain langchain_openai langchain_community faiss-cpu

from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA

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

# 1. تحميل وتجهيز المستندات (الفهرسة)
# ------------------------------------

# تحميل الملف النصي
loader = TextLoader("my_knowledge.txt", encoding="utf-8")
documents = loader.load()

# تقطيع النص إلى قطع أصغر
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

# إنشاء تضمينات (embeddings) باستخدام OpenAI
embeddings = OpenAIEmbeddings()

# تخزين القطع والتضمينات في قاعدة بيانات متجهات (FAISS في الذاكرة)
# هاي هي عملية بناء "الكتاب المفتوح"
db = FAISS.from_documents(docs, embeddings)


# 2. بناء سلسلة الاسترجاع والإجابة
# --------------------------------

# تحديد النموذج اللغوي اللي رح يجاوب
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

# إنشاء سلسلة RAG
# chain_type="stuff" تعني أنه سيتم "حشو" كل القطع المسترجعة في السياق
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=db.as_retriever() # هذا هو الجزء المسؤول عن الاسترجاع
)


# 3. طرح الأسئلة!
# ----------------

query1 = "من هو أبو عمر؟"
response1 = qa_chain.invoke(query1)
print(f"السؤال: {query1}")
print(f"الإجابة: {response1['result']}")

print("-" * 20)

query2 = "ما هي التقنية التي يستخدمها أبو عمر لتقليل الهلوسة؟"
response2 = qa_chain.invoke(query2)
print(f"السؤال: {query2}")
print(f"الإجابة: {response2['result']}")

query3 = "ما هي عاصمة إسبانيا؟"
response3 = qa_chain.invoke(query3)
print(f"السؤال: {query3}")
print(f"الإجابة: {response3['result']}")

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

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

بعد شغل كتير في هذا المجال، فيه كم شغلة تعلمتها بالطريقة الصعبة، وحابب أشارككم إياها:

  • فن التقطيع (Chunking): حجم القطع (chunk size) ومقدار التداخل بينها (overlap) بفرق كتير. ما في رقم سحري واحد. جرب أحجام مختلفة. للأسئلة اللي بتحتاج تفاصيل دقيقة، القطع الصغيرة أفضل. للأسئلة اللي بتحتاج سياق عام، القطع الأكبر ممكن تكون أنسب.
  • “يا زلمة، رتّب بياناتك”: أهم نصيحة. جودة نظام الـ RAG تعتمد بشكل مباشر على جودة ونظافة بياناتك المصدر. إذا كانت مستنداتك مليئة بالأخطاء أو المعلومات المكررة، فالنتائج رح تكون سيئة. نظافة البيانات هي 80% من الشغل. Garbage in, garbage out.
  • مش كل نماذج التضمين زي بعض: اختيار نموذج التضمين (Embedding Model) مهم جداً. فيه نماذج أفضل للنصوص العربية، ونماذج أفضل للمصطلحات التقنية. جرب نماذج مختلفة (مثل `text-embedding-3-small` من OpenAI أو نماذج مفتوحة المصدر من Hugging Face) وشوف شو الأنسب لبياناتك.
  • البحث الهجين (Hybrid Search): أحياناً، الاعتماد على تشابه المعنى (Vector Search) لوحده مش كافي. ممكن المستخدم يبحث عن اسم منتج معين أو رقم قضية. هنا يأتي دور البحث الهجين، اللي بدمج البحث بالمتجهات مع البحث التقليدي بالكلمات المفتاحية (Keyword Search). هذا المزيج غالباً ما يعطي أفضل النتائج.

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

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

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

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

أبو عمر

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

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

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

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

آخر المدونات

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

تحديث نظامنا القديم كان كابوساً: كيف أنقذنا نمط ‘الخنق التدريجي’ (Strangler Fig) من جحيم إعادة البناء الكارثية؟

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

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

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

أتذكر جيداً ذلك الاجتماع المتوتر مع أحد عملائنا، حيث كانت لوحات تحكم الإعلانات تظهر أرقاماً كارثية بينما أرقام المبيعات الفعلية جيدة. في هذه المقالة، سأشارككم...

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

تغيير لون الزر كان يستغرق أسبوعاً: كيف أنقذتنا ‘رموز التصميم’ (Design Tokens) من جحيم التعديلات اليدوية؟

أنا أبو عمر، وأروي لكم كيف تحول طلب بسيط لتغيير لون زر إلى كابوس استمر أسبوعاً، وكيف كانت "رموز التصميم" (Design Tokens) هي طوق النجاة...

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

صفحاتنا كانت تتطلب آلاف الاستعلامات: كيف أنقذنا ‘التحميل المسبق’ (Eager Loading) من جحيم مشكلة N+1؟

أتذكر ذلك اليوم جيداً، كنا نطلق ميزة جديدة والصفحة أبطأ من السلحفاة. اكتشفنا أننا نرسل آلاف الاستعلامات لقاعدة البيانات بسبب مشكلة بسيطة تُدعى N+1. في...

23 أبريل، 2026 قراءة المزيد
الشبكات والـ APIs

خدماتنا المصغرة كانت فوضى من نقاط النهاية: كيف أنقذتنا ‘بوابة الواجهة البرمجية’ (API Gateway) من جحيم الإدارة المعقدة؟

أشارككم قصة حقيقية من قلب المعركة البرمجية، كيف انتقلنا من فوضى إدارة الخدمات المصغرة (Microservices) إلى نظام متكامل ومنظم. اكتشفوا معنا كيف كانت "بوابة الواجهة...

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

أسرارنا كانت مكشوفة للجميع: كيف أنقذتنا ‘إدارة الهوية والوصول’ (IAM) من جحيم الأذونات الفضفاضة؟

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

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