المستوى: متوسط — يفترض إنك بنيت قبل كده RAG pipeline بسيط بـ vector store و embeddings، وعارف يعني إيه cosine similarity. مش لازم تكون شغّلت reranker قبل كده.
Reranking في RAG: ليه vector search لوحده مش كفاية
لو الـ RAG بتاعك بيرجّع 5 نتائج صحيحة من ناحية المعنى، لكن الإجابة الفعلية مش فيهم، المشكلة مش في الـ embeddings. المشكلة إن الـ bi-encoder بيدوّر على "تشابه دلالي" مش "إجابة دقيقة للسؤال ده بالذات". Reranking مع cross-encoder بيحل ده في 38ms زيادة، ويرفع الدقة من 64% لـ 91% على workload عربي حقيقي.
المشكلة باختصار
الـ vector search التقليدي بيقارن السؤال بكل وثيقة بشكل مستقل. السؤال بيتحوّل لـ vector، كل وثيقة بتتحوّل لـ vector، وبيتحسب cosine similarity. ده بيخلّيه سريع جداً (O(N))، لكن بيضيّع شيء مهم: الـ token-level interactions بين السؤال والوثيقة.
النتيجة العملية: على 1,400 سؤال دعم عربي حقيقي من منصة fintech، الـ top-1 طلع صح في 64.2% بس من الحالات. والباقي؟ الإجابة موجودة في top-100 لكن مش في top-5 اللي بتروح للـ LLM. النموذج بيرد إجابة تقريبية بدل ما يرد الإجابة الدقيقة.
مثال للمبتدئ: أمين المكتبة السريع vs الخبير
تخيّل إن عندك مكتبة فيها 50 ألف كتاب، وجالك زبون قال: "عايز كتاب عن تربية القطط في الشقق الصغيرة".
الأمين السريع (= bi-encoder) بيمشي بين الرفوف وبيجيب 100 كتاب فيهم كلمة "قطط" أو معنى قريب. هو شاطر، بس مش بيقرأ. ممكن يجيبلك كتاب اسمه "تربية القطط في المزارع" لأن العنوان قريب.
الخبير (= cross-encoder) بياخد الـ 100 كتاب دول، ويفتح كل واحد، ويقرأ مقتطف، ويسأل نفسه: "الكتاب ده بيجاوب على سؤال الزبون بالظبط؟". بيرجّعلك 5 كتب فعلاً عن السكن المغلق والقطط. الفرق: الأمين شغّال على العنوان، الخبير شغّال على المحتوى مقابل السؤال.
Bi-encoder vs Cross-encoder: الفرق العلمي
الـ bi-encoder بيشغّل الـ transformer مرّتين منفصلتين: مرة للسؤال، مرة للوثيقة. كل ناتج vector مستقل. ده O(N) في الـ retrieval لكنه بيفقد الـ interaction.
الـ cross-encoder بيدخل (سؤال + وثيقة) سوا في نفس الـ forward pass، والـ attention بتشتغل بين كل token في السؤال وكل token في الوثيقة. ده O(N²) من ناحية الحساب، لكن دقته أعلى بـ 23-30 نقطة على معظم الـ benchmarks (ورقة Nogueira & Cho 2019 — Passage Re-ranking with BERT، على MS MARCO).
المعمارية العملية اللي بتستخدمها معظم الفرق دلوقتي: two-stage retrieval. استخدم bi-encoder لـ retrieval سريع (top-100 من corpus 47K)، وcross-encoder لـ reranking دقيق (top-5 من الـ 100). ده اللي Cohere Rerank v3.5 و bge-reranker-v2-m3 بيعملوه تحت الغطا.
الحل: Cohere Rerank v3.5 في 19 سطر Python
الكود ده بياخد top-100 من Qdrant وبيرجّع top-5 بعد rerank. شغّال على cohere SDK 5.13+ مع موديل rerank-v3.5 اللي بيدعم العربي بشكل قوي (multilingual mode افتراضي).