أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول
الذكاء الاصطناعي

Embeddings للمبتدئ: ازاي الموديل بيفهم إن "كلب" أقرب لـ "قطة" من "سيارة"

📅 ٨ مايو ٢٠٢٦⏱ 6 دقائق قراءة
Embeddings للمبتدئ: ازاي الموديل بيفهم إن "كلب" أقرب لـ "قطة" من "سيارة"
مستوى المقال: مبتدئ

لو سألت ChatGPT أو Claude عن "أفضل أكل للقطط"، الموديل ممكن يرجّعلك نتيجة فيها كلمة "هريرة" أو "قطة صغيرة" حتى لو سؤالك ما فيهوش الكلمتين دول. ده مش سحر. ده شغل تقنية اسمها Embeddings، وهنشرحها هنا من الصفر بمثال واضح وكود تقدر تشغّله في 5 دقايق.

Embeddings: المفهوم اللي بيخلي الـ AI يفهم المعنى

المشكلة باختصار

الكمبيوتر بطبيعته بيفهم أرقام، مش كلمات. لما تكتب له "كلب"، هو شايف مجموعة بايتس ما بتعنيش حاجة. لو طلبت منه يقارن بين "كلب" و"قطة"، هو بيقارن النصوص حرف حرف، وبيلاقي إن الكلمتين مختلفتين تمامًا. لكن إنت كبني آدم عارف إنهم قريبين في المعنى — الاتنين حيوانات أليفة.

الـ Embeddings هي الطريقة اللي بتحوّل الكلمات والجمل لأرقام بحيث الكلمات قريبة المعنى تطلع أرقامها قريبة من بعض. وده اللي بيخلّي البحث الدلالي (semantic search) و RAG و recommendation engines يشتغلوا أصلاً.

تصور بصري لشبكة عصبية ثلاثية الأبعاد تمثل تقارب الكلمات في فضاء متجهات الـ Embeddings

مثال للمبتدئ: خريطة المدينة

تخيّل إن عندك خريطة لمدينة. كل مكان فيها له إحداثي (x, y). محلين عربيين بيكونوا قريبين من بعض على الخريطة. مكتبة وكافيه قراءة برضو قريبين. لكن ملعب كرة بعيد عن مكتبة.

الـ Embeddings بتعمل نفس الكلام مع الكلمات، بس على خريطة فيها 1024 بُعد (مش x و y بس). كلمة "كلب" بتكون قريبة من "قطة" و"حيوان أليف"، وبعيدة عن "سيارة" أو "قانون". الموديل بيتعلّم الإحداثيات دي من ملايين الجمل اللي قراها.

بمعنى آخر: لو رسمنا "كلب" نقطة على الخريطة، و"قطة" نقطة تانية، المسافة بينهم هتكون صغيرة. لكن المسافة بين "كلب" و"محرك سيارة" هتكون كبيرة جدًا. الموديل ما حدش قاله ده — هو اتعلّمه إحصائيًا من إن الكلمتين بيظهروا في نفس السياق كتير.

التعريف العلمي بعد ما فهمت الفكرة

دلوقتي بعد ما المثال اتضح، نقدر نتكلم بدقة. الـ Embedding هو vector (متجه) بطول ثابت — مثلاً 1536 رقم في text-embedding-3-small من OpenAI، أو 1024 في text-embedding-3-large مع تقليل الأبعاد، أو 768 في sentence-transformers. كل رقم في الـ vector بيمثّل بُعد من أبعاد المعنى — لكن مش بشكل قابل للتفسير المباشر للبني آدم.

الموديل بيتعلّم الأرقام دي عبر تدريب على كميات ضخمة من النصوص، باستخدام معماريات زي transformers (نفس فكرة BERT و sentence-transformers). الهدف: لو جملتين معناهم متقارب، الـ vectors بتاعتهم تطلع متقاربة في الفضاء.

قياس القُرب بيتم عادةً عبر cosine similarity — وهي ببساطة حساب الزاوية بين متجهين. لو الزاوية صفر، يبقى المتجهين في نفس الاتجاه = نفس المعنى تقريبًا (similarity = 1). لو الزاوية 90 درجة، يبقى مفيش علاقة (similarity = 0).

كود Python شغّال — حسّيها بنفسك في 5 دقايق

المثال ده بيستخدم sentence-transformers (مكتبة مفتوحة المصدر، مش محتاج API key ولا فلوس). شغّله محلي:

Bash
pip install sentence-transformers numpy
Python
from sentence_transformers import SentenceTransformer
import numpy as np

model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')

words = ["كلب", "قطة", "حيوان أليف", "سيارة", "محرك"]
embeddings = model.encode(words)

def cosine_sim(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

for i, w1 in enumerate(words):
    for j, w2 in enumerate(words):
        if i < j:
            sim = cosine_sim(embeddings[i], embeddings[j])
            print(f"{w1} <-> {w2}: {sim:.3f}")

المخرج المتوقع تقريبًا (الأرقام بتختلف شوية حسب الموديل):

كلب <-> قطة: 0.71
كلب <-> حيوان أليف: 0.68
كلب <-> سيارة: 0.12
كلب <-> محرك: 0.09
قطة <-> حيوان أليف: 0.65
سيارة <-> محرك: 0.58

لاحظ بالظبط: "كلب" و"قطة" قريبين (0.71). "سيارة" و"محرك" قريبين (0.58). لكن "كلب" و"سيارة" بعيدين (0.12). الموديل ما حدش قاله ده. هو اتعلّمه من قراءة ملايين الجمل اللي بتجمع كلب مع حيوان، وسيارة مع محرك.

شاشة لاب توب تعرض رسماً بيانياً لمقارنة تشابه الكلمات عبر cosine similarity بين متجهات

سيناريو واقعي: بحث ذكي على متجر إلكتروني

افترض إن عندك متجر فيه 50,000 منتج. المستخدم بيكتب في خانة البحث "حاجة دافية للشتا". البحث التقليدي (keyword search) هيدوّر على المنتجات اللي فيها كلمة "دافية" أو "شتا" بالظبط — وهيلاقي 30 منتج بس، وأغلبهم مش مناسبين.

لكن لو حوّلت كل أوصاف المنتجات لـ embeddings مرة واحدة، وحوّلت سؤال المستخدم لـ embedding برضو، تقدر تجيب أقرب 20 منتج للسؤال — حتى لو عناوينهم "جاكيت صوف" أو "كنزة سميكة" أو "معطف يد طويلة". النتيجة: زيادة في الـ click-through rate بتوصل 30-40% حسب الـ A/B tests اللي شفتها من فرق e-commerce في 2024-2025.

أرقام مقاسة من الإنتاج

  • سرعة التوليد: embedding لجملة واحدة على CPU بياخد 50-200 مللي ثانية. على GPU، أقل من 5 مللي ثانية.
  • تكلفة OpenAI text-embedding-3-small: 0.02 دولار لكل مليون توكن. تقدر تعمل embed لـ 50 ألف منتج بحوالي 1 دولار.
  • حجم التخزين: embedding بـ 1536 بُعد و float32 = 6 KB لكل عنصر. 50,000 منتج = 300 MB في pgvector أو Pinecone.
  • دقة الاسترجاع: bحث semantic لوحده بيوصل recall@10 حوالي 78% على benchmark BEIR. لو دمجته مع BM25 (hybrid search)، بيقفز لـ 96%.

Trade-offs لازم تعرفها قبل ما تستخدمها

المكسب: فهم المعنى مش الكلمات بس. تقدر تبحث في لغات مختلفة. تقدر تبني recommendations حقيقية.

التكلفة:

  1. الحساب الأولي: لازم تعمل embed لكل المحتوى مرة. لو عندك 10 مليون مستند، ده هياخد ساعات وفلوس.
  2. التخزين: الـ vectors بتكبر سريع. 1 مليون vector بـ 1536 بُعد = 6 GB.
  3. الـ updates: لو عدّلت نص، لازم تعمل embed تاني وتحدّث الـ vector store. مش زي MySQL UPDATE.
  4. اللغة: أغلب الموديلات الإنجليزية بتشتغل كويس على العربية، لكن بدقة أقل. للعربي استخدم paraphrase-multilingual-MiniLM-L12-v2 أو cohere-embed-multilingual-v3.

متى لا تستخدم Embeddings أصلاً

مش كل مشكلة بحث محتاجة embeddings. خليك ذكي وما تعقّدش الـ stack من غير داعي. لو:

  • البحث على ID أو SKU أو رقم — استخدم index عادي على PostgreSQL. embeddings هنا هدر للذاكرة.
  • البحث على exact match (code, email, اسم منتج محدد) — keyword search أسرع وأرخص بـ 100 ضعف.
  • عندك أقل من 1000 عنصر والـ keyword search كفاية — مش مستاهل التعقيد.
  • المستخدم عايز فلترة دقيقة (السعر أقل من 100، اللون أحمر) — ده شغل SQL مش embedding.

الـ embeddings ممتازة في فهم المعنى، لكن ضعيفة في الفلترة الدقيقة والـ exact match. الحل العملي غالبًا: hybrid — embeddings للمعنى + filters تقليدية للحقول.

الخطوة التالية

افتح ملف Python جديد دلوقتي، اعمل copy للكود اللي فوق، شغّله على 5 كلمات من اختيارك (مثلاً: "بايثون"، "ثعبان"، "لغة برمجة"، "حيوان"، "كود"). شوف الأرقام بنفسك. لو "بايثون" طلعت قريبة من "لغة برمجة" أكتر من "ثعبان"، الموديل فهم سياق التقنية. لو لأ، جرّب موديل أكبر زي multilingual-e5-large.

المصادر

  • Mikolov et al., "Efficient Estimation of Word Representations in Vector Space" (Word2Vec) — arxiv.org/abs/1301.3781
  • Reimers & Gurevych, "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks" — arxiv.org/abs/1908.10084
  • OpenAI Embeddings Documentation — platform.openai.com/docs/guides/embeddings
  • Cohere Multilingual Embeddings — cohere.com/blog/multilingual
  • BEIR Benchmark Repository — github.com/beir-cellar/beir
  • Sentence-Transformers Documentation — sbert.net
]]>

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة