المستوى: مبتدئ
Embeddings للمبتدئ: ليه الكلمات بتتحوّل لأرقام علشان AI يفهم المعنى
لو سألت شات بوتك "كام سعر الشحن لمصر؟" والـ FAQ بتاعك مكتوب فيه "تكلفة التوصيل للسعودية 25 ريال"، الـ AI لازم يفهم إن الجملتين بيتكلموا عن نفس الفكرة رغم اختلاف كل كلمة فيهم. اللي بيخلّي ده ممكن من 2013 لحد دلوقتي اسمه Embeddings: تحويل النص لقائمة أرقام (vector) المعاني المتقاربة فيها بتقرّب من بعض رياضيًا.
المشكلة باختصار
أي بحث تقليدي بيشتغل بمطابقة الكلمات (keyword matching). لو في القاعدة "تكلفة التوصيل" والسؤال "سعر الشحن"، البحث بيرجّع صفر نتائج رغم إن الجملتين نفسهم في المعنى. ده اللي بيخلّي شات بوتك يقول "مش لاقي إجابة" في حوالي 35-40% من الأسئلة على corpus عربي متوسط الحجم. الـ Embeddings بتحلّ المشكلة دي من جذرها لأنها بتشتغل على المعنى، مش على الحروف.
المفهوم بمثال بسيط — الخريطة الذكية
تخيّل خريطة كبيرة، بس مش الخريطة العادية اللي ليها طول وعرض بس. الخريطة دي ليها 1024 بُعد مختلف. كل كلمة أو جملة بتاخد إحداثيات على الخريطة دي.
كلمة "قطة" بتقعد قريب من كلمة "كلب" لأن الاتنين حيوانات أليفة. كلمة "تكلفة" بتقعد قريب من "سعر" لأن المعنى متقارب. كلمة "سيارة" بتقعد بعيد جدًا عن "بيتزا" لأن مفيش علاقة. المسافة بين أي نقطتين على الخريطة دي بتعبّر عن قد إيه المعنى متقارب.
المثال ده مش مجرد تشبيه — هو فعلًا اللي بيحصل داخل الـ embedding model. الفرق الوحيد إن المخ بتاعنا مش قادر يتخيّل فضاء بـ 1024 بُعد، فبنشتغل على الفكرة الرياضية مباشرة.
التعريف العلمي بدقة
الـ Embedding هو دالة f بتحوّل نص x إلى vector v ∈ ℝᵈ بحيث إن المسافة الـ cosine بين v₁ و v₂ تعكس قد إيه x₁ و x₂ متقاربين دلاليًا. الفكرة دي أصلها من ورقة Word2Vec اللي نشرها Mikolov في Google سنة 2013 (arXiv:1301.3781).
الأجيال الحالية (Cohere embed-multilingual-v3, OpenAI text-embedding-3, BGE-M3) بتستخدم Transformer architecture بدل الـ Skip-gram الأصلية، ودي بتدّي دقة أعلى بكتير في اللغات غير الإنجليزية، خصوصًا العربية على benchmark MIRACL.
كود Python شغّال — 14 سطر
import cohere
import numpy as np
co = cohere.Client("YOUR_API_KEY")
texts = [
"كام سعر الشحن لمصر؟",
"تكلفة التوصيل للسعودية كام؟",
"إزاي أطبخ مكرونة بالبشاميل؟"
]
response = co.embed(
texts=texts,
model="embed-multilingual-v3.0",
input_type="search_document"
)
vectors = np.array(response.embeddings)
def cosine(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(f"الشحن vs التوصيل: {cosine(vectors[0], vectors[1]):.3f}") # ~0.91
print(f"الشحن vs الطبخ: {cosine(vectors[0], vectors[2]):.3f}") # ~0.17