0Pricing
AI Engineering Academy · درس

إعادة الترتيب باستخدام Cross-Encoder مع Cohere وBGE

ادمجوا نقطة نهاية إعادة الترتيب في Cohere ونموذج BGE-reranker لتقييم أزواج الاستعلام والمستند، وأعيدوا ترتيب أفضل k من المقاطع وفق الصلة الحقيقية.

إعادة الترتيب باستخدام Cross-Encoder مع Cohere وBGE درس مجاني في AI Engineering Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Engineering Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

ما هو Cross-Encoder؟

إن cross-encoder نموذج عصبي يأخذ استعلامًا ومستندًا كمدخل واحد مدمج، ثم يُخرج درجة للصلة. وعلى خلاف bi-encoder الذي يضمّن الاستعلام والمستند بشكل منفصل، ترى طبقات الانتباه في cross-encoder النصين معًا في الوقت نفسه، ما يمكّنه من نمذجة إشارات الصلة الدقيقة التي قد يفوّتها bi-encoder. وهذه المعالجة المشتركة هي ما يجعل cross-encoders أكثر دقة بكثير في ترتيب النتائج.

# Bi-encoder: separate encoding
query_vec = encoder.encode(query)          # [768] vector
doc_vec = encoder.encode(document)         # [768] vector
score = cosine_similarity(query_vec, doc_vec)  # compare independently

# Cross-encoder: joint encoding
combined_input = '[CLS] ' + query + ' [SEP] ' + document + ' [SEP]'
logits = cross_encoder.forward(combined_input)  # score from joint attention
# The model attends from every query token to every document token

واجهة Cohere Rerank البرمجية

إن Cohere Rerank واجهة برمجية سحابية لإعادة الترتيب باستخدام cross-encoder، تقبل استعلامًا وقائمة تضم ما يصل إلى 1000 نص مستند، ثم تُرجع درجات الصلة. وتستخدم نماذج cross-encoder كبيرة مدرّبة على مجموعات بيانات عالية الجودة للترتيب، وتتفوّق باستمرار على نماذج cross-encoder الصغيرة المستضافة ذاتيًا في معظم المعايير. تُحتسب تكلفة الواجهة البرمجية لكل ألف مستند يُعاد ترتيبه.

import cohere

co = cohere.Client('YOUR_COHERE_API_KEY')

candidates = [
    'How to configure pgvector in PostgreSQL for vector search',
    'BM25 scoring formula and hyperparameters explained',
    'Installing and using the pgvector extension for embeddings',
    'Hybrid search combining BM25 and dense retrieval',
]

result = co.rerank(
    model='rerank-english-v3.0',
    query='pgvector setup guide',
    documents=candidates,
    top_n=3,
    return_documents=True,
)

for item in result.results:
    print(f'Score {item.relevance_score:.4f}: {item.document.text[:60]}')

استخدام Cohere Rerank في مسار RAG

يتبع دمج Cohere Rerank في مسار RAG نمطًا بسيطًا: استرجع 20 إلى 50 مرشحًا من مخزن المتجهات، واستخرج نصوصها، واستدعِ Cohere Rerank API، ثم خذ أفضل النتائج لتمريرها إلى LLM. تتراوح الزيادة في زمن الاستجابة عادةً بين 100 و300 مللي ثانية، وهو أمر مقبول عندما تؤدي الدقة المحسّنة إلى إجابات نهائية أفضل.

import cohere
from openai import OpenAI

co = cohere.Client('COHERE_KEY')
client = OpenAI()

def rag_with_rerank(question: str, retriever, top_k: int = 5) -> str:
    # Stage 1: coarse retrieval
    candidates = retriever.invoke(question)  # returns 30 docs
    texts = [doc.page_content for doc in candidates]

    # Stage 2: Cohere re-ranking
    rerank_result = co.rerank(
        model='rerank-english-v3.0',
        query=question,
        documents=texts,
        top_n=top_k,
    )
    top_texts = [texts[r.index] for r in rerank_result.results]
    context = '\n\n'.join(top_texts)

    # Stage 3: generation
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'Answer using only the provided context.'},
            {'role': 'user', 'content': f'Context:\n{context}\n\nQuestion: {question}'},
        ],
    )
    return response.choices[0].message.content

BGE Reranker: بديل مفتوح المصدر

إن BGE Reranker (BAAI General Embedding) عائلة مفتوحة المصدر من نماذج cross-encoder، طوّرتها Beijing Academy of AI. ويدعم النموذج BAAI/bge-reranker-v2-m3 إعادة الترتيب متعددة اللغات، ويحقق نتائج قريبة من Cohere Rerank في المعايير الإنجليزية، مع تشغيله محليًا. استخدمه مع مكتبة sentence-transformers لإجراء إعادة ترتيب مستضافة ذاتيًا بالكامل من دون تكاليف واجهة برمجية.

from sentence_transformers import CrossEncoder

# Load BGE reranker model
reranker = CrossEncoder(
    'BAAI/bge-reranker-v2-m3',
    max_length=512,
    device='cpu',  # use 'cuda' if GPU is available
)

def bge_rerank(query: str, documents: list[str], top_k: int = 5) -> list[dict]:
    pairs = [[query, doc] for doc in documents]
    scores = reranker.predict(pairs, show_progress_bar=False)
    ranked = sorted(
        zip(documents, scores.tolist()),
        key=lambda x: x[1],
        reverse=True,
    )
    return [{'text': doc, 'score': score} for doc, score in ranked[:top_k]]

إصدارات نماذج BGE Reranker

تقدم عائلة BGE reranker مفاضلات بين الحجم والجودة. يُعد bge-reranker-base (بـ278 مليون معامل) الأسرع والأصغر. أما bge-reranker-large (بـ560 مليون معامل) فهو أكثر دقة. ويدعم bge-reranker-v2-m3 لغات متعددة، وهو الخيار الافتراضي الموصى به في بيئات الإنتاج. ولتحقيق أقصى دقة، يستخدم bge-reranker-v2-gemma بنية Gemma الأساسية، ويتصدر معظم المعايير الإنجليزية بين الخيارات مفتوحة المصدر.

# Model size vs accuracy trade-offs
models = [
    ('BAAI/bge-reranker-base',   '278M params', 'fast,   English-focused'),
    ('BAAI/bge-reranker-large',  '560M params', 'better, English-focused'),
    ('BAAI/bge-reranker-v2-m3',  '570M params', 'best for multilingual use'),
    ('BAAI/bge-reranker-v2-gemma', '2B params', 'SOTA open-source accuracy'),
]

# For most RAG applications, bge-reranker-v2-m3 offers the best
# balance of accuracy, multilingual support, and inference speed on CPU

تجميع تنبؤات Cross-Encoder

تعالج cross-encoders أزواج (الاستعلام، المستند) واحدًا تلو الآخر افتراضيًا، لكن التنبؤ على دفعات يحسّن معدل المعالجة بدرجة كبيرة عبر تمرير أزواج متعددة إلى النموذج في الوقت نفسه. وتتحكم المعلمة batch_size في عدد الأزواج التي تُعالج معًا. على GPU، تكون أحجام الدفعات بين 32 و128 شائعة. أما على CPU، فتقلل الدفعات الأصغر، التي تتراوح بين 4 و16، الضغط على الذاكرة، مع استمرار تحسين معدل المعالجة مقارنة بالمعالجة التسلسلية.

def batch_rerank(reranker, query: str, documents: list[str],
                 top_k: int = 5, batch_size: int = 32) -> list[dict]:
    pairs = [[query, doc] for doc in documents]

    # Batch prediction
    all_scores = reranker.predict(
        pairs,
        batch_size=batch_size,
        show_progress_bar=len(pairs) > 100,
    )

    ranked = sorted(
        zip(documents, all_scores.tolist()),
        key=lambda x: x[1],
        reverse=True,
    )
    return [{'text': doc, 'score': score} for doc, score in ranked[:top_k]]

تكامل LangChain CrossEncoderReranker

توفر LangChain المكوّن CrossEncoderReranker لضغط المستندات، وهو يدمج إعادة الترتيب باستخدام cross-encoder في نمط ContextualCompressionRetriever. ويتيح لك ذلك تغليف أي مسترجع موجود بمرحلة لإعادة الترتيب باستخدام بضعة أسطر من التعليمات البرمجية فقط، ثم توصيله بأي سلسلة LCEL تقبل واجهة المسترجع.

from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

# Base retriever (coarse stage)
base_retriever = FAISS.from_documents(
    documents, OpenAIEmbeddings()
).as_retriever(search_kwargs={'k': 30})

# Re-ranker (fine stage)
model = HuggingFaceCrossEncoder(model_name='BAAI/bge-reranker-v2-m3')
compressor = CrossEncoderReranker(model=model, top_n=5)

# Combined two-stage retriever
two_stage_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=base_retriever,
)

docs = two_stage_retriever.invoke('how does hybrid search work?')

تفسير الدرجات وتحديد العتبة

لا تمتلك درجات cross-encoder مقياسًا موحدًا. يُخرج BGE reranker قيم logits خامًا، غالبًا ضمن النطاق من -10 إلى +10، بينما تُرجع Cohere درجة صلة مطبّعة بين 0 و1. يمكنك تطبيق حد أدنى للدرجة لاستبعاد المستندات منخفضة الصلة جدًا من السياق المرسل إلى LLM، مما يقلل الضوضاء بدرجة أكبر. ابدأ بعتبة عند المئين الخامس والعشرين للدرجات، ثم اضبطها انطلاقًا من ذلك.

def rerank_with_threshold(reranker, query, documents, top_k=5, min_score=-2.0):
    pairs = [[query, doc] for doc in documents]
    scores = reranker.predict(pairs)

    scored_docs = [
        {'text': doc, 'score': float(score)}
        for doc, score in zip(documents, scores)
        if float(score) >= min_score  # filter low-relevance docs
    ]

    scored_docs.sort(key=lambda x: x['score'], reverse=True)

    if not scored_docs:
        return []  # nothing passed the threshold
    return scored_docs[:top_k]

Cohere مقابل BGE: أيهما تختار؟

استخدم Cohere Rerank عندما تريد واجهة برمجية مُدارة، وتحتاج إلى أعلى دقة في بيانات المؤسسات الإنجليزية، وترغب في تجنب البنية التحتية لوحدات GPU. واستخدم BGE Reranker عندما تحتاج إلى الاستضافة الذاتية لحماية خصوصية البيانات، أو تريد إلغاء تكلفة الواجهة البرمجية لكل استعلام، أو تحتاج إلى دعم لغات متعددة، أو ترغب في التشغيل دون اتصال. يحقق كلاهما درجات NDCG متشابهة في معظم المعايير — لذا يعتمد الاختيار أساسًا على تفضيلات البنية التحتية ونموذج التكلفة.

إعادة ترتيب المحتوى متعدد اللغات

إذا كانت مجموعة مستنداتك أو مستخدموك يشملون لغات متعددة، فاختر cross-encoder متعدد اللغات. يتعامل bge-reranker-v2-m3 مع أكثر من 100 لغة، كما يوفر Cohere Rerank إصدارًا متعدد اللغات من النموذج. وتُدعم أيضًا إعادة الترتيب عبر اللغات — أي تقييم استعلام باللغة الإنجليزية مقابل مستندات بالفرنسية أو الإسبانية — وهو أمر مفيد في عمليات نشر المؤسسات العالمية التي توجد فيها قواعد المعرفة بلغات متعددة.

from sentence_transformers import CrossEncoder

