Skip to content
Guides6 min read

إغلاق الحلقة: إعادة أخطاء الوكلاء وخلافات المُقيِّم إلى البشر

وقت المراجعة البشرية هو أندر مورد في تقييم الوكلاء. يجمع Potato 2.6 بين طابور فرز قائم على الإشارات ومحاذاة بين المُقيِّم والبشر، بحيث تصل أسوأ المسارات إلى البشر أولًا ويظل مُقيِّم الـ LLM لديك يتحسّن.

Potato Team

بمجرد أن تبدأ بتقييم الوكلاء على أي نطاق، يتوقف القيد عن أن يكون "هل يمكننا تصنيف هذا" ويصبح "على من ننفق انتباهنا، وعلى ماذا". لديك آلاف المسارات الإنتاجية وحفنة من المراجعين. يستطيع مُقيِّم الـ LLM فرز كل شيء مسبقًا، لكنه غير كامل، والحالات التي يخطئ فيها هي بالضبط الحالات التي تستحق وقت إنسان.

تتعاون ميزتان في Potato 2.6 لإدارة هذه الندرة. طابور فرز قائم على الإشارات يقرّر ما يراه البشر أولًا. والمحاذاة بين المُقيِّم والبشر تقيس مدى اعتمادك على المُقيِّم، وتحسّنه. شغّلهما معًا فتحصل على حلقة تقييم نشطة: يتولى المُقيِّم الحجم السهل، وتقفز الحالات المشبوهة الطابور لتصل إلى البشر، وتتغذّى الخلافات راجعةً لتنتج مُقيِّمًا أفضل.

تتناول هذه المقالة كلا الشطرين وكيف يترابطان.

شارة أولوية أثناء التوصيف توضّح سبب وضع علامة على العنصر للمراجعةشارة طابور الفرز في Potato

شطر الفرز: الأسوأ أولًا، لا الوارد أولًا الصادر أولًا

افتراضيًا، يكون طابور التوصيف بنظام FIFO (الوارد أولًا، الصادر أولًا): تُقدَّم العناصر بالترتيب الذي حُمِّلت به. وهذا هو الترتيب الخاطئ عندما يكون وقت المراجعة شحيحًا. فالمسار النظيف والمسار الذي ألقى فيه الوكيل خطأً يستحقان قدرًا مختلفًا تمامًا من الانتباه البشري، لكن FIFO يعاملهما بالمثل.

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

yaml
triage:
  enabled: true
  order: desc            # high priority first (default)
  show_badge: true       # banner during annotation explaining the priority
  rules:                 # evaluated in order; highest matching priority wins
    - name: "Agent errored"
      priority: 100
      when:
        field: status
        equals: error
    - name: "Negative feedback"
      priority: 80
      when:
        field: feedback
        in: [thumbs_down, negative]
    - name: "Low quality score"
      priority: 60
      when:
        field: score
        lt: 0.5
 
assignment_strategy: priority

تُقيَّم القواعد من الأعلى إلى الأسفل وتفوز أعلى أولوية مطابقة، لذا فإن مسارًا به خطأ ولديه أيضًا تغذية راجعة سلبية يظل يحطّ عند 100. وإذا حذفت rules كليًا، يعود Potato إلى مجموعة افتراضية معقولة (حالة الخطأ عند 100، والتغذية الراجعة السلبية عند 80، والدرجة دون 0.5 عند 60)، بحيث يكون السلوك الجاهز للاستخدام معقولًا قبل أن تضبط أي شيء.

تغطّي معاملات الشرط المقارنات التي تحتاجها فعلًا:

Operatorالمعنى
equalsتطابق تام (السلاسل النصية غير حسّاسة لحالة الأحرف)
inالقيمة واحدة من قائمة
containsالقائمة تحتوي، أو تطابق سلسلة فرعية
lt / lte / gt / gteمقارنة عددية
existsالحقل موجود أو غائب

عندما تكون الإشارة رقمًا أصلًا، يمكنك قراءتها مباشرة من الحقل بدلًا من كتابة قواعد:

yaml
triage:
  enabled: true
  signal_field: quality_score
  invert_signal: true           # lower score => higher priority

يعمل على حركة المرور الحيّة أيضًا

تُحسب درجة الأولوية مرة واحدة عند تحميل العنصر أو استيعابه، ثم تُخزَّن على العنصر، فيبقى التعيين رخيصًا. ويعني التصميم نفسه أن الاستيعاب وقت التشغيل يعمل ببساطة: المسار الذي يُدفَع في منتصف الجلسة عبر نقطة نهاية webhook أو مستطلِع Langfuse يُسجَّل وقت وصوله ويأخذ مكانه في ترتيب الأولوية. فالمسار المنخفض الدرجة أو المعطوب الذي يصل في الثانية ظهرًا يقفز أمام المسارات النظيفة التي لا تزال تنتظر منذ هذا الصباح. وضبط assignment_strategy: priority هو ما يجعل الطابور يخدم فعلًا بذلك الترتيب؛ أما show_badge فمستقل، لذا يظهر لافتة "لماذا وُضعت علامة على هذا" حتى لو أبقيت على استراتيجية مختلفة.

