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

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

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

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

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

ما هو ‘التوليد المعزز بالاسترجاع’ (RAG)؟ ببساطة شديدة

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

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

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

كيف يعمل RAG “حبة حبة”؟ (الخطوات التقنية)

العملية بتتقسم لمرحلتين رئيسيتين: مرحلة التجهيز (Indexing) ومرحلة الاستعلام (Querying). خلينا نفصّلها خطوة بخطوة.

المرحلة الأولى: التجهيز وتخزين المعرفة

هذه المرحلة نقوم بها مرة واحدة في البداية، أو كلما تم تحديث وثائقنا.

  1. تقطيع المستندات (Chunking): أول خطوة هي أخذ كل وثائقنا (ملفات PDF, Word, TXT, HTML) وتقطيعها إلى أجزاء أو “قطع” (chunks) صغيرة. ليش؟ لأن النماذج اللغوية لها حدود في كمية النص اللي بتقدر تقرأه مرة واحدة (ما يسمى بـ Context Window). التقطيع بيضمن إننا نعطيها أجزاء مركزة وذات صلة.
  2. إنشاء المتجهات (Embeddings): هنا يبدأ السحر. نأخذ كل “قطعة” نصية ونمررها عبر نموذج متخصص اسمه “نموذج التضمين” (Embedding Model) مثل text-embedding-3-small من OpenAI أو غيره. هذا النموذج يحول النص إلى قائمة طويلة من الأرقام تسمى “متجه” (Vector). هذا المتجه هو بمثابة “بصمة رياضية” لمعنى النص. النصوص اللي معانيها متشابهة بتكون متجهاتِها قريبة من بعض في الفضاء الرياضي.
  3. تخزين المتجهات (Indexing in a Vector DB): الآن، نأخذ كل هذه المتجهات ونخزنها في قاعدة بيانات متخصصة اسمها “قاعدة بيانات متجهة” (Vector Database). أمثلة عليها: Pinecone, ChromaDB, FAISS. وظيفة هذه القاعدة هي أنها سريعة جداً في البحث عن التشابه بين المتجهات.

بانتهاء هذه المرحلة، صار عندك “مكتبة” رقمية ذكية قابلة للبحث الفوري حسب المعنى وليس فقط الكلمات المفتاحية.

المرحلة الثانية: الاستعلام وتوليد الإجابة (وقت سؤال المستخدم)

هذه المرحلة تحدث في كل مرة يسأل فيها المستخدم سؤالاً.

  1. سؤال المستخدم: المستخدم يكتب سؤاله، مثلاً: “كيف أقدم على إجازة عائلية طارئة؟”.
  2. تحويل السؤال إلى متجه: نستخدم نفس “نموذج التضمين” (Embedding Model) لتحويل سؤال المستخدم إلى متجه رقمي.
  3. البحث عن السياق (Retrieval): نأخذ متجه السؤال ونذهب به إلى قاعدة البيانات المتجهة. نطلب منها: “أعطني أفضل 3 أو 5 قطع نصية (chunks) متجهاتها هي الأقرب لمتجه هذا السؤال”. قاعدة البيانات بسرعة البرق بترجع لنا أكثر أجزاء الوثائق صلة بالسؤال.
  4. بناء الأمر المعزز (Augmented Prompt): هنا تكمن العبقرية. نقوم ببناء “أمر” (Prompt) جديد للنموذج اللغوي الكبير. هذا الأمر يحتوي على:
    • السياق المسترجع: “بناءً على المعلومات التالية: [نص القطعة الأولى] و [نص القطعة الثانية] و…”
    • السؤال الأصلي: “…أجب على السؤال التالي: كيف أقدم على إجازة عائلية طارئة؟”
    • تعليمات إضافية: “إذا كانت المعلومة غير موجودة في السياق، قل بوضوح أنك لا تعرف.”
  5. التوليد (Generation): نرسل هذا الأمر المعزز والكامل إلى النموذج اللغوي (مثل GPT-4). الآن، النموذج لن يهلوس، بل سيقرأ السياق الذي قدمناه له ويصيغ إجابة دقيقة ومبنية على وثائقنا الخاصة.

مثال عملي بالكود (يا جماعة الشغل النظيف)

حتى تكون الصورة واضحة، هي مثال بسيط باستخدام Python ومكتبة LangChain الشهيرة التي تسهل بناء أنظمة RAG.

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

pip install langchain langchain-openai langchain-community chromadb

الآن، لنكتب الكود. سنفترض أن لدينا ملف نصي بسيط اسمه policy.txt.


import os
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

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

# 1. تحميل المستند
loader = TextLoader("./policy.txt")
documents = loader.load()

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

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

# 4. إعداد سلسلة الاسترجاع والتوليد (RAG Chain)
qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(temperature=0), 
    chain_type="stuff", 
    retriever=vectorstore.as_retriever()
)

# 5. طرح السؤال
query = "ما هي سياسة العمل عن بعد؟"
response = qa.invoke(query)

print(response['result'])

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

نصائح أبو عمر الذهبية لتطبيق RAG ناجح

من واقع التجربة، هذه بعض النصائح اللي بتفرق جداً في جودة نظام RAG تبعك:

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

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

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

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

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

أبو عمر

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

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

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

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

آخر المدونات

أتمتة العمليات

خوادمنا كانت نسخًا مشوهة: كيف أنقذتنا ‘البنية التحتية كشيفرة’ (IaC) من جحيم الانحراف التكويني؟

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

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

بياناتي كانت تتغير من حيث لا أدري: كيف أنقذتني ‘اللامتغيرية’ (Immutability) من جحيم الآثار الجانبية الخفية؟

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

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

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

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

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

ميزانيتنا كانت تحترق: كيف أنقذتنا ‘نماذج الإحالة’ (Attribution Models) من جحيم تخمين القنوات الرابحة؟

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

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

من فوضى المكونات إلى نظام التصميم المتكامل: قصتنا لإنقاذ واجهات المستخدم من جحيم التضارب

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

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