الدرس 5 من 23

نماذج التضمين وقواعد البيانات المتجهة

مقارنة نماذج التضمين

3 دقيقة للقراءة

نموذج التضمين هو أساس البحث الدلالي. اختيار النموذج الصحيح يؤثر بشكل كبير على جودة الاسترجاع.

ماذا تفعل التضمينات

التضمينات تحول النص إلى متجهات كثيفة تلتقط المعنى الدلالي:

from openai import OpenAI

client = OpenAI()

# نفس المعنى، كلمات مختلفة → متجهات متشابهة
text1 = "القطة جلست على السجادة"
text2 = "هر استراح على البساط"

emb1 = client.embeddings.create(input=text1, model="text-embedding-3-small")
emb2 = client.embeddings.create(input=text2, model="text-embedding-3-small")

# تشابه جيب التمام سيكون عالياً (~0.85+)

فئات النماذج

الفئة الأمثلة الأفضل لـ
APIs تجارية OpenAI, Cohere, Voyage الإنتاج، سهولة الاستخدام
مفتوحة المصدر BGE, E5, GTE الخصوصية، التحكم بالتكلفة، التخصيص
خاصة بالمجال Legal-BERT, BioBERT المجالات المتخصصة

نماذج API التجارية

تضمينات OpenAI

from openai import OpenAI

client = OpenAI()

def embed_openai(texts: list[str], model: str = "text-embedding-3-small"):
    response = client.embeddings.create(input=texts, model=model)
    return [item.embedding for item in response.data]

# النماذج المتاحة:
# text-embedding-3-small: 1536 بُعد، $0.02/1M رمز
# text-embedding-3-large: 3072 بُعد، $0.13/1M رمز
# text-embedding-ada-002: 1536 بُعد (قديم)

Cohere Embed

import cohere

co = cohere.Client()

def embed_cohere(texts: list[str], input_type: str = "search_document"):
    response = co.embed(
        texts=texts,
        model="embed-english-v3.0",
        input_type=input_type  # "search_document" أو "search_query"
    )
    return response.embeddings

# أوضاع منفصلة للمستندات مقابل الاستعلامات تحسن الاسترجاع

Voyage AI

import voyageai

vo = voyageai.Client()

def embed_voyage(texts: list[str]):
    response = vo.embed(
        texts,
        model="voyage-large-2",
        input_type="document"  # أو "query"
    )
    return response.embeddings

# معروف بأداء ممتاز في مجال الكود والقانون

نماذج مفتوحة المصدر

BGE (تضمين BAAI العام)

from sentence_transformers import SentenceTransformer

# نماذج BGE - دعم متعدد اللغات ممتاز
model = SentenceTransformer('BAAI/bge-large-en-v1.5')

def embed_bge(texts: list[str]):
    # BGE يوصي بإضافة تعليمات للاستعلامات
    return model.encode(texts, normalize_embeddings=True)

def embed_bge_query(query: str):
    # بادئة للاستعلامات تحسن الاسترجاع
    instruction = "Represent this sentence for searching relevant passages: "
    return model.encode(instruction + query, normalize_embeddings=True)

E5 (تضمينات من الخبراء)

from sentence_transformers import SentenceTransformer

model = SentenceTransformer('intfloat/e5-large-v2')

def embed_e5(texts: list[str], is_query: bool = False):
    # E5 يتطلب بادئات
    if is_query:
        texts = [f"query: {t}" for t in texts]
    else:
        texts = [f"passage: {t}" for t in texts]
    return model.encode(texts, normalize_embeddings=True)

مقارنة معيار MTEB

معيار تضمين النص الضخم (MTEB) يوفر مقارنات موحدة:

النموذج درجة MTEB الأبعاد السرعة
voyage-large-2 68.28 1536 سريع (API)
text-embedding-3-large 64.59 3072 سريع (API)
bge-large-en-v1.5 64.23 1024 متوسط
e5-large-v2 62.25 1024 متوسط
text-embedding-3-small 62.26 1536 سريع (API)

ملاحظة: درجات MTEB تختلف حسب نوع المهمة. تحقق من معايير الاسترجاع الخاصة بـ RAG.

اختيار النموذج الصحيح

البداية
البيانات يجب أن تبقى محلياً؟
  ├─ نعم → مفتوح المصدر (BGE, E5)
مجال متخصص (قانون، طب، كود)؟
  ├─ نعم → خاص بالمجال أو Voyage
متطلبات متعددة اللغات؟
  ├─ نعم → BGE-M3 أو Cohere متعدد اللغات
ميزانية محدودة؟
  ├─ نعم → text-embedding-3-small أو مفتوح المصدر
الافتراضي → text-embedding-3-small (أفضل نسبة تكلفة/جودة)

نصائح التنفيذ

class EmbeddingManager:
    """إدارة التضمينات مع التجميع والتخزين المؤقت."""

    def __init__(self, model_name: str, batch_size: int = 100):
        self.model_name = model_name
        self.batch_size = batch_size
        self.cache = {}

    def embed(self, texts: list[str]) -> list[list[float]]:
        # تحقق من الذاكرة المؤقتة
        uncached = [t for t in texts if t not in self.cache]

        if uncached:
            # تجميع للكفاءة
            for i in range(0, len(uncached), self.batch_size):
                batch = uncached[i:i + self.batch_size]
                embeddings = self._embed_batch(batch)
                for text, emb in zip(batch, embeddings):
                    self.cache[text] = emb

        return [self.cache[t] for t in texts]

    def _embed_batch(self, texts: list[str]) -> list[list[float]]:
        # التنفيذ يعتمد على النموذج
        pass

نصيحة تكلفة: text-embedding-3-small من OpenAI يقدم أفضل نسبة تكلفة-إلى-جودة لمعظم حالات الاستخدام. ترقّ فقط لنماذج أكبر إذا تحسنت جودة الاسترجاع بشكل ملموس على بياناتك.

التالي، لنستكشف خيارات قواعد البيانات المتجهة لتخزين والبحث في التضمينات. :::

اختبار

الوحدة 2: نماذج التضمين وقواعد البيانات المتجهة

خذ الاختبار