Loading
Loading
Embeddings هي طريقة تحويل النصوص إلى أرقام بطريقة تحتفظ بالمعنى الدلالي. إنها اللبنة الأساسية لبناء أنظمة RAG والبحث الذكي.
Embedding هو تمثيل رياضي (متجه/vector) لنص ما في فضاء متعدد الأبعاد.
المميزة الجوهرية: النصوص المتشابهة في المعنى تكون قريبة في هذا الفضاء.
"القطة تجلس على السجادة" → [0.23, -0.71, 0.45, ...] (1536 بُعد)
"الهرة فوق البساط" → [0.25, -0.69, 0.43, ...] قريب جداً!
"الطقس غداً ممطر" → [-0.82, 0.31, -0.55, ...] بعيد تماماً
أشهر طريقة لحساب قرب متجهين:
similarity = cos(θ) = (A · B) / (|A| × |B|)
| النموذج | الأبعاد | الاستخدام | |---------|---------|-----------| | text-embedding-3-small (OpenAI) | 1536 | سريع وفعّال | | text-embedding-3-large (OpenAI) | 3072 | أدق للبحث الدقيق | | voyage-3-large (Anthropic) | 1024 | الأفضل مع Claude | | all-MiniLM-L6-v2 (Hugging Face) | 384 | مجاني وسريع |
1. البحث الدلالي (Semantic Search): بدلاً من البحث بالكلمات الحرفية، نبحث بالمعنى.
الاستعلام: "كيف أحسّن أداء تطبيقي؟"
يجد: "تحسين Performance في Next.js" (رغم أنها لا تحتوي "أداء")
2. التوصيات: محتوى مشابه لما شاهده المستخدم.
3. كشف التكرار: إيجاد المستندات المتكررة أو المتشابهة.
4. التصنيف Zero-Shot: تصنيف نصوص بدون تدريب — نقيس المسافة من labels.
المستندات الطويلة تُقسَّم إلى chunks قبل الـ Embedding:
استراتيجيات Chunking:
Fixed Size: كل 512 حرف
Sentence: جملة واحدة لكل chunk
Paragraph: فقرة واحدة
Semantic: مقاطع ذات معنى متكامل (الأفضل)
نصيحة: overlap بين الـ chunks يُحسّن استرجاع السياق:
[chunk 1: أحرف 0-500]
[chunk 2: أحرف 400-900] ← 100 حرف overlap
[chunk 3: أحرف 800-1300]
بدلاً من embedding كل نص على حدة، أرسلها دفعةً:
texts = ["نص 1", "نص 2", ..., "نص 1000"]
embeddings = model.encode(texts, batch_size=64) # أسرع بكثير
import numpy as np
from sentence_transformers import SentenceTransformer # pip install sentence-transformers
print("=" * 55)
print("Embeddings: التشابه الدلالي")
print("=" * 55)
# نموذج مجاني يعمل محلياً
model = SentenceTransformer("all-MiniLM-L6-v2")
# ─────────────────────────────────────────
# 1. توليد الـ Embeddings
# ─────────────────────────────────────────
sentences_ar = [
"القطة تجلس على السجادة",
"الهرة فوق البساط",
"كلب يركض في الحديقة",
"أحب تناول القهوة في الصباح",
"الشاي المسائي ممتع",
"الذكاء الاصطناعي يغير العالم",
]
print("\n1. توليد Embeddings...")
embeddings = model.encode(sentences_ar)
print(f"شكل مصفوفة الـ embeddings: {embeddings.shape}")
print(f"(عدد الجمل × أبعاد كل embedding)")
# ─────────────────────────────────────────
# 2. حساب Cosine Similarity
# ─────────────────────────────────────────
def cosine_similarity(a: np.ndarray, b: np.ndarray) -> float:
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
print("\n2. مصفوفة التشابه:")
print(f"{'':30s}", end="")
for s in sentences_ar:
print(f"{s[:8]:10s}", end="")
print()
for i, (s1, e1) in enumerate(zip(sentences_ar, embeddings)):
print(f"{s1[:30]:30s}", end="")
for j, (s2, e2) in enumerate(zip(sentences_ar, embeddings)):
sim = cosine_similarity(e1, e2)
color = "🟢" if sim > 0.7 and i != j else ("🟡" if sim > 0.4 else "⚪")
print(f"{color}{sim:.2f} ", end="")
print()
# ─────────────────────────────────────────
# 3. البحث الدلالي
# ─────────────────────────────────────────
print("\n3. البحث الدلالي:")
# قاعدة معرفة صغيرة
knowledge_base = [
{"id": 1, "text": "Python هي لغة برمجة مفسّرة عالية المستوى"},
{"id": 2, "text": "تعلم الآلة يستخدم خوارزميات لاستخراج الأنماط من البيانات"},
{"id": 3, "text": "الشبكات العصبية مستوحاة من الدماغ البشري"},
{"id": 4, "text": "RAG يربط LLM بمصادر معرفة خارجية"},
{"id": 5, "text": "Vector Database تخزن وتبحث في الـ embeddings بكفاءة"},
{"id": 6, "text": "Transformer architecture غيّرت مجال NLP"},
]
kb_texts = [doc["text"] for doc in knowledge_base]
kb_embeddings = model.encode(kb_texts)
def semantic_search(query: str, top_k: int = 3) -> list:
q_emb = model.encode([query])[0]
scores = [cosine_similarity(q_emb, kb_emb) for kb_emb in kb_embeddings]
ranked = sorted(zip(scores, knowledge_base), key=lambda x: -x[0])
return ranked[:top_k]
queries = [
"كيف تعمل الشبكات العصبية؟",
"ما هي قاعدة البيانات المناسبة للـ AI؟",
"ما الفرق بين RAG وLLM العادي؟",
]
for query in queries:
print(f"\n🔍 الاستعلام: '{query}'")
results = semantic_search(query)
for score, doc in results:
print(f" ({score:.3f}) {doc['text']}")
# ─────────────────────────────────────────
# 4. Chunking مستند طويل
# ─────────────────────────────────────────
print("\n4. Chunking استراتيجية:")
def chunk_text(text: str, chunk_size: int = 200, overlap: int = 50) -> list[str]:
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunk = text[start:end]
if len(chunk.strip()) > 20:
chunks.append(chunk)
start += chunk_size - overlap
return chunks
long_doc = """الذكاء الاصطناعي هو مجال واسع يشمل تعلم الآلة والتعلم العميق.
تعلم الآلة يستخدم الخوارزميات لتعلم الأنماط من البيانات بدون برمجة صريحة.
التعلم العميق يعتمد على شبكات عصبية عميقة لحل مشاكل معقدة.
نماذج اللغة الكبيرة مثل GPT وClaude هي تطبيقات متقدمة للتعلم العميق.
هذه النماذج تدرّبت على تريليونات الكلمات من الإنترنت والكتب."""
chunks = chunk_text(long_doc, chunk_size=100, overlap=20)
print(f"طول المستند: {len(long_doc)} حرف → {len(chunks)} chunks")
for i, chunk in enumerate(chunks, 1):
print(f" Chunk {i}: '{chunk[:50].strip()}...'")