يا جماعة الخير، السلام عليكم ورحمة الله.
خلوني أحكيلكم هالسيرة اللي صارت معي قبل فترة مش بعيدة. كان عندي مشروع لعميل، شركة محترمة عندها كمية وثائق داخلية ومقالات دعم فني “ما إلها أول من آخر”، يعني أرشيف ضخم جدًا. المشكلة الكبيرة كانت إنه الموظفين الجداد، وحتى القدامى أحيانًا، كانوا “بتوهوا” وهم يدوروا على معلومة. نظام البحث اللي عندهم كان تقليدي جدًا، يعني لازم تكتب الكلمة المفتاحية بالحرف عشان تلاقي إشي.
بتذكر مرة موظف جديد كان بده يلاقي وثيقة عن “كيفية التعامل مع شكاوى العملاء الغاضبين”. هو شو كتب في البحث؟ كتب “الزبون معصب شو أعمل؟”. طبعًا النظام رجّعله صفر نتائج! ولا إشي! قعد يومين كاملين وهو يدور ويسأل زملائه، وفي الآخر لقى الوثيقة بالصدفة وكان عنوانها الرسمي “إجراءات إدارة اعتراضات العملاء”. شفتوا الورطة؟ الشب كان بده المعنى، بس النظام ما بفهم غير الكلمات الحرفية. وقتها حسيت إنه بحثنا عن المعنى أعمى، وبنمشي في عتمة الكلمات المفتاحية.
هنا بدأت رحلتي مع عالم كان جديد عليّ وقتها بشكل عملي: عالم الـ Embeddings وقواعد بيانات المتجهات. وهي القصة اللي جاي أحكيلكم إياها اليوم.
الجحيم القديم: سجن الكلمات المفتاحية
قبل ما نطلع على الحل، خلينا نفهم أصل المشكلة. أنظمة البحث التقليدية، اللي أغلبنا تعودنا عليها، بتشتغل بطريقة بسيطة ومحدودة جدًا. ممكن نلخصها في خطوات:
- تقطيع النص (Tokenization): تحويل الجمل إلى كلمات منفصلة.
- المعالجة (Processing): مثل إزالة كلمات التوقف (like “a”, “the”, “in”) وإرجاع الكلمات لأصلها (Stemming/Lemmatization).
- الفهرسة (Indexing): إنشاء فهرس ضخم يربط كل كلمة بالوثائق اللي ظهرت فيها.
لما تبحث عن “سيارة سريعة”، النظام بروح على الفهرس، بجيب كل الوثائق اللي فيها كلمة “سيارة” وكل الوثائق اللي فيها كلمة “سريعة”، وبحاول يلاقي تقاطع بينهم. المشكلة إنه هالنظام “أصم” و “أعمى” عن المعنى:
- ما بفهم المرادفات: لو بحثت عن “سيارة” ما رح يلاقي وثيقة بتحكي عن “مركبة”.
- ما بفهم السياق: جملة “apple a day keeps the doctor away” وجملة “I love my new Apple phone” بالنسبة إله نفس الكلمة “Apple”.
- ما بفهم القصد: زي ما صار مع صاحبنا اللي بحث عن “الزبون معصب”. النظام ما عنده فكرة إنه هاي الجملة مرتبطة بمفهوم “إدارة اعتراضات العملاء”.
كنا حرفيًا في سجن، بنحاول نعبر عن أفكار معقدة باستخدام أدوات بدائية جدًا.
الفجر الجديد: البحث الدلالي و “تضمينات المتجهات” (Embeddings)
الحل كان في تغيير طريقة تفكيرنا كلها. بدل ما نتعامل مع الكلمات كنصوص جامدة، شو رأيكم لو قدرنا نحولها لأرقام… أرقام بتفهم المعنى؟ هاد هو بالضبط اللي بتعمله الـ Embeddings.
شو هي الـ Embeddings بالعربي المشبرح؟
تخيل معي خريطة كبيرة. على هاي الخريطة، كل كلمة أو جملة هي نقطة. الكلمات اللي معانيها قريبة من بعض بتكون قريبة من بعض على الخريطة، والكلمات البعيدة عن بعض بالمعنى بتكون بعيدة على الخريطة.
- كلمة “ملك” رح تكون قريبة من كلمة “ملكة” و “أمير”.
- كلمة “تفاحة” رح تكون قريبة من “برتقالة” و “موز”.
- لكن كلمة “ملك” رح تكون بعيدة جدًا عن كلمة “تفاحة”.
الأجمل من هيك، إنه العلاقات بين الكلمات بتصير عمليات رياضية. مثلًا، المسافة والاتجاه من “ملك” إلى “ملكة” ممكن تكون نفس المسافة والاتجاه من “رجل” إلى “امرأة”. إشي بخوّف، صح؟
هاي النقاط على الخريطة هي عبارة عن “متجهات” (Vectors)، وهي مجرد قائمة من الأرقام (مثلاً 768 رقم) بتمثل إحداثيات الكلمة أو الجملة في “فضاء المعنى” هاد. العملية اللي بتحول النص لهاي الأرقام اسمها “Embedding”.
كيف بنحصل على هاي الـ Embeddings؟
هون بيجي دور نماذج الذكاء الاصطناعي الضخمة (LLMs). نماذج مثل BERT، GPT، أو نماذج متخصصة زي اللي في مكتبة sentence-transformers، تدربت على مليارات النصوص من الإنترنت. ومن خلال هاد التدريب، تعلمت “تحس” بالمعنى والعلاقات بين الكلمات. لما نعطيها جملة، هي بتعطينا بالمقابل “المتجه” اللي بمثل معنى هاي الجملة.
المستودع الجديد للمعنى: قواعد بيانات المتجهات (Vector Databases)
طيب يا أبو عمر، صار عنا متجهات لكل وثائقنا. وين نخزنها؟ ممكن واحد يقول: “بسيطة، بنحطها في حقل في قاعدة بيانات PostgreSQL أو MySQL”.
هون بتيجي المشكلة الثانية. البحث في عالم المتجهات مش زي البحث العادي. إحنا ما بنبحث عن قيمة مطابقة 100%. إحنا بنبحث عن “أقرب الجيران” (Nearest Neighbors). يعني لما المستخدم يبحث، بنحول سؤاله لمتجه، وبعدين بنروح ندور على أقرب المتجهات إله في قاعدة البيانات.
لو عندك آلاف أو ملايين المتجهات، وكل متجه فيه مئات الأبعاد (الأرقام)، عملية البحث هاي في قاعدة بيانات تقليدية رح تكون بطيئة جدًا جدًا. رح تضطر تقارن متجه البحث مع كل متجه في القاعدة، وهذا إشي مستحيل عمليًا.
وهنا يكمن سحر قواعد بيانات المتجهات
قواعد البيانات المتخصصة هاي زي (Pinecone, Weaviate, ChromaDB, Qdrant) مصممة لهدف واحد: تخزين والبحث في كميات هائلة من المتجهات بسرعة البرق. هي بتستخدم خوارزميات فهرسة ذكية (مثل HNSW) اللي بتعمل زي اختصارات على خريطة المعنى. بدل ما تدور في الخريطة كلها، هي بتقفز مباشرة للمنطقة اللي فيها المعاني المشابهة وبتبحث هناك.
هيك، بدل ما البحث ياخذ دقائق، بصير ياخذ أجزاء من الثانية، حتى لو عندك ملايين الوثائق.
يلا نطبق عملي: من الكود إلى النتيجة
الحكي النظري حلو، بس خلينا نشوف إشي عملي. رح أفرجيكم مثال بسيط بلغة Python كيف ممكن نعمل نظام بحث دلالي صغير.
رح نستخدم مكتبة sentence-transformers عشان نعمل الـ Embeddings، ومكتبة faiss (من فيسبوك) كقاعدة بيانات متجهات بسيطة في الذاكرة.
# أولاً، نثبت المكتبات اللازمة
# pip install sentence-transformers faiss-cpu
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# 1. جهّز النموذج اللي رح يحول النص لمتجهات
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 2. جهّز الوثائق اللي بدنا نبحث فيها (زي اللي كانت عند العميل)
documents = [
"إجراءات إدارة اعتراضات العملاء",
"سياسة الإجازات السنوية للموظفين",
"دليل استخدام الطابعة الجديدة في المكتب",
"كيفية التعامل مع شكاوى العملاء الغاضبين"
]
# 3. حوّل الوثائق لمتجهات (Embeddings)
doc_embeddings = model.encode(documents)
# 4. ابنِ قاعدة بيانات المتجهات (الفهرس)
# البعد تبع المتجه هو 384 لهذا النموذج تحديدًا
d = doc_embeddings.shape[1]
index = faiss.IndexFlatL2(d)
index.add(doc_embeddings)
print(f"تمت فهرسة {index.ntotal} وثيقة.")
# 5. الآن، لنجرب البحث!
query = "الزبون معصب شو أعمل؟"
query_embedding = model.encode([query])
# ابحث عن أقرب 2 جيران
k = 2
distances, indices = index.search(query_embedding, k)
# 6. اعرض النتائج
print(f"nالبحث عن: '{query}'")
print("أفضل النتائج هي:")
for i in indices[0]:
print(f"- {documents[i]}")
لما تشغل هاد الكود، شو رح تكون النتيجة؟
تمت فهرسة 4 وثيقة.
البحث عن: 'الزبون معصب شو أعمل؟'
أفضل النتائج هي:
- كيفية التعامل مع شكاوى العملاء الغاضبين
- إجراءات إدارة اعتراضات العملاء
شفتوا السحر؟ مع إن كلمة “زبون” أو “معصب” مش موجودة في جملة “إجراءات إدارة اعتراضات العملاء”، لكن النظام فهم إن المعنى واحد! هاي هي قوة البحث الدلالي. لقد أنقذنا الموظف الجديد من يومين ضياع! 🥳
الصورة الأكبر: RAG والمستقبل
هذا المفهوم هو أساس ثورة الذكاء الاصطناعي الحالية اللي اسمها RAG (Retrieval-Augmented Generation).
الفكرة ببساطة: بدل ما نسأل الـ LLM (زي ChatGPT) سؤال ويجاوب من معلوماته العامة اللي ممكن تكون قديمة أو غلط، بنعمل الآتي:
- بحث دلالي (Retrieval): لما المستخدم يسأل سؤال، بنستخدم البحث الدلالي (زي ما عملنا فوق) عشان نلاقي الوثائق الأكثر صلة من قاعدة بياناتنا الخاصة (وثائق الشركة، الكتب، المقالات).
- توليد معزز (Augmented Generation): بنأخذ هاي الوثائق اللي لقيناها، وبنعطيها للـ LLM مع السؤال الأصلي، وبنقوله: “يا شاطر، جاوب على هذا السؤال باستخدام هاي المعلومات تحديدًا”.
هيك بنكون ضربنا عصفورين بحجر: حصلنا على قوة الـ LLM في فهم اللغة وتلخيصها، وضمنّا إنه الإجابات دقيقة ومبنية على مصادرنا الموثوقة.
نصيحة أبو عمر 🧔
لما تبدأ مشروع فيه بحث دلالي، لا تركض وراء أحدث وأعقد قاعدة بيانات. ابدأ ببساطة. استخدم مكتبة مثل ChromaDB أو FAISS اللي بتشتغل على جهازك. جرب، افهم المبدأ، شوف النتائج بعينك. لما يكبر مشروعك وتحتاج أداء أعلى، وقتها فكر بالحلول السحابية مثل Pinecone أو Weaviate. ابدأ صغيرًا، ثم توسّع.
الخلاصة: من البحث الأعمى إلى الرؤية الواضحة
الرحلة من البحث بالكلمات المفتاحية للبحث الدلالي هي نقلة نوعية. هي الفرق بين إنك تسأل أمين مكتبة ما بفهم غير عناوين الكتب حرفيًا، وبين إنك تسأل خبير بفهم قصدك وبوجهك للمعلومة الصح حتى لو استخدمت كلمات مختلفة.
قواعد بيانات المتجهات والـ Embeddings مش مجرد تقنية جديدة، هي فلسفة جديدة في التعامل مع البيانات. فلسفة بتقول إن المعنى أهم من الكلمة، والسياق أهم من النص الحرفي. هي اللي حررتنا من سجن الكلمات المفتاحية وفتحت عيون أنظمتنا على عالم المعاني الواسع.
نصيحتي الأخيرة إلكم: لا تخافوا من هاي المفاهيم. تبدو معقدة في البداية، لكنها في جوهرها بسيطة وقوية جدًا. ابدأوا بتجربة الكود اللي حطيته، اقرأوا أكثر، وشوفوا كيف ممكن تطبقوا هاي القوة في مشاريعكم. يلا، شدوا حيلكم! 💪