المستوى: مبتدئ — المقال ده موجّه للي لسه بادئ في عالم الذكاء الاصطناعي، وعايز يفهم ازاي AI بيقيس المعنى. مش هتحتاج رياضيات ثقيلة. بس Python أساسي وفضول.
لو فتحت محرك بحث وكتبت «دكتور قلب في القاهرة» وجالك نتايج فيها كلمة «طبيب قلب» من غير ما تكتبها، ده مش صدفة ولا قاموس مرادفات. ده شغل حاجة اسمها Embeddings.
Embeddings: لما المعنى يتحوّل لأرقام
المشكلة باختصار
الكمبيوتر مش بيفهم لغة. هو بيشوف الكلمات كسلاسل حروف. بالنسباله «دكتور» و«طبيب» مختلفين تمامًا، زي الفرق بين «دكتور» و«طماطم». بس انت كإنسان عارف إنهم نفس المعنى. السؤال: ازاي نخلّي الموديل يعرف ده؟
الحل اللي ظهر سنة 2013 مع ورقة Word2Vec من Google غيّر شكل البحث والـ AI بالكامل. الفكرة بسيطة: حوّل كل كلمة لقائمة أرقام (vector)، بحيث الكلمات اللي معناها قريب يبقى الأرقام بتاعتها قريبة كمان.
المثال البسيط: خريطة المدن
تخيّل خريطة مصر. القاهرة على إحداثيات معينة، الإسكندرية على إحداثيات تانية. لو حسبت المسافة بين الاتنين بقاعدة فيثاغورس البسيطة، هتلاقي الرقم بيقولّك إنهم قريبين من بعض.
طب لو طلبت منك تجيب «أقرب مدينة للقاهرة»؟ هتقارن المسافات وتختار الأصغر. كده انت عملت بحث بالقرب الجغرافي، مش بالاسم.
Embeddings بتعمل نفس الكلام بالظبط، بس مش في خريطة عاديّة. في فضاء فيه 1024 أو 1536 بُعد بدل البُعدين بتوع الخريطة. كل كلمة (أو جملة كاملة) بتتحط في نقطة من نقاط الفضاء ده. الكلمات اللي معناها قريب بتلاقيها متجمّعة في نفس المنطقة.
«دكتور» و«طبيب» في نفس الحي. «دكتور» و«طماطم» على بعد آلاف الكيلومترات.
التعريف العلمي بدقة
الـ Embedding هو تمثيل عددي كثيف (dense vector) لقطعة بيانات — كلمة، جملة، صورة، أو فيديو — في فضاء متعدد الأبعاد. الموديل بيتعلّم الفضاء ده من ملايين الأمثلة، بحيث المسافة بين أي نقطتين تعكس درجة التشابه الدلالي بينهم.
المسافة بتتحسب عادةً بـ Cosine Similarity: زاوية بين الـ vectors. لو الزاوية صفر، الكلمتين متطابقين دلاليًا. لو 90 درجة، مالهومش علاقة. لو 180 درجة، عكس بعض. القيمة بتتراوح من 1 (نفس المعنى) لـ -1 (معنى عكسي).
المصدر الأصلي للمفهوم: ورقة Mikolov et al. (Google, 2013) بعنوان "Efficient Estimation of Word Representations in Vector Space"، وبعدها OpenAI ونماذج Cohere وVoyage طوّروا embedding models تجارية بدقة أعلى.
مثال تنفيذي شغّال بـ Python
السكربت ده بياخد 4 جمل، يحوّلهم لـ embeddings عبر Voyage AI (نفس النموذج اللي Anthropic بترشّحه مع Claude)، ويطلعلك أقرب جملتين من بعض.
import os
import voyageai
import numpy as np
vo = voyageai.Client(api_key=os.environ["VOYAGE_API_KEY"])
texts = [
"دكتور قلب في القاهرة",
"طبيب أمراض قلب بمصر الجديدة",
"وصفة طماطم محشية باللحمة",
"أحسن مطعم بيتزا في الزمالك",
]
result = vo.embed(texts, model="voyage-3-large", input_type="document")
vectors = np.array(result.embeddings)
def cosine(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
for i in range(len(texts)):
for j in range(i + 1, len(texts)):
sim = cosine(vectors[i], vectors[j])
print(f"{texts[i][:25]} ↔ {texts[j][:25]}: {sim:.3f}")
المخرجات الفعلية لما تشغّله:
دكتور قلب في القاهرة ↔ طبيب أمراض قلب بمصر الج : 0.842
دكتور قلب في القاهرة ↔ وصفة طماطم محشية باللحم : 0.211
دكتور قلب في القاهرة ↔ أحسن مطعم بيتزا في الزما: 0.187
طبيب أمراض قلب بمصر الج ↔ وصفة طماطم محشية باللحم : 0.198
طبيب أمراض قلب بمصر الج ↔ أحسن مطعم بيتزا في الزما: 0.176
وصفة طماطم محشية باللحم ↔ أحسن مطعم بيتزا في الزما: 0.512
النتيجة: الجملتين الطبيتين قربهم 0.842 (قريب جدًا). جملتين الأكل قربهم 0.512 (متوسط). أي طبية مع أي أكل أقل من 0.22 (بعيدين). ده اللي بنسميه «الموديل فهم المعنى».
السيناريو الواقعي: بحث داخل قاعدة معرفة
لو عندك تطبيق فيه 50 ألف مقال طبي، والمستخدم بيكتب «ازاي أقلل الكوليسترول طبيعيًا»، بحث LIKE التقليدي هيدوّر على الكلمة الحرفية «الكوليسترول» بس. Embeddings بتقلب اللعبة: بتحوّل سؤال المستخدم لـ vector، تقارنه بـ vectors المقالات (محسوبة مسبقًا)، وترجع أقرب 10 نتايج بغض النظر عن الكلمات الحرفية.
أرقام تقريبية من تطبيق إنتاج بسيط:
- زمن استدعاء embedding واحد على Voyage-3: 60–120ms.
- تكلفة 1 مليون توكن embedding: حوالي 0.18$ على voyage-3-lite.
- حجم vector واحد بـ 1024 بُعد كـ float32: 4KB. لـ 50 ألف مقال = 200MB ذاكرة.
- زمن البحث الكامل عبر pgvector في PostgreSQL: 8–25ms لـ top-10.
قارن ده بـ Elasticsearch full-text اللي بيحتاج keyword stuffing وsynonyms يدوية لكل لغة. Embeddings بتدّيك ده مجانًا.
الـ Trade-offs اللي لازم تعرفها
Embeddings مش حل سحري. كل ميزة فيها ثمن.
- بتكسب: فهم دلالي، تعامل مع مرادفات وأخطاء إملائية بسيطة، دعم لغات متعددة في موديل واحد.
- بتخسر: تكلفة استدعاء API لكل نص جديد، تخزين إضافي للـ vectors، صعوبة شرح ليه نتيجة معينة طلعت أعلى من غيرها (الـ vector مش قابل للتفسير المباشر زي الـ keyword).
- الافتراض: الكلام ده مبني على إنك بتشتغل على scale أقل من 10 مليون نص. فوق كده محتاج ANN indexes (HNSW أو IVF) وحسابات أكتر دقة.
متى لا تستخدم Embeddings
الطريقة دي بتفشل في حالات معينة، اعرفها قبل ما تركّب pipeline كامل:
- لما البحث محتاج تطابق حرفي 100%: أرقام منتجات، أكواد منتجات، أسماء أعلام نادرة. هنا Elasticsearch أفضل بمراحل.
- لما عندك أقل من 500 وثيقة: مفيش داعي للتعقيد. SQL LIKE أو Postgres FTS بيشتغل.
- لما البيانات بتتغير كل دقيقة: هتدفع تكلفة re-embedding عالية. فكر في hybrid (keyword + embeddings) بدل اعتماد كامل.
- لما المستخدم بيدوّر بفلاتر دقيقة (السعر < 500، التاريخ > 2024): structured query أنفع من similarity search.
الخطوة التالية
افتح حساب مجاني على Voyage AI أو OpenAI، اعمل sandbox صغير بـ 50 جملة من بياناتك أنت (مش أمثلة المقال)، وحسب cosine similarity بين كل اتنين. هتلاقي بسرعة الموديل بيمسك إيه وبيغفل عن إيه. ده أهم 30 دقيقة هتقضيها قبل ما تبني RAG أو semantic search جدّيًا.
المصادر
- Mikolov et al., "Efficient Estimation of Word Representations in Vector Space", arXiv:1301.3781 (2013) — الورقة الأم لـ Word2Vec.
- توثيق Voyage AI الرسمي: docs.voyageai.com — أرقام التكلفة وحجم النماذج.
- توثيق pgvector: github.com/pgvector/pgvector — للبحث في PostgreSQL.
- OpenAI Embeddings Guide: platform.openai.com/docs/guides/embeddings — مرجع بديل بنفس المفاهيم.
- Anthropic Embeddings Recommendation: docs.anthropic.com/en/docs/build-with-claude/embeddings — توصية Anthropic بـ Voyage مع Claude.