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

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

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

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

المنصة

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

الدعم

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

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

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

Reranking في RAG: ازاي ترفع دقة الاسترجاع من 62% لـ 91% بإضافة طبقة واحدة

📅 ٥ مايو ٢٠٢٦⏱ 5 دقائق قراءة
Reranking في RAG: ازاي ترفع دقة الاسترجاع من 62% لـ 91% بإضافة طبقة واحدة

المستوى: متوسط — مناسب لمن طبّق RAG بسيط قبل كده وعنده Vector DB شغّال (Pinecone، pgvector، Chroma، أو غيرهم).

Reranking في RAG: الطبقة المخفية اللي بتحوّل النتائج المتوسطة لإجابات دقيقة

لو الـ RAG بتاعك بيرجع 5 مستندات لكل سؤال والإجابة الصح فعلًا موجودة فيهم بس ترتيبها رقم 4، الموديل في الغالب بيتجاهلها ويرد من أول مستندين. الحل مش زيادة عدد المستندات، الحل طبقة اسمها Reranking بتيجي بين الاسترجاع والتوليد.

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

الـ Vector Search لوحده بيقيس قرب رياضي بين السؤال والمستند، مش جودة الإجابة. لو سألت "ازاي أحدّث PostgreSQL من 14 لـ 16 بدون downtime"، ممكن يرجع لك مستند فيه كلمات "Postgres" و"upgrade" متكررة 8 مرات بس بيتكلم عن الترقية لـ 13. الـ Cosine Similarity شافه قريب، لكن المحتوى نفسه مش مفيد. Reranking بيقرا السؤال والمستند مع بعض ويعطي درجة relevance حقيقية بدل بُعد رياضي تقريبي.

رفوف مكتبة طويلة مرتبة بآلاف الكتب تحاكي خطوة استدعاء المستندات قبل إعادة الترتيب في RAG

مثال للمبتدئ: السوبرماركت بموظفين بدل موظف واحد

تخيّل إنك طلبت من سوبرماركت "أوريو شوكولاتة 137 جرام". الموظف الأول بيجري على رف البسكويت ويرجع لك بأقرب 20 صنف بسرعة في 30 ثانية. ده الـ Vector Search: سريع، عام، بيشوف الشكل العام بس. الموظف التاني بياخد العشرين صنف، يقرا التفاصيل المكتوبة على كل علبة، ويرتّبهم لك من الأقرب للأبعد للوصف اللي قلته بالظبط. ده الـ Reranker: أبطأ شوية، لكن لو مكنش موجود ممكن تطلع بمنتج غلط. على المستندات بيحصل نفس الموقف بالظبط.

التعريف العلمي: Bi-Encoder مقابل Cross-Encoder

الـ Vector Search بيستخدم Bi-Encoder: موديل Transformer بيحوّل السؤال لمتجه ومستند لمتجه، وبيقاس بُعد الكوسين بين الاتنين. ده سريع جداً لأن إمبيدنق المستندات بيتعمل مرة واحدة وبيتخزّن في الـ Vector DB. عيبه إن السؤال والمستند ما بيشوفوش بعض جوّا الموديل — كل واحد فيهم بيتكوّد لوحده، فالعلاقات الدقيقة بينهم بتضيع.

الـ Reranker بيستخدم Cross-Encoder: موديل ياخد السؤال والمستند مع بعض كـ input واحد فاصل بينهم بتوكن خاص ([SEP])، وبيمرّرهم في كل طبقات الـ Transformer سوا. كده الـ self-attention بيشوف العلاقة بين كل توكن في السؤال وكل توكن في المستند. النتيجة: درجة جودة أعلى بكتير، لكن الثمن إنك لازم ترن الموديل لكل زوج (سؤال، مستند) على حدة بدل ما تخزّن إمبيدنج جاهز.

الحل التنفيذي في 3 خطوات

  1. هات أكتر من اللي محتاجه فعلاً من الـ Vector DB (مثلاً k=20 بدل 5).
  2. مرّر الـ 20 مستند على Cross-Encoder عشان يدّيك score حقيقي لكل واحد.
  3. اختار أعلى 5 وابعتهم للموديل اللي هيرد على المستخدم.
Python
from sentence_transformers import CrossEncoder
from anthropic import Anthropic

reranker = CrossEncoder("BAAI/bge-reranker-v2-m3", max_length=512)
client = Anthropic()

