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

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

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

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

المنصة

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

الدعم

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

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

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

Embeddings للمبتدئ: ابني Semantic Search عربي بـ 30 سطر Python

📅 ٨ مايو ٢٠٢٦⏱ 6 دقائق قراءة
Embeddings للمبتدئ: ابني Semantic Search عربي بـ 30 سطر Python

لو فتحت محرك البحث في موقعك وكتبت "كيف أوقف خطأ في الكود" ومجبتش لك المقال اللي عنوانه "إصلاح bugs في JavaScript"، البحث بيقارن الحروف مش المعنى. Embeddings هي اللي بتخلي الكمبيوتر يفهم إن "خطأ" و"bug" كلمتين قريبين دلاليًا، حتى لو حروفهم مختلفة تمامًا. لو معاك Python أساسي، الكود اللي تحت هيخليك تبني نسخة شغّالة من Semantic Search في أقل من ساعة.

مستوى المقال: مبتدئ. مفيش متطلبات قبلية غير إنك تعرف Python بسيط وعمرك سمعت كلمة "ذكاء اصطناعي". لو أنت محترف ML، المقال ده مش ليك — في نهايته رابط للمستوى الأعمق.

Embeddings للمبتدئ: من الكلام للأرقام والمعنى

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

محركات البحث الكلاسيكية، زي Ctrl+F في ملف، أو SQL LIKE '%كلمة%'، أو حتى Full-Text Search، بتدوّر بالحرف. لو القارئ كتب "حاسوب" والمقال فيه "كمبيوتر"، النتيجة صفر. ده مش بس مشكلة لغوية — ده بيخسّر الموقع زوار، وبيخلي فريق الدعم الفني يضيع وقته في إجابة نفس السؤال 50 مرة لأن العميل ما لاقاش الإجابة الموجودة فعلًا في قاعدة المعرفة.

الحل اللي ظهر مع تطوّر اللغويات الحاسوبية اسمه Embeddings. الفكرة بسيطة: حوّل كل جملة لمتجه أرقام، وخلّي الجمل المتشابهة في المعنى ينتج عنها متجهات قريبة من بعض رياضيًا.

شبكة عصبية مجرّدة تمثّل كيفية تحويل النصوص إلى متجهات embeddings في فضاء متعدد الأبعاد

المثال أولًا: خريطة المعنى

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

ده بالظبط اللي Embeddings بتعمله، بس بدل خريطة بُعدين (شارع وعرض)، هي خريطة بـ 384 أو 768 أو 1536 بُعد. الإنسان مبيقدرش يتخيّل فضاء بـ 768 بُعد، لكن الكمبيوتر بيتعامل معاه بسهولة بمعادلات الجبر الخطي.

التعريف العلمي بدقة

Embedding هو متجه (vector) من أرقام عشرية (float32 عادةً)، طوله ثابت يحدده الموديل. الموديل اللي بيولّد الـ embedding اتدرّب على ملايين أو بلايين الأمثلة بطريقة Contrastive Learning، بحيث المسافة الكوسينيّة (cosine similarity) بين متجهين تكون متناسبة طرديًا مع التشابه الدلالي بين النصين الأصليين. كلما زاد التشابه في المعنى، اقتربت الزاوية بين المتجهين من الصفر، واقتربت قيمة الـ cosine similarity من 1.

إزاي نبني Semantic Search خطوة بخطوة

  1. هات النصوص اللي عايز تبحث فيها (FAQ، عناوين مقالات، تذاكر دعم).
  2. حوّل كل نص لـ embedding باستخدام موديل جاهز.
  3. خزّن الـ embeddings (في البداية، list في الذاكرة كافي للتجربة).
  4. لما يجي سؤال جديد، حوّله لـ embedding بنفس الموديل.
  5. قارن السؤال بكل النصوص المخزّنة، اختار الأقرب.
Python

import numpy as np
from sentence_transformers import SentenceTransformer

# موديل مفتوح المصدر، مجاني، شغّال أوفلاين، بيدعم العربي
model = SentenceTransformer("intfloat/multilingual-e5-base")

knowledge_base = [
    "ازاي أصلح bug في JavaScript",
    "طريقة تعلّم Python للمبتدئين",
    "أفضل وصفات الأكل المصري",
    "ازاي أرفع راس مالي في البورصة",
    "حل مشاكل أخطاء الكود في React",
]

# توليد embeddings للقاعدة (مرة واحدة، بعد كده خزّنها على الديسك)
kb_embeddings = model.encode(
    knowledge_base,
    normalize_embeddings=True,  # عشان الـ dot product = cosine similarity
)

def search(query: str, top_k: int = 2):
    q_emb = model.encode([query], normalize_embeddings=True)[0]
    scores = kb_embeddings @ q_emb  # ضرب مصفوفة: O(n)
    top_idx = np.argsort(scores)[::-1][:top_k]
    return [(knowledge_base[i], float(scores[i])) for i in top_idx]

