المستوى: مبتدئ
Embeddings للمبتدئ: ازاي الكمبيوتر يفهم إن "كلب" أقرب لـ "قطة" من "سيارة"
هتعرف بعد المقال ده ازاي البحث الذكي والـ RAG وتطبيقات الذكاء الاصطناعي بتلاقي نص شبيه بنص تاني من غير ما يكون فيه أي كلمة مشتركة بينهم. هتعرف كمان ازاي تستعمل الفكرة دي بسطرين كود Python على جهازك المحلي.
المشكلة باختصار
لو عندك جملة "أحتاج إصلاح تكييف السيارة" وعندك في قاعدة بياناتك جملة "إصلاح المكيف الخاص بالسيارة"، البحث التقليدي بكلمة "تكييف" مش هيلاقي الجملة التانية لأنها بتقول "مكيف". الكمبيوتر شايفهم نصّين مختلفين تمامًا.
المشكلة دي بتظهر يوميًا في تطبيقات البحث، الـ chatbots، والـ RAG. البحث الحرفي بـ keyword بيفشل في ما يقرب من 30 إلى 40 بالمئة من الأسئلة الواقعية حسب قياس BEIR Benchmark على بيانات متعددة المجالات.
تخيّل الفكرة قبل ما نشرحها علميًا
افتكر إنك في مكتبة كبيرة، وكل كتاب اتحطّ على الرف حسب موضوعه. كتب الطبخ مع بعض، كتب الحاسب مع بعض، كتب الأطفال مع بعض. لو جيت تدور على كتاب طبخ، مش لازم تعرف اسمه بالظبط. تروح على رف الطبخ، تلاقي كل الكتب الشبيهة جنب بعض، وتختار اللي يعجبك.
الـ Embedding بيعمل نفس الشيء بالظبط، لكن على مستوى الكلمات والجمل. بدل ما الكلمات تكون مجرد حروف، بتتحوّل لنقاط في فضاء كبير. الكلمات اللي معناها قريب، نقاطها بتقع جنب بعض. كلمة "كلب" نقطتها بتكون جنب نقطة "قطة"، وبعيدة جدًا عن نقطة "سيارة". الكمبيوتر مش بيفهم اللغة زينا، لكنه بيفهم المسافات بين النقاط.
التعريف العلمي الدقيق
الـ Embedding هو متجه (vector) من أرقام عشرية بطول ثابت، عادة 384 أو 768 أو 1536 بُعد. الموديل، زي sentence-transformers أو OpenAI text-embedding-3، بياخد نص وبيرجّع متجه يمثّل المعنى الدلالي للنص في فضاء عالي الأبعاد.
القياس بين متجهين بيتم بـ Cosine Similarity، يعني حاصل ضرب نقطي مقسوم على ضرب الأطوال. القيمة بتطلع بين سالب واحد و موجب واحد. كل ما القيمة اقتربت من واحد، كل ما المعنى أقرب. كل ما اقتربت من صفر، كل ما المعنى مختلف.
الفكرة دي مبنية أصلًا على ورقة Word2Vec لـ Mikolov وفريقه سنة 2013، ثم تطورت في BERT لـ Devlin سنة 2018. حاليًا الموديلات بتتدرّب بطريقة Contrastive Learning على ملايين الأزواج المتشابهة، ودي اللي بتخلّي الجودة وصلت لمستوى الإنتاج الفعلي.
مثال كود شغّال — جرّب بنفسك
المثال ده بيبيّن الفكرة في حوالي 12 سطر Python فقط. هتحتاج تنصّب مكتبة sentence-transformers الأول:
pip install sentence-transformers scikit-learnوبعد كده شغّل السكربت ده: