روبوت الدردشة لدينا كان كاذبًا محترفًا: كيف أنقذتنا قواعد البيانات المتجهية و RAG من جحيم الهلوسة؟

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

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

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

يومها رن علي مدير الشركة معصّب، وبصوت عالي حكالي: “شو هالحكي يا أبو عمر؟ الروبوت اللي عندكم نصّاب محترف! قاعد بخترع سياسات على كيفه وبخرب بيتنا!”. الحق معه، الموقف كان لا يُحسد عليه. الروبوت تبعنا تحول من مساعد ذكي إلى “كذاب” محترف، أو بلغة أهل الاختصاص، كان بعاني من “هلوسة معرفية” (Cognitive Hallucination) حادة.

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

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

قبل ما نحكي عن الحل، لازم نفهم أصل المشكلة. ليش أصلاً النماذج اللغوية مثل GPT وغيرها “تكذب” أو “تهلوس”؟

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

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

الحل السحري؟ لا، بل هندسة ذكية: لنتحدث عن “قواعد البيانات المتجهية”

طيب، كيف ممكن نجبر النموذج اللغوي إنه يقرأ من “كتابنا” المخصص قبل ما يجاوب؟ هنا يأتي دور قواعد البيانات المتجهية (Vector Databases).

ما هي “المتجهات” (Vectors) في عالم الذكاء الاصطناعي؟

انسوا كل المصطلحات المعقدة. فكر في “المتجه” أو (Embedding) على أنه بصمة رقمية للمعنى. باستخدام نماذج متخصصة، يمكننا تحويل أي نص (كلمة، جملة، فقرة) إلى سلسلة من الأرقام، مثل [0.12, -0.45, 0.88, …].

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

وكيف تعمل قواعد البيانات المتجهية؟

قاعدة البيانات التقليدية (مثل SQL) تبحث عن تطابق كامل أو جزئي للكلمات. لو بحثت عن “سياسة الإرجاع” ستجد لك المستندات التي تحتوي على هذه الكلمة بالضبط.

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

الطبق الرئيسي: RAG (Retrieval-Augmented Generation) – ربط الذاكرة بالذكاء

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

الخطوة الأولى: الاسترجاع (Retrieval) – “هات من الآخر يا عمي”

  1. سؤال المستخدم: المستخدم يسأل الشات بوت: “هل يمكنني إرجاع منتج عليه خصم؟”.
  2. التحويل إلى متجه: نقوم بتحويل سؤال المستخدم إلى متجه (بصمة رقمية).
  3. البحث في الذاكرة: نستخدم هذا المتجه للبحث في قاعدة البيانات المتجهية الخاصة بنا (التي تحتوي على كل وثائق الشركة: سياسات، كتالوجات منتجات، مقالات دعم فني، إلخ).
  4. الحصول على السياق: قاعدة البيانات تعيد لنا أفضل 3-5 فقرات الأكثر صلة بمعنى السؤال. مثلاً، قد تعيد لنا فقرة تقول: “المنتجات المخفضة التي تم شراؤها خلال فترة التنزيلات النهائية غير قابلة للإرجاع أو الاستبدال”.

الخطوة الثانية: التوليد المعزز (Augmented Generation) – “هيك الحكي الصح”

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

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

السياق المسترجع:
“[…المنتجات المخفضة التي تم شراؤها خلال فترة التنزيلات النهائية غير قابلة للإرجاع أو الاستبدال…]”

سؤال المستخدم:
“هل يمكنني إرجاع منتج عليه خصم؟”

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

يلا نشتغل: مثال عملي بسيط باستخدام Python

الكلام النظري جميل، لكن خلينا نشوف كيف ممكن نطبق هذا بشكل عملي. سنستخدم مكتبة langchain الشهيرة مع قاعدة بيانات متجهية محلية بسيطة (FAISS) ونموذج تحويل (Embedding model) مجاني.


# أولاً، قم بتثبيت المكتبات اللازمة
# pip install langchain langchain-community langchain-openai faiss-cpu sentence-transformers

import os
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_openai import OpenAI

# إعداد مفتاح OpenAI API (يمكن استبداله بنماذج مفتوحة المصدر)
# os.environ["OPENAI_API_KEY"] = "sk-..."

# 1. تجهيز مصدر المعلومات (المعرفة الخاصة بنا)
# في الواقع، هذا سيكون ملف PDF أو موقع ويب، لكن هنا سنستخدم نص بسيط
knowledge_base_text = """
سياسة الإرجاع في شركة "متجرنا"
- يمكن إرجاع المنتجات خلال 14 يوماً من تاريخ الشراء.
- يجب أن يكون المنتج في حالته الأصلية وغير مستخدم.
- المنتجات التي عليها خصم 50% أو أكثر تعتبر بيع نهائي ولا يمكن إرجاعها.
- لإتمام عملية الإرجاع، يرجى التواصل مع خدمة العملاء مع فاتورة الشراء.
"""