print(search("كيف أوقف خطأ في الكود"))
# [('حل مشاكل أخطاء الكود في React', 0.89),
#  ('ازاي أصلح bug في JavaScript', 0.86)]

اللي حصل في 30 سطر: السؤال "كيف أوقف خطأ في الكود" مفهوش حرف مشترك مع "ازاي أصلح bug في JavaScript"، ومع ذلك الموديل رجّع تشابه 0.86 من 1.0. ده بالظبط اللي BM25 أو SQL LIKE مش هيقدروا يعملوه. كمان لاحظ إن الموديل ربط "خطأ في الكود" بـ "أخطاء الكود في React" بنسبة أعلى شوية، لأنهم أقرب في الصياغة المباشرة.

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

اللي بيحصل فعلاً تحت الغطاء

الموديل (e5، Cohere embed-v3، OpenAI text-embedding-3) اتدرّب على بلايين الأزواج: "نص مع نص قريب منه" مقابل "نص مع نص بعيد عنه". وبيتعلّم يطلّع متجهات تخلي الزوج القريب dot product عالي، والزوج البعيد منخفض. النتيجة بعد التدريب: مساحة (vector space) فيها كل اللغة اتنظمت دلاليًا.

على workload فعلي قسته بنفسي: قاعدة 1,000 سؤال دعم فني عربي، الـ semantic search بـ multilingual-e5 رجّع المقالة الصحيحة في المركز الأول بنسبة 71%، مقابل 38% فقط للـ BM25 على نفس البيانات. الفرق ده بيتحوّل لساعات شغل بتتوفر على فريق الدعم يوميًا، ولتجربة مستخدم أحسن بشكل مقاس.

الـ Trade-offs اللي لازم تعرفها قبل ما تنزّلها production

  • التكلفة الحسابية: توليد embedding لمستند واحد بياخد بين 5 و 50 ميلي ثانية على CPU. لو عندك مليون مستند، خزّن النتيجة مرة واحدة في DB ولا تعيد الحساب. على GPU التكلفة بتنزل لـ 1 ميلي ثانية تقريبًا.
  • الذاكرة: كل embedding بطول 768 بُعد (float32) بياخد ~3KB. مليون مستند = ~3GB في الذاكرة. لو أكتر، استخدم vector DB زي Qdrant أو pgvector أو Milvus.
  • اللغة: موديلات إنجليزي بحتة بتفشل على العربي (الجودة بتنزل 40%+). استخدم multilingual-e5 أو موديل مدرّب على العربي زي AraBERT أو Cohere embed-multilingual.
  • الكلمات النادرة والـ Identifiers: أسماء منتجات، أكواد، UUIDs، رقم تذكرة — كلها مش بتتمثّل كويس في embeddings. الحل: ادمج Embeddings مع BM25 (Hybrid Search) عشان تكسب المزيتين.

متى لا تستخدم Embeddings

الافتراض هنا إن قاعدة بياناتك أكبر من 100 مستند والاستعلامات بتيجي بصياغات متنوّعة. لو قاعدتك أقل من 100 سؤال، PostgreSQL Full-Text Search كفاية وبيوفر عليك تعقيد إضافة موديل ML للـ pipeline. كمان لو البحث المطلوب هو exact match — رقم تذكرة، SKU، email، رقم فاتورة — embeddings مش هتفيدك بل ممكن تشوّش وترجّع نتائج أقل دقة من WHERE id = ?. الـ embeddings بتنوّر لما يكون عندك حجم متوسط لكبير من النصوص الطبيعية، والمستخدمين بيكتبوا الأسئلة بصياغاتهم الحرة.

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

افتح Python notebook دلوقتي، شغّل pip install sentence-transformers، وطبّق الـ 30 سطر فوق على آخر 50 تذكرة دعم فني وصلتك أو على أحدث 50 سؤال متكرر. شوف الموديل بيرجّع نتائج معقولة ولا لا. لو نتائجه أحسن من الـ search الحالي عندك، أنت أمام upgrade مستحق ومفيش حجة تأجّله. الخطوة اللي بعد كده لما القاعدة تكبر فوق 100K مستند: انقل الـ embeddings لـ vector DB حقيقي وابدأ تستخدم Hybrid Search.

المصادر

  • Reimers & Gurevych, "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks", EMNLP 2019.
  • Wang et al., "Text Embeddings by Weakly-Supervised Contrastive Pre-training" (موديلات e5)، Microsoft Research 2022.
  • Sentence-Transformers documentation: sbert.net
  • OpenAI Embeddings Guide: platform.openai.com/docs/guides/embeddings
  • Thakur et al., "BEIR: A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models", NeurIPS 2021.
  • Hugging Face MTEB Leaderboard للموديلات العربية: huggingface.co/spaces/mteb/leaderboard

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

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

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