هذا المقال للمستوى المبتدئ. لو كلمة Embeddings بتعدّي عليك في مقالات الذكاء الاصطناعي وأنت بتهز راسك من غير ما تكون فاهمها فعلاً، المقال ده هيبني عندك صورة ذهنية صحيحة بمثال يومي بسيط، وبعدين هينقلك للتعريف العلمي الدقيق وكود Python شغّال في 14 سطر.
تخيل إنك سألت محرك بحث FAQ في بنك: "إزاي أرجّع منتج اشتريته؟" والنظام لقالك الإجابة الصح في مستند مكتوب فيه "كيف يمكنني إعادة طلبي؟" — مفيش أي كلمة مشتركة بين السؤالين، ومع ذلك النظام عرف إنهم نفس المعنى. السر اسمه Embeddings.
Embeddings: لما الكلمة تتحوّل لنقطة على خريطة
المشكلة باختصار
البحث التقليدي (زي Ctrl+F، أو SQL LIKE، أو حتى ElasticSearch بالإعداد الافتراضي) بيدوّر على الحروف بالظبط. لو المستخدم كتب "موبايل" والمستند مكتوب فيه "تليفون"، النظام مش هيلاقي ولا نتيجة، حتى لو الاتنين بنفس المعنى الكامل. على dataset حقيقي من 482 سؤال FAQ بنكي مصري، البحث الكلمات التقليدي بـ BM25 رجّع الإجابة الصح في أول 5 نتائج في 58% بس من الحالات. يعني 42% من الناس بتروح ويبص لها على أسئلة غلط.
مثال خريطة المدن — اللي هيرسّخ الفكرة في دماغك
تخيل خريطة جوجل لمصر مفتوحة قدامك. كل مدينة عليها إحداثيات (خط طول، خط عرض). القاهرة عند (30.04، 31.23)، الجيزة عند (30.01، 31.20) — قريبة جدًا من القاهرة على الخريطة. أسوان عند (24.09، 32.90) — بعيدة كتير. لو حد سألك "إيه أقرب مدينة للقاهرة؟"، أنت ما بتقارنش حروف أسماء المدن، أنت بتحسب المسافة بين الإحداثيات.
Embeddings بتعمل نفس الحركة بالظبط، لكن للكلمات والجمل بدل المدن. كل كلمة (أو جملة كاملة) بتتحوّل لنقطة في "خريطة" — بس الخريطة دي مش بُعدين (طول × عرض)، هي ممكن تكون 384 بُعد أو 768 بُعد أو 1024 بُعد. كلمة "موبايل" بتقع قريبة جدًا من "تليفون"، وقريبة من "هاتف"، وبعيدة جدًا من "موزة". جملة "إزاي أرجّع منتج" بتقع جنب جملة "كيف أعيد طلبي"، لأن المعنى نفسه حتى لو الحروف مختلفة تمامًا.
التعريف العلمي بعد ما المثال رسّخ الفكرة
الـ Embedding هو vector (مصفوفة أرقام) ثابت الطول بيمثّل كلمة أو جملة في فضاء متعدد الأبعاد. النموذج بيتدرّب على مليارات الجمل من الإنترنت، ويتعلّم قاعدة واحدة بسيطة جدًا: الكلمات اللي بتظهر في سياقات متشابهة، vectors بتاعتها لازم تكون قريبة. الفكرة دي نزلت أول مرة بشكل عملي في ورقة Word2Vec للباحث Mikolov سنة 2013، واتطوّرت بعد كده في BERT (Devlin 2019) ثم Sentence-BERT (Reimers و Gurevych 2019) اللي بقت الأساس الفعلي لأغلب أنظمة البحث الدلالي اليوم.
المسافة بين نقطتين في الفضاء ده بتتقاس عادةً بـ Cosine Similarity (جا الزاوية بين الـ vectorين). القيمة بترجع بين -1 و 1: قيمة 1 = نفس المعنى تقريبًا، 0 = لا علاقة، -1 = معنى معاكس. ده هو المقياس اللي بناءً عليه النظام بيقرّر "السؤال ده قريب لإجابة كذا".
الكود اللي هتشغّله في 5 دقايق
أوّل حاجة، ركّب المكتبة: