هذا المقال يتطلب مستوى: مبتدئ
الـ Embeddings: إزاي الذكاء الاصطناعي بيحوّل الكلام لأرقام يفهم بيها المعنى
بعد المقال ده هتعرف إزاي محرك البحث الدلالي وChatGPT بيعرفوا إن كلمة "قطة" أقرب لـ "كلب" من "سيارة"، من غير ما حد يعلّمهم ده صراحةً. السر كله في فكرة اسمها الـ Embeddings.
المشكلة باختصار
الكمبيوتر مبيفهمش كلام، هو بيفهم أرقام بس. لو خزّنت كلمة "قطة" كنص، الكمبيوتر يقدر يقارنها حرف بحرف مع "قطط"، لكنه ملوش أي فكرة إن معناهم قريب. ولو دوّرت بكلمة "سيارة" مش هيرجّعلك نتيجة فيها "عربية"، لأن الحروف مختلفة تمامًا. المطلوب طريقة تخلّي المعنى نفسه رقمًا يتقارن. دي بالظبط وظيفة الـ Embeddings.
المثال الأول: تخيّل خريطة GPS للكلمات
تخيّل خريطة زي جوجل مابس، بس بدل المدن فيها كلمات. كل كلمة ليها إحداثيات، زي خط الطول وخط العرض. الكلمات اللي معناها قريب بتتحط جنب بعض. "قطة" و"كلب" هيبقوا في حيّ واحد اسمه "حيوانات". "تفاح" و"موز" في حيّ تاني اسمه "فاكهة". و"سيارة" بعيدة خالص في ناحية تانية.
دلوقتي عشان تعرف كلمتين قريبين ولا لأ، مش محتاج تفهم معناهم — بتقيس المسافة بينهم على الخريطة وبس. ده بالظبط اللي بيعمله الكمبيوتر، لكن بدل بُعدين (طول وعرض)، بيستخدم مئات الأبعاد. الصورة اللي فوق دي نفس الفكرة: فضاء اتّرسم فيه كل مجموعة كلمات متقاربة المعنى في ركن لوحدها.
المفهوم علميًا: يعني إيه Embedding؟
الـ Embedding هو تمثيل الكلمة (أو الجملة أو الصورة) كمتجه أرقام — قائمة أرقام بطول ثابت. نموذج زي all-MiniLM-L6-v2 بيطلّع لكل جملة متجهًا فيه 384 رقم. النماذج دي اتدرّبت على ملايين النصوص، فتعلّمت تحط الكلمات اللي بتيجي في سياقات متشابهة قريبة من بعض في الفضاء ده.
النقطة المهمة: الأرقام دي مش عشوائية. اتجاه المتجه نفسه بيحمل المعنى. عشان كده عملية زي king - man + woman بتديك متجهًا قريبًا جدًا من queen. ده مش سحر، ده نتيجة إن العلاقات المعنوية اتحوّلت لعلاقات هندسية بين المتجهات.
إزاي بنقيس التشابه؟ جيب التمام (Cosine)
عشان نعرف متجهين قريبين قد إيه، بنستخدم تشابه جيب التمام (Cosine Similarity): بنقيس الزاوية بين المتجهين. زاوية صغيرة معناها معنى متقارب وقيمة قريبة من 1، وزاوية كبيرة معناها معنى بعيد وقيمة قريبة من 0.
بُص للرسم: "قطة" و"كلب" بينهم زاوية صغيرة فالتشابه عالي، لكن "سيارة" طالعة في اتجاه مختلف فالتشابه منخفض. لاحظ إننا بنقيس الزاوية مش طول المتجه، عشان كده كلمة نادرة وكلمة متكررة ممكن يبقى بينهم تشابه عالي طالما المعنى واحد.
مثال تنفيذي: احسبها بنفسك
ثبّت المكتبة الأول:
pip install sentence-transformersوبعدين شغّل الكود ده:
from sentence_transformers import SentenceTransformer, util
# نموذج بيحوّل أي جملة لمتجه من 384 رقم
model = SentenceTransformer("all-MiniLM-L6-v2")
words = ["قطة", "كلب", "سيارة"]
emb = model.encode(words)
print(emb.shape) # (3, 384)
print(util.cos_sim(emb[0], emb[1])) # قطة vs كلب ~0.6
print(util.cos_sim(emb[0], emb[2])) # قطة vs سيارة ~0.3
القيم تقريبية وممكن تختلف قليلًا حسب إصدار النموذج، لكن الترتيب ثابت: "قطة/كلب" دايمًا أعلى من "قطة/سيارة". ولو عايز تفهم الحساب اللي ورا cos_sim، دي المعادلة في سطرين بـ NumPy:
import numpy as np
def cosine(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
سيناريو واقعي والـ trade-offs
لو عندك متجر فيه 50 ألف منتج وعايز بحث دلالي (المستخدم يكتب "حاجة أشرب بيها قهوة" وترجّعله "مج")، بتحوّل وصف كل منتج لمتجه مرة واحدة وتخزّنه. بعد كده أي بحث بيتحوّل لمتجه، وبتقارنه بالمتجهات المخزّنة. ده بيلاقي المعنى، مش الكلمة الحرفية.
الـ trade-off هنا واضح: بتكسب فهمًا للمعنى ومرونة في البحث، بس بتخسر حاجتين. الأول التخزين: 50 ألف متجه × 384 رقم × 4 بايت ≈ 73 ميجابايت في الرام. التاني: المقارنة الخطية على 50 ألف متجه بتبطأ لما العدد يكبر، وساعتها بتحتاج فهرس متجهات زي FAISS أو HNSW عشان توصل لأقرب النتائج بسرعة.
متى لا تستخدم الـ Embeddings
مش كل بحث محتاج Embeddings. لو المستخدم بيدوّر برقم منتج أو كود أو إيميل بالظبط، المطابقة الحرفية (exact match) أسرع وأدق وأرخص. وكمان لو عندك بيانات قليلة جدًا (مية صف مثلًا) وكلمات مفتاحية واضحة، بحث نصي عادي زي PostgreSQL full-text بيكون كفاية ومش محتاج تعقيد المتجهات. الافتراض اللي المقال مبني عليه إنك بتتعامل مع نص طبيعي وعايز تلاقي المعنى، مش تطابقًا حرفيًا.
الخطوة التالية
ثبّت sentence-transformers وشغّل كود الـ 6 سطور فوق على 5 كلمات من مجال شغلك، وبُص للأرقام. لو الترتيب طلع منطقي، تبقى فهمت الفكرة عمليًا. الخطوة اللي بعدها: خزّن متجهات منتجاتك في قاعدة متجهات زي Qdrant أو pgvector واعمل أول بحث دلالي حقيقي.
المصادر
- Mikolov et al., "Efficient Estimation of Word Representations in Vector Space" (word2vec), 2013 — arxiv.org/abs/1301.3781
- Google Machine Learning Crash Course — Embeddings: developers.google.com
- Sentence-Transformers Documentation: sbert.net
- OpenAI — Embeddings guide: platform.openai.com/docs/guides/embeddings