لو عندك موقع محتوى عربي والمستخدم بيدوّر على "ازاي أصغّر Docker image" وبيرجعله صفر نتايج لأن المقال عندك عنوانه "تقليل حجم الكونتينر"، المشكلة مش في الموقع. المشكلة إنك لسه شغّال بـ keyword search. الـ Embeddings بتحلّ ده في 20 سطر كود، وهنشرحها هنا من الصفر بمثال مش هتنساه، وبعدين نرجع للتعريف العلمي الدقيق.
الـ Embeddings بالعربي: إزاي الـ AI بيفهم معنى الكلام فعلاً
المشكلة باختصار
البحث التقليدي (LIKE في SQL، أو Full-Text Search في Postgres) بيقارن الحروف. كلمة "سيارة" عنده مش بتماثل "عربية". كلمة "بطيء" مش بتماثل "lag". لو محتواك عربي ومستخدمينك بيكتبوا بخليط عربي إنجليزي، نسبة الاستعلامات اللي ترجع صفر نتايج بتوصل لـ 60% بسهولة. الـ Embeddings بتقارن المعنى نفسه، مش الحروف.
المثال اللي هيخلّي الفكرة تثبت في دماغك
تخيّل إنك ماسك خريطة مدينة كبيرة. كل كلمة عربية ليها مبنى على الخريطة دي. "قطة" و"كلب" مبانيهم قريبين من بعض لأنهم حيوانات أليفة. "قطة" و"طيّارة" بعاد جداً عن بعض. "ملك" و"ملكة" قريبين. وأحلى حاجة: لو قسمت المسافة بين "ملك" و"رجل"، وزوّدتها على "امرأة"، هتلاقي نفسك قريب جداً من "ملكة". ده مش سحر، ده تلخيص فعلي للي بيحصل جوّا الموديل.
الخريطة دي مش من بُعدين زي خرايط Google. هي من 768 بُعد، أو 1536، أو 3072. يعني بدل نقطة بإحداثيَّين (س، ص)، كل كلمة عندها 1536 رقم عشري. مجموعة الأرقام دي اسمها "Embedding" للكلمة. والأرقام دي مش عشوائية — الموديل اتدرّب على بلايين الجمل عشان يحطّ الكلام المتشابه قريب من بعض.
التعريف العلمي الدقيق
الـ Embedding هو تمثيل عددي (vector) لنص، حجمه ثابت ومحدد مسبقاً من الموديل (مثلاً 1536 بُعد في text-embedding-3-small)، وبيتنتج من شبكة عصبية مدرّبة بتقنية contrastive learning أو masked language modeling. الهدف من التدريب: النصوص المتقاربة دلالياً (semantically similar) تنتج vectors متقاربة رياضياً.
بنقيس التقارب ده بمقياس اسمه Cosine Similarity. الناتج رقم من -1 لـ 1. قيمة 1 يعني نفس المعنى تماماً، صفر يعني مفيش علاقة، و-1 يعني معنى عكسي. في الواقع، معظم الاستعلامات العملية بتتراوح بين 0.3 و 0.9.
الكود اللي بيوضّح كل حاجة في 15 سطر
المثال ده بيقارن 4 جمل عربية واستعلام مستخدم. استخدمنا مكتبة sentence-transformers لأنها مفتوحة المصدر وشغّالة offline بدون API costs:
# pip install sentence-transformers torch
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("intfloat/multilingual-e5-base")
docs = [
"ازاي أصغّر Docker image بتاعي",
"تقليل حجم الكونتينر خطوة بخطوة",
"طريقة عمل الكشري المصري",
"Docker image optimization tips"
]
query = "تقليل حجم الـ container"
doc_emb = model.encode(docs, convert_to_tensor=True, normalize_embeddings=True)
q_emb = model.encode(query, convert_to_tensor=True, normalize_embeddings=True)
scores = util.cos_sim(q_emb, doc_emb)[0]
for score, doc in sorted(zip(scores.tolist(), docs), reverse=True):
print(f"{score:.3f} | {doc}")