شطر المحاذاة: إلى أي مدى تثق بالمُقيِّم

يقرّر الفرز ما يراه البشر. وتقرّر المحاذاة كم من الباقي يمكنك تسليمه إلى المُقيِّم دون إشراف، وهي تُحكِم المُقيِّم بمرور الوقت.

تُشغِّل محاذاة المُقيِّم مُقيِّم LLM قابلًا للتهيئة على نماذج سبق أن صنّفها مُوصِّفوك، ثم تُبلِغ عن Cohen's κ (كابا كوهين، مقياس للاتفاق)، ومصفوفة ارتباك، وقائمة خلافات مقابل الذهب البشري. والممارسة المعيارية (محاذاة مُقيِّم إلى نحو 100–200 تصنيف ذهبي، وتفحّص أين يختلف، وإعادة كتابة الـ rubric، ثم إعادة التشغيل) هي الحلقة التي بُني حولها هذا.

yaml
ai_support:
  enabled: true
  endpoint_type: "ollama"
  ai_config:
    model: "llama3.2"
    temperature: 0.0
 
judge_alignment:
  enabled: true
  schemas:
    correctness:
      rubric: >
        Label 'correct' only if the agent's answer is factually right and fully
        satisfies the request; otherwise 'incorrect'.
  inline:
    enabled: true                # show the judge verdict beside the human label
    schemas: [correctness]

تُشغِّل المُقيِّم من واجهة برمجة التطبيقات الإدارية، وتُخزَّن التنبؤات مؤقتًا لكل إصدار مطالبة بحيث تكون إعادة التشغيل رخيصة:

bash
curl -X POST localhost:8000/admin/api/judge-alignment/run \
  -H "X-API-Key: <admin-key>" \
  -H "Content-Type: application/json" \
  -d '{"max_per_schema": 200}'

عندما تريد المعايرة، مرِّر rubric محرَّرًا. يُنشئ ذلك إصدار مطالبة جديدًا، فتستطيع مقارنة κ عبر الجولات وأن ترى فعلًا ما إذا كانت إعادة كتابتك قد ساعدت:

bash
curl -X POST localhost:8000/admin/api/judge-alignment/run \
  -H "X-API-Key: <admin-key>" -H "Content-Type: application/json" \
  -d '{"rubrics": {"correctness": "Stricter rubric text..."}}'

يُظهر التقرير، المتاح بصيغة JSON أو كصفحة معروضة على /admin/judge-alignment، قيمة κ مع تفسير Landis–Koch، ومصفوفة الارتباك، وجدول خلافات يضم تعليل المُقيِّم، وسجلًّا لإصدارات المطالبة بحيث يكون تقدّم المعايرة مرئيًا عبر الجولات.

الوضع المضمَّن يضعها أمام المُوصِّف

مع inline.enabled، تعرض كل صفحة توصيف حكم المُقيِّم المخزَّن مؤقتًا بجوار التصنيف البشري (اختياره وثقته وتعليله القابل للتوسيع) إلى جانب κ جارية للمهمة. ويملأ "قبول" الخيار المطابق. ويسجِّل كل حفظ بشري مقارنة بين البشري↔المُقيِّم تتغذّى منها نسبة الاتفاق الجارية، بحيث يتحدّث الـ κ الذي تضبط نحوه مع عمل الناس.

الجمع بين الاثنين

صُمِّمت الميزتان لتتركّبا في حلقة واحدة:

إشارات الإنتاج تغذّي طابور أولوية؛ البشر يراجعون العناصر العليا؛ تصنيفاتهم تقيس kappa المُقيِّم؛ rubric مُحسَّن يتغذّى راجعًاحلقة التقييم النشطة: الفرز، المراجعة البشرية، محاذاة المُقيِّم، تحسين الـ rubric

  1. الفرز يدفع المسارات المعطوبة والمنخفضة الثقة إلى مقدمة الطابور البشري.
  2. يراجع البشر تلك العناصر العالية القيمة، فيُنتجون تصنيفات ذهبية جديدة بالضبط حيث يكون النظام أقل يقينًا.
  3. المحاذاة تُسجِّل المُقيِّم مقابل ذلك الذهب، وتُظهر قائمة الخلافات بدقة أين يفترق المُقيِّم والبشر.
  4. أنت تُحسِّن الـ rubric، وتعيد التشغيل، وتراقب تحرّك κ، ثم تترك المُقيِّم الأفضل معايرةً يستوعب مزيدًا من الحجم السهل بحيث يظل وقت البشر يتدفّق إلى الحالات الصعبة.

تنفق كل دورة من الحلقة الانتباه البشري حيث يكون الأكثر قيمة، وتحوّله إلى مُقيِّم يمكنك الوثوق به خطوة أبعد قليلًا. وهذا هو المغزى كله: لا إزالة الناس من تقييم الوكلاء، بل توجيههم.

تأتي كلتا الميزتين ضمن Potato 2.6. راجع وثائق طابور الفرز ووثائق محاذاة المُقيِّم للمرجع الكامل، وعرض eval_trace لقراءة المسارات ذات الأولوية بسرعة.