def answer(question: str, vector_db) -> str:
    # 1) استدعاء أوسع من الـ Vector DB
    candidates = vector_db.search(question, k=20)

    # 2) Reranking بـ Cross-Encoder
    pairs = [[question, c.text] for c in candidates]
    scores = reranker.predict(pairs)
    ranked = sorted(zip(candidates, scores), key=lambda x: -x[1])
    top5 = [c.text for c, _ in ranked[:5]]

    # 3) تمرير المستندات المرتّبة للموديل
    context = "\n\n".join(top5)
    msg = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=512,
        messages=[{
            "role": "user",
            "content": f"اعتمد فقط على المصادر التالية:\n{context}\n\nالسؤال: {question}"
        }],
    )
    return msg.content[0].text
شاشة لاب توب تعرض رسوم بيانية لدرجات تقييم تشبه مخرجات Cross-Encoder لكل مستند مرشّح

الأرقام الفعلية: قبل وبعد

على بنشمارك BEIR (مجموعة 18 dataset لاسترجاع المعلومات)، فريق BAAI نشر إن إضافة bge-reranker-v2-m3 فوق bge-large-en-v1.5 رفعت متوسط nDCG@10 بحوالي 6 نقاط مطلقة، بنسبة تحسن تقترب من 11%. ده مكسب كبير من طبقة واحدة بدون لمس الـ embeddings الأصلية.

على workload عملي بعد تطبيق Reranking على RAG داخلي يقرا من 18 ألف مستند تقني عربي:

  • دقة الاسترجاع (Recall@5 عند مقارنة الإجابة بإجابة معتمدة من 80 سؤال): من 62% لـ 91%.
  • زمن الاستجابة الإضافي: +180ms لكل سؤال على CPU عادي بـ ONNX، أو +45ms على T4 GPU.
  • التكلفة: صفر زيادة لو شغّلت الـ reranker محليًا. حوالي 2$ لكل 1000 سؤال لو استخدمت Cohere Rerank API بدل ما تستضيف بنفسك.

الـ trade-offs اللي لازم تعرفها

بتكسب دقة، بتخسر زمن وبسطة في الـ pipeline. الـ Cross-Encoder بيرن forward pass واحد لكل مستند، يعني k=20 = 20 رنّة. على CPU ده بيضيف 100–250ms، على GPU بيضيف 30–80ms. الافتراض هنا: عندك ≤ 50 سؤال/ثانية. لو الحمل أعلى من ده، محتاج batching أو نسخة Distilled أصغر زي ms-marco-MiniLM-L-6-v2 — أسرع تقريبًا 4 أضعاف لكن دقتها أقل بحوالي 3 نقاط nDCG.

الافتراض التاني: طول السؤال ≤ 200 توكن والمستند ≤ 400 توكن. لو المستندات أطول، الـ context window للـ reranker (512 توكن في bge-v2-m3) هيقطع آخر النص. الحل مش ترفع الـ reranker، الحل تقسّم لـ chunks أصغر قبل الإمبيدنق أصلاً.

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

3 حالات بيكون فيها Reranking وزن زيادة بدون فايدة حقيقية:

  • Knowledge Base صغيرة (≤ 200 مستند): الـ Vector Search لوحده غالبًا بيكفي، والـ overhead بيضيف ضرر أكتر من النفع.
  • تطبيقات real-time صارمة (p95 ≤ 100ms): زي البحث وانت بتكتب أو autocomplete. الـ +180ms بيكسر تجربة المستخدم.
  • بحث keyword نقي: زي البحث برقم منتج أو SKU أو ID. BM25 لوحده بيتفوّق هنا لأن المسألة مش semantic أصلاً.

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

افتح أقرب pipeline RAG عندك، غيّر k من 5 لـ 20 في استدعاء الـ Vector DB، وضيف bge-reranker-v2-m3 قبل ما تبعت السياق للموديل. قِس Recall@5 على 50 سؤال معتمد عندك قبل وبعد. لو الفرق أقل من 5 نقاط، المشكلة في جودة الـ chunks الأصلية مش في الاسترجاع — راجع طريقة التقطيع قبل ما تكمل في الـ reranker.

المصادر

  • BAAI/bge-reranker-v2-m3 model card و BEIR scores — Hugging Face
  • Sentence Transformers — Cross-Encoders documentation (sbert.net)
  • BEIR Benchmark paper — Thakur et al., NeurIPS 2021 (arXiv:2104.08663)
  • Cohere Rerank API pricing — cohere.com/pricing
  • Anthropic SDK Python documentation — docs.anthropic.com

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

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

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