إعادة الترتيب (reranking) هي مرور استرجاع ثانٍ يقرأ كل مقطع مرشح في مقابل السؤال الفعلي ويعيد ترتيبه، فينقل الإجابة الصحيحة إلى المرتبة الأولى. معظم أنظمة RAG المالية تتجاهل هذه الخطوة، فيبقى المقطع الصحيح في المرتبة الرابعة عشرة حيث لا يقرؤه المُولِّد أبدًا. تلك الفجوة بين ما تم استرجاعه وما تم ترتيبه هي حيث تتسرب الدقة بهدوء.
المرور الأول للاسترجاع، سواء كان متجهيًا أو BM25 أو هجينًا بينهما، مضبوط لأجل الاستدعاء (recall). فهو يُلقي شبكة واسعة ويُرجع بضع عشرات من المقاطع التي تبدو كلها ذات صلة معقولة. ثم يقرأ نموذج التوليد أفضل ثلاثة إلى خمسة أجزاء فقط. فإذا كان المقطع الذي يذكر قطاع الإيرادات الصحيح أو عتبة التعهد (covenant) الصحيحة يحتل المرتبة الثامنة، يجيب النموذج انطلاقًا من أي شيء نجح في التأهل. تبدو الإجابة سليمة، وهي خاطئة، أو أنها مبنية على الكيان الخطأ، ولا يُنبّه أي شيء في المراحل اللاحقة لأن سجل الاسترجاع يبدو صحيًّا. كان الاستدعاء عاليًا، أما الدقة عند نقطة الاستخدام فلم تكن كذلك.
ما الذي يُخطئ فيه مُسترجِع المرور الأول
المُرمِّز الثنائي (bi-encoder) يُرمِّز الاستعلام والمقاطع كلًّا على حدة ويقارن بينها بحاصل الضرب النقطي (dot product). وهو مضطر لذلك، لأن هذا ما يجعل الفهرس قابلًا للبحث في مللي ثوانٍ عبر ملايين الأجزاء. لكن هذا يعني أن النموذج لا يرى الاستعلام والمقطع معًا أبدًا. فهو يُقرِّب الصلة انطلاقًا من متجهين محسوبين بمعزل عن بعضهما، وعلى النص المالي ينزلق هذا التقريب بطرق يمكن توقعها.
- مقطعان يتناولان المقياس نفسه لكيانين مختلفين يبدوان شبه متطابقين في فضاء التضمين (embedding space). اسأل عن نسبة الرافعة المالية لجهة مُصدِرة معينة، وستمزج أفضل النتائج نسبة جهة نظيرة، لأن مصطلح “صافي الرافعة المالية” (net leverage) يهيمن على المتجه بينما يكاد رمز الكيان لا يحرّكه.
- تنهار الفوارق الزمنية عند نقطة معينة. نسختا الإفصاح ذاته للربع الثاني والربع الثالث متطابقتان دلاليًا تقريبًا كأنهما الجملة نفسها. ولا يوجد لدى المُرمِّز الثنائي سبب يجعله يُفضّل النسخة التي تطابق التاريخ المرجعي (as-of date) الوارد في السؤال.
- تُسطَّح النفي والشروط. عبارة “لا يسري التعهد دون العتبة” وعبارة “يسري التعهد فوق العتبة” تقعان متقاربتين، ولا يستطيع المُسترجِع أن يميّز أيّهما يحتاجه المحلل.
مُعيد الترتيب من نوع المُرمِّز المتقاطع (cross-encoder) يعالج تحديدًا هذه الفئة من الأخطاء. فهو يأخذ الاستعلام ومقطعًا مرشحًا واحدًا كمُدخل واحد ويُجري انتباهًا كاملًا (full attention) عبرهما معًا، فيُقرأ الكيان والتاريخ والشرط في سياقهما بدلًا من تسويتها في متجه واحد. وهو أبطأ بكثير من أن يعمل على متن كامل، ولهذا لا يحلّ أبدًا محلّ المرور الأول للاسترجاع. بل يعمل على الثلاثين أو الخمسين مرشحًا التي ضيّقها المرور الأول مسبقًا، وهي مهمة يستطيع إنجازها داخل حدود طلب اعتيادي.
إضافة مُعيد الترتيب دون تجاوز زمن الاستجابة
الخوف الساذج هو أن نموذجًا ثانيًا في المسار يُضاعف زمن استجابتك. لكن في الواقع، عمل مُعيد الترتيب محدود، وأنت من يتحكم في هذا الحدّ. النمط الذي نستخدمه في معظم عمليات البناء المالية:
- يُرجع المرور الأول مجموعة مرشحين ثابتة. عادةً ما نسحب من 40 إلى 60 مرشحًا من الاسترجاع الهجين، لا أكثر. وما بعد ذلك ترتفع تكلفة مُعيد الترتيب وتتسطّح مكاسب الاستدعاء.
- يُسجّل المُرمِّز المتقاطع جميع المرشحين مقابل الاستعلام في تمريرة أمامية واحدة مُجمّعة على دفعة (batched forward pass). التجميع على دفعات (batching) أمر مهم. إرسال 50 طلبًا منفصلًا بطيء بلا مبرر.
- اقتطع جانب المقطع. إذا كانت أجزاؤك كبيرة، فلا يحتاج مُعيد الترتيب إلا إلى قدر كافٍ من كل جزء ليحكم على الصلة. تحديد سقف لطول المُدخل هو أكبر رافعة منفردة لزمن الاستجابة بعد عدد المرشحين.
- أبقِ مُعيد الترتيب على الجهاز نفسه الذي عليه المُسترجِع، أو قريبًا منه. قفزة شبكية لكل مرشح تُبطل الغاية كلها.
هناك نسخة أرخص تستحق المعرفة. لست مضطرًا دائمًا لإعادة الترتيب. فإذا كانت فجوة درجات المرور الأول بين المرتبة الأولى والثانية واسعة، فالاسترجاع واثق ونادرًا ما تُغيّر إعادة الترتيب الترتيب، فيمكنك تخطّيها وتوفير الميزانية للاستعلامات الغامضة حيث تُحرّك فعلًا المرتبة الأولى. اجعل تشغيل مُعيد الترتيب مشروطًا بهامش الدرجة، وستُنفق قدرة الحوسبة حيث تُغيّر الإجابة.
اختيار النموذج أقل غرابة مما يبدو. مُرمِّز متقاطع صغير في نطاق 100 إلى 300 مليون مُعامِل (parameter)، سواء مُدرَّب بضبط دقيق أو جاهزًا من الرفّ، يتعامل مع معظم المتون المالية. المواءمة مع المجال (domain adaptation) التي تؤتي ثمارها تأتي من أزواج تدريب مسحوبة من متنك أنت، لا من نموذج أكبر. أطعِمه أمثلة سلبية صعبة (hard negatives) بكيانات غير متطابقة وأخرى بأرباع سنة خاطئة، أي الحالات القابلة للالتباس التي يُخطئ فيها المُرمِّز الثنائي باستمرار. بضعة آلاف منها تُعلّم مُعيد الترتيب الفوارق المهمة هنا.
أثبت أنه حرّك الرقم، ثم استمر في مراقبته
مُعيد الترتيب لا يستحق زمن استجابته إلا إذا استطعت أن تُبيّن أنه غيّر جودة الاسترجاع في الحالات التي تهمّك، والطريقة الوحيدة لمعرفة ذلك هي مجموعة تقييم مُحتجزة (held-out) ذات مقاطع صحيحة مُوسومة. قِس المقياس الذي يعكس كيفية استخدام المقاطع. وبما أن المُولِّد يقرأ أفضل بضعة أجزاء، فإن recall@3 و MRR هما الرقمان المهمّان، لا recall@50 الذي بلغه المرور الأول أقصاه بالفعل. فإذا لم يتحرّك recall@3 إلا بالكاد بعد إعادة الترتيب، فإن مُعيد الترتيب لا يُثبت جدواه، ويجب أن تكتشف ذلك في التقييم لا في الإنتاج.
ابنِ مجموعة التقييم من استعلامات حقيقية، مع تحديد المقطع المُجيب بواسطة شخص يعرف المتن، ثم جمّدها. عندما تُبدّل مُعيد الترتيب، أو تُغيّر عدد المرشحين، أو تُعيد تجزئة المستندات، أعد تشغيل المجموعة نفسها وقارِن. كما أن مُعيد الترتيب ينحرف (drifts) مع نمو المتن: أنواع مستندات جديدة وكيانات جديدة لم تُغطِّها أزواج تدريبه قط. فالأزواج القابلة للالتباس التي يتعامل معها اليوم ليست تلك التي ستُنتجها إفصاحات الربع القادم. تعامل مع مُعيد الترتيب بوصفه مكوّنًا تُعيد قياسه وفق جدول زمني منتظم، مع كتابة درجاته ومُدخلاته في مسار التدقيق (audit trail) نفسه الذي يضم بقية مسار الاسترجاع، حتى إذا جرى الاعتراض على إجابة، أمكنك أن تُبيّن أي المقاطع رُتِّبت ولماذا فاز المقطع الأول.
الأسئلة الشائعة
هل أحتاج إلى مُعيد ترتيب (reranker) إذا كان الاسترجاع الهجين لديّ يعمل جيدًا بالفعل؟
إذا كان المرور الأول لديك يضع المقطع الصحيح في المرتبة الأولى على مجموعة التقييم، فأنت لست بحاجة إليه. يُثبت مُعيد الترتيب جدواه عندما يكون المقطع الصحيح موجودًا عادةً ضمن أفضل 30 نتيجة لكن ليس ضمن أفضل 3، وهو أمر شائع بمجرد أن يمزج المتن (corpus) بين الإفصاحات التنظيمية والعقود والملاحظات الداخلية.
كم من زمن الاستجابة يضيفه المُرمِّز المتقاطع (cross-encoder)؟
تسجيل 30 إلى 50 مرشحًا مقابل استعلام واحد على مُرمِّز متقاطع صغير يستغرق عادةً من 50 إلى 200 مللي ثانية على وحدة معالجة رسومية (GPU)، وأطول من ذلك على وحدة المعالجة المركزية (CPU). تتحكم فيه عبر تحديد سقف لعدد المرشحين واقتطاع طول المقطع، وعبر إعادة الترتيب فقط عندما تكون درجات المرور الأول غامضة.
هل يمكنني استخدام نموذج لغوي كبير (LLM) كمُعيد ترتيب بدلًا من نموذج مخصص؟
يمكنك ذلك، وإعادة الترتيب القائمة على القوائم (listwise) باستخدام نموذج لغوي كبير تحقق نتائج جيدة، لكنها أبطأ وأكثر تكلفة لكل استعلام وأصعب في التثبيت لأغراض قابلية التكرار (reproducibility). عادةً ما نُبقي مُرمِّزًا متقاطعًا مخصصًا في المسار المباشر (online) ونحتفظ بإعادة الترتيب عبر النموذج اللغوي الكبير للتقييم غير المتصل (offline) أو تحليل الحالات الصعبة.