روبوت الدردشة لدينا كان كاذبًا محترفًا: كيف أنقذتنا قواعد البيانات المتجهية و 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 وقواعد البيانات المتجهية هي تلك “اليد الماهرة” التي تمسك بالسكين وتوجهه ليقطع في المكان الصحيح فقط.

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

أبو عمر

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

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

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

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

آخر المدونات

التكنلوجيا المالية 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 قراءة المزيد
البودكاست