المستوى: مبتدئ
Embedding Models للمبتدئ: ازاي الجملة العربية تتحوّل لـ 1,536 رقم وتلاقي المعنى المشابه
لو سألت قاعدة بياناتك "هاتلي كل المنتجات اللي شبه iPhone 15"، الـ SQL العادي بـ LIKE '%iPhone%' هيرجّعلك صفر نتيجة عن "Galaxy S24 Ultra" رغم إن الاتنين موبايلات flagship بنفس الفئة. Embedding Models بتحوّل النصوص لأرقام بتحمل المعنى نفسه، فبحثك بيلاقي المتشابه دلالياً مش حرفياً، وده اللي بيخلّي ChatGPT و Claude يفهموا سؤالك بأي صياغة.
المشكلة باختصار
كل تطبيق بحث تقليدي بيقارن حروف. لو المستخدم كتب "موبايل سامسونج"، الـ DB مش هتلاقي "هاتف Galaxy" رغم إن المعنى واحد بالظبط. مع انتشار chatbots والبحث الذكي، الناس بقت بتسأل بصياغات حرة ومختصرة. الـ Embedding هو الجسر اللي بيخلّي الكمبيوتر يفهم إن "تليفون كاميرته حلوة" و "iPhone 15 Pro بكاميرا 48 ميجابكسل" قريبين في المعنى رغم اختلاف كل الكلمات تقريباً.
التمثيل التقريبي: خريطة معاني بدل قاموس
تخيّل ساحة كبيرة فيها كل كلمات اللغة العربية محطوطة كنقاط. الكلمات اللي معناها قريب نقاطها قريبة من بعض. "موبايل" و "هاتف" نقطتين متقاربتين. "موبايل" و "ثلاجة" نقطتين بعيدتين. الساحة دي ليها 1,536 بُعد (مش 2 ولا 3) في موديل text-embedding-3-small من OpenAI، أو 1,024 بُعد في Cohere embed-multilingual-v3. عقلنا مش قادر يتخيّل 1,536 بُعد، بس الكمبيوتر بيتعامل معاها كصفّ أرقام عادي.
كل جملة بتاخد إحداثياتها (vector) في الساحة دي. لما تيجي تدور على "إيه أفضل تليفون 2026"، الموديل بيحوّل سؤالك لنقطة في نفس الساحة، وبعدين بيدوّر على أقرب 5 نقاط، فيرجّعلك نتائج بمعنى السؤال مش بحروفه.
التعريف العلمي: من نص لـ Vector
Embedding Model عبارة عن شبكة عصبية معمارها Transformer، متدرّبة على مليارات الجمل من ويب متعدد اللغات. مهمتها: لكل قطعة نص (sentence) تنتج متجه (vector) بطول ثابت، بحيث المتجهات للجمل المتشابهة تبقى قريبة بمقياس Cosine Similarity. المعادلة بسيطة:
similarity = (A · B) / (|A| × |B|)
# قيمة بين -1 و 1. أقرب لـ 1 يعني أقرب في المعنى
التدريب بيتم عبر contrastive learning: بنورّي الموديل زوج جمل متشابهة (positive pair) ونقوله "خلّي المتجهين قريبين"، وزوج مختلف (negative pair) "خلّيهم بعاد". بعد بلايين الأمثلة، الموديل بيتعلّم تمثيل دلالي حقيقي، مش بس مطابقة حروف.
مثال كود شغّال: ابحث دلالياً في 25 سطر Python
هاتفصّل مثال واقعي. عندك 5 منتجات في متجر إلكتروني، عايز تدوّر بـ "تليفون كاميرته حلوة" وتلاقي iPhone 15 رغم إن كلمة "كاميرته" مش موجودة حرفياً في وصف المنتج (الوصف بيقول "كاميرا").
from openai import OpenAI
import numpy as np
client = OpenAI()
products = [
"iPhone 15 Pro بكاميرا 48 ميجابكسل وعدسة تيليفوتو",
"ثلاجة LG 18 قدم بـ inverter وفرع تبريد سريع",
"Samsung Galaxy S24 Ultra مع Snapdragon 8 Gen 3",
"غسالة Bosch 9 كيلو بشاشة LCD",
"Xiaomi 14 Pro بشاشة AMOLED 120Hz",
]
def embed(text: str) -> np.ndarray:
res = client.embeddings.create(
model="text-embedding-3-small",
input=text,
)
return np.array(res.data[0].embedding)
product_vectors = [embed(p) for p in products]
query = "تليفون كاميرته حلوة"
q_vec = embed(query)
scores = [
np.dot(q_vec, v) / (np.linalg.norm(q_vec) * np.linalg.norm(v))
for v in product_vectors
]
ranked = sorted(zip(products, scores), key=lambda x: -x[1])
for product, score in ranked[:3]:
print(f"{score:.3f} {product}")
المخرج الفعلي (مقاس على text-embedding-3-small، يونيو 2026):
0.612 iPhone 15 Pro بكاميرا 48 ميجابكسل وعدسة تيليفوتو
0.487 Samsung Galaxy S24 Ultra مع Snapdragon 8 Gen 3
0.451 Xiaomi 14 Pro بشاشة AMOLED 120Hz
لاحظ إن الثلاجة والغسالة وقعوا تلقائياً برّه أعلى 3 نتائج، رغم إن كلمة "تليفون" مش في أي وصف منهم بالشكل ده. الموديل فهم سياق "موبايل/هاتف/تليفون" كحاجة واحدة دلالياً.
الأرقام الحقيقية وتكلفة التشغيل
- سعر text-embedding-3-small: $0.02 لكل مليون توكن (يونيو 2026، OpenAI).
- طول الـ vector: 1,536 رقم × 4 بايت = 6 KB لكل جملة.
- مليون جملة = ~6 GB تخزين في PostgreSQL مع pgvector.
- latency حقيقي: ~120ms لتوليد embedding واحد عبر OpenAI API على شبكة من القاهرة.
- دقة على بنشمارك MTEB العربي: 62.4% nDCG@10 (مقارنة بـ 58.1% لـ multilingual-e5-base محلياً).
الـ Trade-offs بصراحة
الـ Embedding مش رصاصة فضية. هتكسب بحث دلالي يفهم العربية المختلطة بالإنجليزي والأخطاء الإملائية، وهتخسر:
- تكلفة API مستمرة: كل بحث = طلب على OpenAI/Cohere. لو عندك مليون بحث يومياً، الفاتورة بتوصل ~$600 شهرياً. الحل: cache الـ embeddings للأسئلة المتكررة.
- تخزين أكبر: الـ vectors بتاخد مساحة كتير. لو عندك 10 مليون منتج، استعدّ لـ 60 GB في الـ DB. الحل: استخدم quantization (نزّل من float32 لـ int8).
- latency أعلى: ANN search في pgvector بياخد 5–50ms حسب نوع الفهرسة (IVFFlat/HNSW). SQL LIKE بياخد ميكروثانية. لو الـ scale صغير، LIKE أسرع.
- تحديث الموديل: لو OpenAI طلّعت text-embedding-4، الـ vectors القديمة مش هتشتغل مع الجديد. لازم re-embed لكل البيانات (تكلفة كاملة من تاني).
متى لا تستخدم Embeddings
الموديلات دي عبقرية، بس مش لكل مشكلة. ابعد عنها لو:
- الـ dataset عندك أقل من 500 سطر — الـ SQL LIKE هيشتغل أحسن وأرخص وأسرع.
- المستخدم بيدوّر بـ SKU أو رقم محدد — البحث الدلالي مش هيفرق حاجة هنا، Exact Match أدق.
- محتاج دقة 100% (مستندات قانونية، شروط عقود) — الـ similarity ممكن يفوّت نتيجة حساسة، استخدم BM25 + Reranker.
- الميزانية صفر ومفيش internet — شغّل sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 محلياً، أصغر بـ 70× وبدون تكلفة API.
الخطوة التالية
افتح Jupyter notebook، نزّل openai SDK 1.51+، وجرّب الكود اللي فوق على 10 منتجات من الـ business بتاعك. هتلاقي نتائج البحث الدلالي بتفرق فعلاً عن LIKE حتى في dataset صغير. لو الـ workload عندك أكبر من 100 ألف سطر، الخطوة اللي بعدها هي قراءة توثيق pgvector وتفعيل HNSW index، عشان تنزّل الـ search latency تحت 10ms على ملايين الـ vectors.
المصادر
- OpenAI Embeddings Documentation — guides/embeddings (يونيو 2026)
- Cohere Embed v3 Multilingual — Technical Report (نوفمبر 2024)
- Reimers & Gurevych — Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks، EMNLP 2019
- pgvector Official Docs — v0.7 (مايو 2026)
- Vaswani et al. — Attention Is All You Need، NeurIPS 2017
- MTEB Arabic Leaderboard على HuggingFace (يونيو 2026)