# Multilingual BGE reranker
ml_reranker = CrossEncoder('BAAI/bge-reranker-v2-m3')

# Cross-lingual example: English query, French document
query_en = 'How to configure vector search?'
doc_fr = 'La configuration de la recherche vectorielle dans PostgreSQL'

score = ml_reranker.predict([[query_en, doc_fr]])
print(f'Cross-lingual relevance score: {float(score):.3f}')
# Positive score indicates the document is relevant to the query
# despite being in a different language

تخزين نتائج إعادة الترتيب مؤقتًا

يُعد استدلال cross-encoder الجزء الأبطأ في مسار ذي مرحلتين. وبالنسبة إلى التطبيقات التي تتكرر فيها أزواج (الاستعلام، المستند) نفسها كثيرًا، يمكن أن يؤدي تخزين نتائج إعادة الترتيب مؤقتًا إلى إلغاء عمليات الاستدلال المكررة. أنشئ تجزئة لزوج (الاستعلام، document_id) بوصفه مفتاحًا للتخزين المؤقت، وخزّن الدرجة في Redis مع مدة صلاحية TTL. ومن الشائع أن تتراوح نسبة إصابات التخزين المؤقت بين 30 و50 بالمئة في تطبيقات دعم العملاء، حيث يطرح المستخدمون أسئلة متشابهة كثيرًا.

import redis
import hashlib
import json

r = redis.Redis(host='localhost', port=6379)

def cached_rerank_score(reranker, query: str, doc_text: str, doc_id: str) -> float:
    cache_key = 'rerank:' + hashlib.md5((query + doc_id).encode()).hexdigest()
    cached = r.get(cache_key)
    if cached:
        return float(cached)

    score = float(reranker.predict([[query, doc_text]]))
    r.setex(cache_key, 3600, str(score))  # cache 1 hour
    return score

اختبار سريع

اختبر مدى فهمك لإعادة الترتيب باستخدام cross-encoder مما تعلّمته في هذا الدرس.

مراجعة الدرس

تعلّمت في هذا الدرس أن Cohere Rerank توفر واجهة cross-encoder مستضافة سحابيًا بدقة متقدمة، وأن BGE Reranker بديل مفتوح المصدر للنشر المستضاف ذاتيًا، بما في ذلك المحتوى متعدد اللغات، وأن التجميع على دفعات يحسّن معدل المعالجة بدرجة كبيرة عند تقييم أزواج متعددة من (الاستعلام، المستند). يدمج CrossEncoderReranker في LangChain كلا الخيارين ضمن نمط ContextualCompressionRetriever. في الخطوة التالية، سنطبّق الضغط السياقي لتقليل الضوضاء في المقاطع المسترجعة.

الأسئلة الشائعة

هل درس «إعادة الترتيب باستخدام Cross-Encoder مع Cohere وBGE» مجاني؟

نعم — نص درس «إعادة الترتيب باستخدام Cross-Encoder مع Cohere وBGE» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Engineering Academy، انتقل إلى CoddyKit PRO. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

ماذا ستتعلم في «إعادة الترتيب باستخدام Cross-Encoder مع Cohere وBGE»؟

ادمجوا نقطة نهاية إعادة الترتيب في Cohere ونموذج BGE-reranker لتقييم أزواج الاستعلام والمستند، وأعيدوا ترتيب أفضل k من المقاطع وفق الصلة الحقيقية. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Engineering Academy؟

لا تُشترط خبرة سابقة. AI Engineering Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «إعادة الترتيب باستخدام Cross-Encoder مع Cohere وBGE»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Engineering Academy هذا؟

نعم. كل درس في AI Engineering Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لماذا ينجح الاسترجاع على مرحلتين
  2. إعادة الترتيب باستخدام Cross-Encoder مع Cohere وBGE
  3. الضغط السياقي وتصفية الصلة
  4. قياس أثر إعادة الترتيب
← العودة إلى AI Engineering Academy