لو فتحت أي مقال عن RAG أو Semantic Search أو حتى ChatGPT، هتلاقي كلمة "Embeddings" بتتذكر كأنها معروفة. الواقع إن أغلب الناس بيستخدموها بدون ما يفهموا اللي بيحصل تحتها بالظبط. المقال ده بيشرحلك Embeddings من الصفر، بمثال يفهمه أي حد، وبعدين بكود حقيقي تقدر تجربه دلوقتي على لابتوبك.
Embeddings: المفهوم اللي بيخلي الـ AI يفهم اللغة
المشكلة باختصار
الكمبيوتر مبيفهمش إن "كلب" و "جرو" دول كلمتين قريبين من بعض. هو شايفهم سلسلتين حروف مختلفتين تمامًا. لو بنيت بحث على string matching، البحث عن "كلب" مش هيرجعلك "جرو" ولا "كلاب" ولا "Dog". المشكلة دي قتلت محركات البحث الكلاسيكية لسنين، لحد ما الـ Embeddings ظهرت وحلت اللعبة.
المثال البسيط: المعاني كنقط على خريطة
بدل ما نتكلم رياضيات من الأول، تخيل معايا مدينة فيها أحياء متخصصة. حي للأكل، حي للحيوانات، حي للسيارات. كل كلمة في اللغة بنحطها في إحداثي (x, y) داخل المدينة دي حسب معناها:
- "كلب" في إحداثي (10, 20) داخل حي الحيوانات
- "جرو" في إحداثي (11, 21) — جنبه بالظبط لأنه نفس المعنى تقريبًا
- "قطة" في إحداثي (15, 18) — قريبة برضه، نفس فئة الحيوانات الأليفة
- "عربية" في إحداثي (200, 350) — في حي السيارات، بعيدة جدًا
دلوقتي لو سألت الكمبيوتر "إيه الكلمات القريبة من كلب؟"، هو هيحسب المسافة بالأرقام ويرجعلك جرو وقطة، مش عربية. مفيش string matching هنا، فيه حساب مسافة هندسي بحت. ده بالظبط اللي بتعمله الـ Embeddings، بس بدل بُعدين، بتشتغل في 1536 بُعد أو أكتر.
التعريف العلمي الدقيق
الـ Embedding هو تمثيل عددي (vector) لكلمة أو جملة أو صورة في فضاء متعدد الأبعاد. النموذج (زي text-embedding-3-small من OpenAI أو voyage-3 من Voyage AI) بياخد نص ويرجّع array من الأرقام، عادةً بين 256 و 3072 رقم. النماذج دي اتدربت على مليارات النصوص، فالأرقام مش عشوائية — هي بتعكس علاقات دلالية حقيقية بين الكلمات.
السحر بالظبط في حاجتين:
- التشابه الدلالي = قرب هندسي. كلمات معانيها قريبة، vectorهم قريب في الفضاء.
- اللغة مش فارقة. "كلب" بالعربي و "Dog" بالإنجليزي بيطلعوا قريبين في فضاء النماذج متعددة اللغات زي text-embedding-3-large.
إزاي تقيس القرب؟ Cosine Similarity
الطريقة المعيارية لقياس قرب vectorين هي Cosine Similarity. القيمة بتطلع بين -1 و 1، ومعناها كالتالي:
- 1 = نفس المعنى تمامًا (نفس الجملة حرفيًا)
- 0.75 وأكتر = متشابهين جدًا (مرادفات أو نفس الموضوع)
- 0 = مفيش علاقة بين الجملتين
- أقل من صفر = معاني متضادة (نادر في النماذج الحديثة)
عمليًا في تطبيقات الإنتاج، أي حاجة فوق 0.75 بنعتبرها "متشابهة جدًا" ونعرضها للمستخدم في نتائج البحث.
كود Python شغّال — جربه دلوقتي
الكود ده بيستخدم OpenAI SDK ويحسب التشابه بين 3 جمل عربية. كل اللي محتاجه هو تثبيت openai و numpy.
pip install openai numpy
export OPENAI_API_KEY="sk-..."
import os
from openai import OpenAI
import numpy as np
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
def embed(text: str) -> list[float]:
response = client.embeddings.create(
model="text-embedding-3-small",
input=text,
)
return response.data[0].embedding
def cosine_similarity(a: list[float], b: list[float]) -> float:
a, b = np.array(a), np.array(b)
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
v1 = embed("الكلب حيوان أليف")
v2 = embed("الجرو الصغير اللطيف")
v3 = embed("سعر النفط ارتفع اليوم في الأسواق")
print(f"كلب vs جرو: {cosine_similarity(v1, v2):.3f}")
print(f"كلب vs نفط: {cosine_similarity(v1, v3):.3f}")
المخرج المتوقع تقريبًا (الأرقام بتختلف قليلاً بين الإصدارات):
كلب vs جرو: 0.612
كلب vs نفط: 0.094
شايف الفرق؟ الكمبيوتر مش لازم يعرف اللغة العربية بمعنى أنه يقرأ ويفهم زينا، هو فاهم العلاقة من تمثيل الأرقام اللي اتدرب عليها على مليارات الجمل.
التكلفة والحجم في الإنتاج
قياس واقعي على text-embedding-3-small من OpenAI (تسعير أبريل 2025):
- التكلفة: 0.02 دولار لكل مليون توكن مدخل
- حجم الـ vector الافتراضي: 1536 رقم (يقدر يتقلل لـ 256 بـ Matryoshka Representation بدون خسارة دقة كبيرة)
- السرعة: حوالي 50 vector في الثانية لما تستخدم batch API
- الذاكرة: كل vector بـ float32 = 6 KB تقريبًا
يعني لو عندك 10K مقال متوسطها 500 كلمة، التكلفة الكاملة لتعميل embedding ليهم: أقل من 15 سنت أمريكي. الـ embedding مش هي اللي هتفلسك، الـ generation هي اللي ممكن تكلفك.
فين بتستخدمها فعلًا في الإنتاج؟
- Semantic Search: بحث بالمعنى مش بالكلمات، زي اللي شغّال جوه Notion و Linear.
- RAG: جلب الـ chunks المرتبطة بسؤال المستخدم قبل ما تبعتها للنموذج.
- Recommendation: منتجات أو مقالات شبيهة لاللي القارئ بيقراه.
- Clustering: تجميع تذاكر دعم بنفس المشكلة تلقائيًا بدون قواعد يدوية.
- Deduplication: اكتشاف نصوص متطابقة دلاليًا حتى لو الصياغة مختلفة.
- Anomaly Detection: رصد جملة شاذة عن سياق محادثة الدعم الفني.
Trade-offs لازم تكون عارفها
الـ Embeddings مش رصاصة فضية. الافتراض الأساسي إن نموذج الـ embedding اتدرب على نصوص قريبة من اللي عندك. لو شغلك على نصوص طبية متخصصة جدًا، أو لهجة عامية مصرية بحتة، أو أكواد برمجية، النماذج العامة هتجيبلك دقة أقل من المتوقع. الحل في الحالات دي: استخدم نماذج متخصصة (BioBERT للطبي، CodeBERT للكود)، أو fine-tune embedding model على بياناتك.
كمان، الـ vectors بتاخد storage معتبر. مليون vector بـ 1536 dimension = حوالي 6 GB في الذاكرة. لو عندك مليار وثيقة، محتاج Vector Database محترف زي Qdrant أو pgvector مع HNSW index، مش بس ملف pickle. الـ trade-off هنا: بتكسب دقة دلالية، بتدفع تكلفة بنية تحتية.
متى لا تستخدم Embeddings
- البحث عن أسماء أو IDs دقيقة. "اعرضلي order #45982" — استخدم SQL أو BM25 مباشرةً، الـ embedding هيضيع وقتك.
- المطابقة الحرفية. بحث في كود برمجي على اسم function معين، أو SKU منتج.
- قواعد بيانات صغيرة (أقل من 1000 سجل). الكلاسيكي أرخص وأسرع وأبسط للصيانة.
- متطلبات real-time صارمة (أقل من 10ms). embedding وحده بياخد 50-100ms، فحساس وقتيًا مش هيفلح إلا بـ caching ذكي.
- محتوى يتغير كل ثانية. تكلفة إعادة الـ embedding بتاكل أي مكسب من البحث الدلالي.
الخطوة التالية
افتح الـ terminal دلوقتي، ثبّت openai و numpy، وجرب الكود اللي فوق على 5 جمل من شغلك الفعلي. شوف الأرقام بنفسك. لما تتأكد إن المفهوم واضح، انتقل لمقال Hybrid Search في RAG اللي بيشرح إزاي تدمج Embeddings مع BM25 لتحسين دقة البحث في الإنتاج بشكل ملموس.
المصادر
- OpenAI Embeddings Documentation: platform.openai.com/docs/guides/embeddings
- Anthropic Embedding Recommendations: docs.anthropic.com/en/docs/build-with-claude/embeddings
- Mikolov et al., "Efficient Estimation of Word Representations in Vector Space", 2013 (ورقة Word2Vec الأصلية).
- MTEB Leaderboard لمقارنة نماذج الـ embedding على مهام مختلفة: huggingface.co/spaces/mteb/leaderboard
- Kusupati et al., "Matryoshka Representation Learning", NeurIPS 2022 (أساس تقليل أبعاد الـ vectors بدون خسارة دقة).