يا جماعة الخير، السلام عليكم ورحمة الله وبركاته. معكم أخوكم أبو عمر.
قبل فترة، كنا شغالين على مشروع كبير لمتجر إلكتروني ضخم، فيه آلاف المنتجات. الفريق كله كان مبسوط، والتصميم كان “آخر طراز”، والبرمجة الخلفية كانت متينة. وصلنا لمرحلة البحث، وهنا بدأت المشاكل اللي ما كانت في الحسبان.
المستخدم يكتب في مربع البحث “حذاء رياضي مريح للمشي الطويل”، والنتائج اللي تطلعله؟ صندل بحر، حذاء كعب عالي، وأحيانًا جوارب! كان الوضع كارثيًا. العميل يتصل معصّب، ويقول بلهجته الشامية الظريفة: “أبو عمر شبكون يا زلمة؟ عم دور على كندرة رياضة بيطلعلي شحاطة؟ شو هالحكي هاد؟”.
قعدنا مع الفريق، نحلل المشكلة. الكود سليم، والاستعلامات على قاعدة البيانات شغالة 100%. المشكلة ما كانت في البرمجة، المشكلة كانت في “الفهم”. نظام البحث تبعنا كان غبيًا، بكل ما تحمله الكلمة من معنى. كان يبحث عن كلمة “حذاء”، وكلمة “رياضي”، وكلمة “مشي”، ويجلب أي منتج يحتوي على أي من هذه الكلمات. لم يكن يفهم أن المستخدم يبحث عن *مفهوم* أو *غاية*، وليس عن كلمات متناثرة.
في تلك اللحظة من الإحباط، تذكرت شيئًا كنت أقرأ عنه في أبحاث الذكاء الاصطناعي… شيء اسمه “المتجهات” و”البحث الدلالي”. كانت تلك هي بداية الخيط الذي أنقذنا من جحيم النتائج غير ذات الصلة، ودخلنا معه عالم قواعد بيانات المتجهات.
ما هو الخطأ في البحث التقليدي؟
قبل أن نغوص في الحل، دعونا نفهم أصل المشكلة. معظم أنظمة البحث التقليدية، حتى التي تستخدم محركات قوية مثل Elasticsearch في إعداداتها الأساسية، تعتمد على مطابقة الكلمات المفتاحية. هذا النهج، المعروف بـ (Keyword-based search)، له قيود قاتلة:
- المرادفات (Synonyms): المستخدم قد يبحث عن “جوال” والنظام لا يفهم أن “هاتف ذكي” أو “موبايل” هي نفس الشيء.
- السياق (Context): كلمة “عين” في جملة “شربت من عين الماء” تختلف تمامًا عن “آلمتني عيني”. البحث التقليدي لا يفرق بينهما.
- النية (Intent): كما في قصتنا، المستخدم الذي يبحث عن “حذاء مريح للمشي” لا يريد أي حذاء، بل يريد منتجًا يحل له مشكلة التعب أثناء المشي. نيته هي “الراحة أثناء الحركة”.
ببساطة، البحث التقليدي أعمى عن المعنى. إنه مثل أمين مكتبة يجد لك الكتب التي تحتوي على كلمة “سعادة” في عنوانها، ولكنه يعجز عن إعطائك رواية تجعلك سعيدًا حقًا إذا لم تكن الكلمة مذكورة صراحة.
الدخول إلى عالم “المتجهات” (Embeddings): ترجمة المعاني إلى أرقام
هنا يأتي دور الذكاء الاصطناعي ليحل هذه المعضلة. ظهر مفهوم مذهل يسمى “تضمين الكلمات” أو “Embeddings”. الفكرة عبقرية في بساطتها: ماذا لو استطعنا تحويل أي قطعة نص (كلمة، جملة، فقرة كاملة) إلى قائمة من الأرقام تسمى “متجه” (Vector)؟
هذا ليس مجرد تحويل عشوائي. تقوم نماذج الذكاء الاصطناعي اللغوية (مثل BERT ومشتقاته) التي تدربت على مليارات النصوص بفهم العلاقات الدقيقة بين الكلمات. وعندما تحول النص إلى متجه، فإنها تضع النصوص ذات المعاني المتقاربة في “أماكن” متجاورة داخل فضاء رياضي هائل متعدد الأبعاد.
كيف يتم ذلك؟
تخيل خريطة عملاقة. في هذه الخريطة، كل كلمة أو جملة لها إحداثيات (هذا هو المتجه). ستجد أن:
- متجه جملة “أفضل هاتف للتصوير” قريب جدًا من متجه “جوال بكاميرا ممتازة”.
- متجه كلمة “ملك” قريب من متجه كلمة “ملكة”.
- المسافة والاتجاه بين “رجل” و”امرأة” تشبه إلى حد كبير المسافة والاتجاه بين “ملك” و”ملكة”.
هذه المتجهات الرقمية هي “بصمة المعنى” للنص. الآن، بدلاً من البحث عن الكلمات، يمكننا البحث عن “المعاني المتقاربة” عن طريق إيجاد المتجهات الأقرب لمتجه بحث المستخدم.
قواعد بيانات المتجهات (Vector Databases): الفهرس الجديد للمعاني
حسنًا، لدينا الآن طريقة لتحويل نصوصنا (أسماء المنتجات، وصفها، مراجعات المستخدمين) إلى متجهات. ولدينا طريقة لتحويل استعلام بحث المستخدم إلى متجه أيضًا. السؤال الآن: كيف نبحث بكفاءة؟
إذا كان لديك مليون منتج، يعني مليون متجه. هل يعقل أن نقوم بحساب المسافة بين متجه البحث وكل متجه من المليون في كل مرة؟ هذا سيكون بطيئًا جدًا وغير عملي على الإطلاق. “بدها دهر لترجع النتيجة يا خوي!”.
وهنا يأتي دور البطل الحقيقي في قصتنا: قواعد بيانات المتجهات (Vector Databases).
ما هي بالضبط؟
هي نوع جديد من قواعد البيانات مصمم خصيصًا لتخزين كميات هائلة من المتجهات والبحث فيها بسرعة فائقة. هي لا تقوم بالبحث الخطي الغبي، بل تستخدم خوارزميات فهرسة ذكية (مثل HNSW, IVF) لإنشاء ما يشبه “خريطة طرق” داخل فضاء المتجهات.
عندما يأتي متجه بحث جديد، تعرف قاعدة البيانات هذه أين “تبدأ” البحث في أي حي من الأحياء المتقاربة، وتجد لك أقرب الجيران (أقرب المتجهات) في أجزاء من الثانية، حتى لو كان لديك ملايين أو مليارات المتجهات.
أشهر الأمثلة على هذه القواعد: Pinecone, Weaviate, Milvus, ChromaDB.
مثال عملي بالكود: من نص إلى بحث دلالي
دعونا نرى مثالاً بسيطًا باستخدام لغة Python ومكتبتين رائعتين: sentence-transformers لتوليد المتجهات، و chromadb كقاعدة بيانات متجهات بسيطة تعمل محليًا.
تنبيه: سأستخدم نموذجًا يدعم اللغة الإنجليزية في هذا المثال لسهولة التنفيذ، لكن نفس المبدأ ينطبق 100% على النماذج العربية متعددة اللغات.
# الخطوة الأولى: تثبيت المكتبات اللازمة
# pip install sentence-transformers chromadb
from sentence_transformers import SentenceTransformer
import chromadb
# الخطوة الثانية: تحميل نموذج لغوي لتحويل النصوص إلى متجهات
# 'paraphrase-multilingual-MiniLM-L12-v2' هو خيار جيد للمحتوى متعدد اللغات بما فيه العربي
model = SentenceTransformer('all-MiniLM-L6-v2')
# لنفترض أن هذه هي بيانات المنتجات في متجرنا
documents = [
"Comfortable running shoes for long distance",
"Stylish high-heels for parties",
"Waterproof boots for hiking",
"Lightweight sneakers for daily walk",
"Elegant leather shoes for business meetings"
]
# الخطوة الثالثة: تحويل النصوص إلى متجهات (Embeddings)
embeddings = model.encode(documents)
# الخطوة الرابعة: إعداد قاعدة بيانات المتجهات وتخزين البيانات
client = chromadb.Client()
collection = client.create_collection("products")
collection.add(
embeddings=embeddings,
documents=documents,
ids=[f"id{i}" for i in range(len(documents))] # كل متجه يجب أن يكون له ID فريد
)
# --- الآن، الجزء الممتع: البحث ---
# الخطوة الخامسة: المستخدم يبحث عن شيء ما
query = "what can I wear for a morning jog?"
# تحويل استعلام البحث إلى متجه
query_embedding = model.encode([query])[0]
# الخطوة السادسة: البحث في قاعدة البيانات عن أقرب متجهين
results = collection.query(
query_embeddings=[query_embedding.tolist()], # بعض المكتبات تتطلب تحويلها إلى قائمة
n_results=2
)
# طباعة النتائج
print("نتائج البحث الدلالي:")
for doc in results['documents'][0]:
print(f"- {doc}")
عند تشغيل هذا الكود، ستكون النتيجة المتوقعة:
نتائج البحث الدلالي:
- Comfortable running shoes for long distance
- Lightweight sneakers for daily walk
لاحظ كيف فهم النظام أن “morning jog” (هرولة صباحية) قريبة في المعنى من “running” (جري) و “daily walk” (مشي يومي)، وتجاهل تمامًا الكعب العالي وأحذية العمل. هذا هو سحر البحث الدلالي!
نصائح أبو عمر الذهبية للعمل مع المتجهات
بعد خوض هذه التجربة وتجارب أخرى، تعلمت بعض الدروس التي أحب أن أشاركها معكم:
- اختر النموذج المناسب (Choose the right model): ليست كل نماذج التضمين (Embedding Models) متساوية. هناك نماذج متخصصة للجمل القصيرة، وأخرى للوثائق الطويلة. الأهم من ذلك، إذا كان محتواك عربيًا، تأكد من استخدام نموذج متعدد اللغات (Multilingual) مثل
paraphrase-multilingual-MiniLM-L12-v2أو نماذج أحدث. - لا تنسَ البيانات الوصفية (Metadata is your friend): البحث الدلالي قوي، لكنه ليس كل شيء. قد يرغب المستخدم في البحث عن “ملابس شتوية” (بحث دلالي) ولكن بشرط أن يكون السعر أقل من 50 دولارًا واللون “أزرق” (بحث تقليدي). معظم قواعد بيانات المتجهات تسمح لك بإضافة “بيانات وصفية” (Metadata) مع المتجهات، وتصفية النتائج بناءً عليها. هذا المزيج هو سر الأنظمة القوية.
- ابدأ بسيطًا ومحليًا: قبل أن تدفع اشتراكًا شهريًا في خدمة سحابية مثل Pinecone، جرب الأدوات مفتوحة المصدر التي تعمل على جهازك مثل
ChromaDBأو مكتبة فيسبوكFAISS. افهم المبدأ أولاً، ثم انتقل للحلول الأكبر. مش من أولها تدفع مصاري، جرب ببلاش بالأول يا خوي. - البحث الهجين (Hybrid Search): في بعض الحالات، لا يزال البحث بالكلمات المفتاحية مهمًا (مثل البحث عن رقم موديل منتج معين SKU). النهج الأقوى هو “البحث الهجين” الذي يجمع بين نتائج البحث الدلالي (لفهم المعنى) ونتائج البحث بالكلمات المفتاحية (للدقة في التطابق)، ثم يعيد ترتيبها ليعطي أفضل نتيجة ممكنة.
الخلاصة: لم يعد البحث أعمى 🎯
رحلتنا من البحث بالكلمات إلى البحث بالمعنى كانت نقلة نوعية. قواعد بيانات المتجهات لم تحل لنا مشكلة تقنية فقط، بل غيرت فلسفة تفاعل المستخدم مع أنظمتنا. أصبحنا نبني تطبيقات “تستمع” إلى نية المستخدم، لا إلى كلماته فقط.
هذه التقنية ليست حكرًا على البحث. إنها أساس أنظمة التوصية (مثل نتفليكس ويوتيوب)، واكتشاف الاحتيال، وتصنيف النصوص، وأكثر من ذلك بكثير.
نصيحتي الأخيرة لك: لا تخف من المصطلحات الجديدة. كل قصة الذكاء الاصطناعي هذه مبنية على فكرة بسيطة: كيف نجعل الكمبيوتر يفهمنا كما نفهم بعضنا البعض. وقواعد بيانات المتجهات هي خطوة جبارة في هذا الطريق. ابدأ اليوم، جرب الكود، وافتح الباب لعالم جديد من التطبيقات الذكية.
وفقكم الله، والسلام عليكم.