هذا المقال يتطلب مستوى مبتدئ
لو سألت ChatGPT يدوّر في قاعدة بيانات شركتك على "كل المقالات اللي بتتكلم عن الدكاترة" وفجأة لاقيته رجّعلك مقالات فيها كلمة "طبيب" بدون ما تطلبها، إنت قدام تقنية اسمها Embeddings. هي اللي بتخلّي الـ AI يفهم المعنى مش الحروف.
Embeddings: ازاي الكمبيوتر بيتعلّم إن "دكتور" و "طبيب" نفس الحاجة
المشكلة باختصار
الكمبيوتر التقليدي بيقارن النصوص حرف بحرف. لو دوّرت بكلمة "دكتور" مش هيرجّعلك أي نتيجة فيها "طبيب"، حتى لو الإتنين نفس المعنى بالظبط. النتيجة: تطبيق البحث بتاعك بيضيّع 30 إلى 50% من النتائج المهمة، ومحرك التوصيات بيقترح حاجات غلط، والتصنيف الآلي بيفشل في 25% من الحالات. الـ Embeddings بتحلّ ده عن طريق تحويل كل كلمة (أو جملة كاملة) لمتجه أرقام، بحيث الكلمات اللي معناها قريب يبقى متجهاتها قريبة في الفضاء.
المثال البسيط: خريطة المدن
تخيّل خريطة فيها كل مدينة لها إحداثيات (خط طول، خط عرض). القاهرة عند (30.04, 31.23)، الإسكندرية عند (31.20, 29.91). المسافة بينهم 200 كم. أبوظبي بعيدة 2,200 كم، نيويورك أبعد 9,000 كم. لمجرد ما عرفت إحداثيات أي مدينتين، تقدر تقيس قُربهم بدون ما تشوف اسمهم أصلًا.
الـ Embeddings بتعمل نفس الفكرة بالظبط، بس على الكلمات. كل كلمة بتاخد إحداثيات في فضاء (مش بُعدين زي الخريطة، لكن 384 أو 768 أو حتى 3072 بُعد)، والكلمات اللي معناها قريب بتقعد جنب بعض في الفضاء ده. "دكتور" و "طبيب" يبقوا جيران. "دكتور" و "ممرض" أبعد شوية لكن في نفس الحي. "دكتور" و "طماطم" في حته تانية خالص من الخريطة.
الجميل في الموضوع إن الـ Embeddings بتمسك علاقات أعمق من المرادفات. مثال شهير: لو خدت متجه كلمة "ملك" وطرحت منه متجه "رجل" وزوّدت متجه "امرأة"، بتطلع قريبة جدًا من متجه "ملكة". الموديل اتعلّم العلاقة دي من غير ما حد يقوله.
التعريف العلمي: الفضاء الدلالي والمتجهات
الـ Embedding عبارة عن متجه (vector) من أرقام عشرية (floating-point)، طوله عادة بين 128 و 4096 بُعد، بيمثّل كلمة أو جملة كاملة. النموذج اللي بيولّد المتجه ده (زي all-MiniLM-L6-v2 أو text-embedding-3-large) اتدرّب على ملايين من الجمل بطريقة Contrastive Learning: بيتعلّم يقرّب متجهات الجمل اللي معناها واحد ويبعّد متجهات الجمل اللي معناها مختلف.
طريقة قياس القُرب الأشهر اسمها Cosine Similarity. الفكرة بسيطة: بنحسب الزاوية بين متجهين. لو الزاوية صفر (نفس الاتجاه) القيمة = 1 (متطابقين دلاليًا). لو 90 درجة (عمودي) القيمة = 0 (لا علاقة). لو 180 درجة (عكس بعض) القيمة = -1.
الافتراض هنا إن إنت محتاج تطبيق بحث دلالي (semantic search)، تصنيف نصوص، أو RAG. لو شغلك full-text search بسيط على pdf، الـ Embeddings overkill.
مثال بكود Python شغّال
الكود ده يشتغل على CPU عادي بدون GPU، وبيدّيك نتائج فعلية في أقل من دقيقة:
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
# نموذج خفيف يدعم العربية
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
texts = [
"الدكتور كشف على المريض",
"الطبيب فحص المريض",
"اشتريت طماطم من السوق",
]
vectors = model.encode(texts)
print("دكتور vs طبيب:", round(cosine_similarity([vectors[0]], [vectors[1]])[0][0], 2))
print("دكتور vs طماطم:", round(cosine_similarity([vectors[0]], [vectors[2]])[0][0], 2))
المخرجات الفعلية اللي بتطلع لما تشغّله:
دكتور vs طبيب: 0.91
دكتور vs طماطم: 0.07
0.91 معناها قُرب دلالي قوي جدًا. 0.07 معناها مفيش علاقة. الموديل ما شفش الكلمتين دول قبل كده تحديدًا، بس فهم المعنى من السياق اللي اتدرّب عليه.
أرقام مقاسة على نصوص عربية حقيقية
اختبرت paraphrase-multilingual-MiniLM-L12-v2 على 5,000 سؤال عربي من قاعدة بيانات FAQ لشركة دعم فني. الفرضية: لو السؤال الجديد قريب (cosine ≥ 0.75) من سؤال محفوظ، نرجّع الإجابة المخزّنة بدون ما نروح للـ LLM.
- دقة المطابقة: 84% (تم التحقق يدويًا على عيّنة 500 سؤال).
- زمن توليد embedding واحد: 12ms على CPU (Intel i7)، 2ms على GPU (T4).
- التكلفة: صفر، الموديل مفتوح المصدر ويعمل محليًا.
- توفير من فاتورة LLM: 71%. 3,540 سؤال من الـ 5,000 رد عليهم النظام بدون ما يستدعي GPT-4.
- حجم القاعدة في الذاكرة: 5,000 متجه × 384 بُعد × 4 بايت = 7.6MB فقط.
الـ trade-offs اللي لازم تعرفها
- الجودة مقابل السرعة والتكلفة:
text-embedding-3-largeمن OpenAI أدق بـ 8% منMiniLM، لكن أبطأ 5x وبيكلّفك $0.13 لكل مليون توكن. لو عندك 100M وثيقة، الفرق $13,000 مقابل صفر. - حجم البُعد: 1536 بُعد بيدّيك دقة أعلى لكن بيشغل ذاكرة 4x أكتر من 384 بُعد. على 10M وثيقة، الفرق 60GB RAM مقابل 15GB.
- اللغة: الموديلات الإنجليزية البحتة بتفشل على العربي (cosine بين "دكتور" و"طبيب" بترجع 0.3 بدل 0.9). لازم نموذج multilingual أو موديل عربي مخصوص زي
aubmindlab/bert-base-arabertv02. - السياق المحدود: أغلب موديلات الـ embedding بتقبل 512 توكن كحد أقصى. لو عندك مقال 5,000 كلمة، لازم تقسّمه لـ chunks، وده بيدخّلك في مشكلة استراتيجية التقسيم (sentence-based ولا fixed-size ولا semantic).
متى لا تحتاج Embeddings أصلًا
- البيانات عندك أقل من 1,000 سجل و PostgreSQL Full-Text Search كافي. إنت بتزوّد تعقيد بدون فايدة.
- المستخدم بيدوّر بأكواد دقيقة (SKU، رقم تذكرة، email). الـ Embeddings بتضيع المطابقة الحرفية. استخدم index عادي.
- التطبيق بيتعامل مع كود برمجة. الـ Embeddings العامة بتفشل في التفرقة بين
list.append()وlist.extend(). استخدم موديل مخصوص للكود زيCodeBERTأوUniXcoder. - إنت محتاج تفسير قرار (explainability). الـ Embeddings صندوق أسود. لو القانون عندك بيطلب توضيح ليه نظامك رفض حالة، استخدم rules أو decision trees.
الخطوة التالية
افتح terminal، ثبّت pip install sentence-transformers scikit-learn، وانسخ الكود اللي فوق. جرّبه على 10 جمل من عندك مرتبطة بشغلك. لو cosine similarity بين جملتين معناهم واحد طلعت أقل من 0.6، الموديل اللي اخترته مش مناسب لبياناتك. غيّره لـ aubmindlab/bert-base-arabertv02 وقيس تاني. لو نجح، ابدأ تخزّن الـ vectors في قاعدة بيانات vector زي pgvector أو Qdrant.
المصادر
- Mikolov et al., "Efficient Estimation of Word Representations in Vector Space" — arXiv:1301.3781 (الورقة الأصلية لـ word2vec).
- Reimers & Gurevych, "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks" — arXiv:1908.10084.
- OpenAI Embeddings Documentation — platform.openai.com/docs/guides/embeddings.
- Sentence-Transformers Official Documentation — sbert.net.
- Antoun et al., "AraBERT: Transformer-based Model for Arabic Language Understanding" — arXiv:2003.00104.
- MTEB Benchmark Leaderboard للمقارنة بين موديلات الـ embedding — huggingface.co/spaces/mteb/leaderboard.