# 2. تقسيم النص إلى أجزاء (Chunks)
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(knowledge_base_text)

# 3. إنشاء "المتجهات" وتخزينها في قاعدة بيانات متجهية
# سنستخدم نموذج تحويل مجاني ومشهور
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")

# FAISS هي قاعدة بيانات متجهية بسيطة تعمل في الذاكرة
vectorstore = FAISS.from_texts(texts, embeddings)
print("تم إنشاء قاعدة البيانات المتجهية بنجاح!")

# 4. إعداد سلسلة RAG
# نحدد "المسترجع" (Retriever) الذي سيبحث في قاعدة البيانات المتجهية
retriever = vectorstore.as_retriever()
# نحدد النموذج اللغوي الذي سيقوم بتوليد الإجابة النهائية
llm = OpenAI()

# نجمع كل شيء في سلسلة RetrievalQA
rag_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff", # "stuff" تعني وضع كل النصوص المسترجعة في الـ prompt
    retriever=retriever
)

# 5. طرح الأسئلة!
question1 = "كم يوم معي عشان أرجع منتج؟"
answer1 = rag_chain.invoke(question1)
print(f"س: {question1}")
print(f"ج: {answer1['result']}")

question2 = "اشتريت بلوزة عليها خصم 60%، بقدر أرجعها؟"
answer2 = rag_chain.invoke(question2)
print(f"س: {question2}")
print(f"ج: {answer2['result']}")

نصائح من قلب الميدان (من أبو عمر إلكم)

  • تقسيم البيانات (Chunking) فن مش عن عن: طريقة تقسيمك لوثائقك إلى “قطع” صغيرة (Chunks) تؤثر بشكل مباشر على جودة البحث. لا تقسم في منتصف الجملة. جرب التقسيم بناءً على الفقرات أو العناوين. حجم القطعة مهم جداً، لا صغير جداً فيضيع المعنى، ولا كبير جداً فيحتوي على معلومات غير ضرورية.
  • اختر نموذج التحويل (Embedding Model) الصح: النماذج تختلف. هناك نماذج أفضل للغة العربية، ونماذج أفضل للمصطلحات التقنية. جرب نماذج مختلفة وشوف أيها يعطي أفضل نتائج لاسترجاع المعلومات في مجالك.
  • الهندسة الفورية (Prompt Engineering) هي بهارات الطبخة: الـ “Prompt” الذي أريتكم إياه في المثال هو أساسي. كن واضحاً جداً في تعليماتك للنموذج اللغوي. أمره بأن يلتزم بالسياق، وأن يعتذر إذا لم يجد الإجابة. هذا يقلل من الهلوسة بنسبة 99%.
  • لا تنسى الحلول الهجينة: أحياناً، أفضل حل هو البحث التقليدي بالكلمات المفتاحية (Keyword search) مع البحث بالمتجهات (Vector search). هذا يضمن أنك لن تفوت أي مستند يحتوي على الكلمة المفتاحية الدقيقة التي يبحث عنها المستخدم.

الخلاصة: من كاذب محترف إلى مساعد موثوق 🤝

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

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

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

أبو عمر

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

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

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

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

آخر المدونات

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

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

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

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

من كارثة توصيات الطرق إلى سحر ‘دكسترا’: كيف أنقذتنا الخوارزميات من جحيم المسارات غير المثالية

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

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

صفحاتنا المقصودة كانت مقبرة للزوار: كيف أنقذتنا ‘اختبارات أ/ب’ من جحيم معدلات التحويل المنخفضة؟

أشارككم قصة حقيقية من قلب المعركة التقنية، كيف كانت صفحات الهبوط لمشروعنا تتسبب في هروب الزوار، وكيف استخدمنا منهجية اختبارات أ/ب (A/B Testing) البسيطة لتحويل...

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

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

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

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

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

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

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

القفص الذهبي: كيف حررتنا استراتيجية السحابة المتعددة (Multi-Cloud) من جحيم الاحتكار التقني؟

أروي لكم قصة كيف وقعنا في فخ "القفص الذهبي" لمزود سحابي واحد، وكيف كانت استراتيجية السحابة المتعددة (Multi-Cloud) طوق النجاة الذي منحنا الحرية والمرونة. هذه...

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

مشاريعي كانت سجينة جهازي: كيف أنقذتني ‘المساهمة في المصادر المفتوحة’ من جحيم المبرمج المجهول؟

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

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