تقييم الإجابات
من دون مقياسين منفصلين، ستُحسّن نظامك عشوائيًا
تقييم إجابات نظام RAG
لقد عدّلتَ طريقة التقطيع، وغيّرتَ نموذج التضمين (embedding)، وأضفتَ معيد ترتيب (reranker). يبدو النظام أفضل. ثم يبلّغ أحد المستخدمين عن تراجع في سؤال كان يعمل جيدًا في الأسبوع الماضي. لا يمكنك تأكيد ذلك ولا نفيه، لأن طريقتك الوحيدة في التحقق هي كتابة أربعة أسئلة تحفظها عن ظهر قلب والحكم بأن إجاباتها مرضية. أنت لا تعرف أيًّا من تعديلاتك الثلاثة أفاد ولا أيها أضرّ، ولا إن كان المتوسط قد تحسّن أصلًا.
هذا هو الوضع الافتراضي في معظم مشاريع RAG تقريبًا، وهو ما يجعلها تراوح مكانها. يتكوّن نظام RAG من مرحلتين تفشلان لأسباب مختلفة وتُصلَحان بوسائل مختلفة: الاسترجاع والتوليد. المقياس الإجمالي الواحد يخلط بينهما، ولذلك لا يخبرك أبدًا بما ينبغي إصلاحه. الحد الأدنى من الانضباط هو قياس المرحلتين بشكل منفصل، على مجموعة أسئلة ثابتة، قبل كل تغيير.
بناء المجموعة المرجعية
استهدف ما بين 50 و150 سؤالًا. دون 40 سؤالًا، يتجاوز الضجيج الإحصائي الفروق التي تحاول قياسها. وفوق 200، تصبح تكلفة التوسيم باهظة دون مكسب متناسب.
يحمل كل إدخال السؤال، ومعرّف الوثيقة التي تتضمن الإجابة، وإجابة مرجعية قصيرة. حقل المصدر هو الأهم: فهو الذي يجعل حساب الاستدعاء (recall) ممكنًا بشكل آلي.
from dataclasses import dataclass, field
@dataclass
class Cas:
question: str
sources_attendues: list[str] # identifiants de documents
reponse_reference: str | None = None
categorie: str = "factuelle" # factuelle, references, negative, multi_saut
faits_attendus: list[str] = field(default_factory=list)
jeu = [
Cas("Quelle pénalité s'applique après 48 h d'arrêt à Lyon ?",
["AVENANT-3"], "2 % du montant mensuel par jour entamé, plafond 20 %",
faits_attendus=["2 %", "20 %"]),
Cas("Que couvre le contrat MNT-2019-07 ?",
["MNT-2019-07"], categorie="references"),
Cas("Quel est le taux de remise sur le site de Nantes ?",
[], None, categorie="negative"), # aucune réponse dans le corpus
]
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش