لو فتحت محرك البحث في موقعك وكتبت "كيف أوقف خطأ في الكود" ومجبتش لك المقال اللي عنوانه "إصلاح bugs في JavaScript"، البحث بيقارن الحروف مش المعنى. Embeddings هي اللي بتخلي الكمبيوتر يفهم إن "خطأ" و"bug" كلمتين قريبين دلاليًا، حتى لو حروفهم مختلفة تمامًا. لو معاك Python أساسي، الكود اللي تحت هيخليك تبني نسخة شغّالة من Semantic Search في أقل من ساعة.
مستوى المقال: مبتدئ. مفيش متطلبات قبلية غير إنك تعرف Python بسيط وعمرك سمعت كلمة "ذكاء اصطناعي". لو أنت محترف ML، المقال ده مش ليك — في نهايته رابط للمستوى الأعمق.
Embeddings للمبتدئ: من الكلام للأرقام والمعنى
المشكلة باختصار
محركات البحث الكلاسيكية، زي Ctrl+F في ملف، أو SQL LIKE '%كلمة%'، أو حتى Full-Text Search، بتدوّر بالحرف. لو القارئ كتب "حاسوب" والمقال فيه "كمبيوتر"، النتيجة صفر. ده مش بس مشكلة لغوية — ده بيخسّر الموقع زوار، وبيخلي فريق الدعم الفني يضيع وقته في إجابة نفس السؤال 50 مرة لأن العميل ما لاقاش الإجابة الموجودة فعلًا في قاعدة المعرفة.
الحل اللي ظهر مع تطوّر اللغويات الحاسوبية اسمه Embeddings. الفكرة بسيطة: حوّل كل جملة لمتجه أرقام، وخلّي الجمل المتشابهة في المعنى ينتج عنها متجهات قريبة من بعض رياضيًا.
المثال أولًا: خريطة المعنى
تخيّل إنك بتحط كل كلمة في خريطة مدينة افتراضية. كلمة "كلب" بتقع في حي معيّن. كلمة "قطة" في الحي اللي جنبه. كلمة "سيارة" في حي بعيد على الناحية التانية من المدينة. لو رحت بقدمك من "كلب" لـ"قطة"، المسافة قصيرة. لو حاولت تروح من "كلب" لـ"سيارة"، هتمشي كتير.
ده بالظبط اللي Embeddings بتعمله، بس بدل خريطة بُعدين (شارع وعرض)، هي خريطة بـ 384 أو 768 أو 1536 بُعد. الإنسان مبيقدرش يتخيّل فضاء بـ 768 بُعد، لكن الكمبيوتر بيتعامل معاه بسهولة بمعادلات الجبر الخطي.
التعريف العلمي بدقة
Embedding هو متجه (vector) من أرقام عشرية (float32 عادةً)، طوله ثابت يحدده الموديل. الموديل اللي بيولّد الـ embedding اتدرّب على ملايين أو بلايين الأمثلة بطريقة Contrastive Learning، بحيث المسافة الكوسينيّة (cosine similarity) بين متجهين تكون متناسبة طرديًا مع التشابه الدلالي بين النصين الأصليين. كلما زاد التشابه في المعنى، اقتربت الزاوية بين المتجهين من الصفر، واقتربت قيمة الـ cosine similarity من 1.
إزاي نبني Semantic Search خطوة بخطوة
- هات النصوص اللي عايز تبحث فيها (FAQ، عناوين مقالات، تذاكر دعم).
- حوّل كل نص لـ embedding باستخدام موديل جاهز.
- خزّن الـ embeddings (في البداية، list في الذاكرة كافي للتجربة).
- لما يجي سؤال جديد، حوّله لـ embedding بنفس الموديل.
- قارن السؤال بكل النصوص المخزّنة، اختار الأقرب.