إغلاق الحلقة: إعادة أخطاء الوكلاء وخلافات المُقيِّم إلى البشر
وقت المراجعة البشرية هو أندر مورد في تقييم الوكلاء. يجمع Potato 2.6 بين طابور فرز قائم على الإشارات ومحاذاة بين المُقيِّم والبشر، بحيث تصل أسوأ المسارات إلى البشر أولًا ويظل مُقيِّم الـ LLM لديك يتحسّن.
بمجرد أن تبدأ بتقييم الوكلاء على أي نطاق، يتوقف القيد عن أن يكون "هل يمكننا تصنيف هذا" ويصبح "على من ننفق انتباهنا، وعلى ماذا". لديك آلاف المسارات الإنتاجية وحفنة من المراجعين. يستطيع مُقيِّم الـ LLM فرز كل شيء مسبقًا، لكنه غير كامل، والحالات التي يخطئ فيها هي بالضبط الحالات التي تستحق وقت إنسان.
تتعاون ميزتان في Potato 2.6 لإدارة هذه الندرة. طابور فرز قائم على الإشارات يقرّر ما يراه البشر أولًا. والمحاذاة بين المُقيِّم والبشر تقيس مدى اعتمادك على المُقيِّم، وتحسّنه. شغّلهما معًا فتحصل على حلقة تقييم نشطة: يتولى المُقيِّم الحجم السهل، وتقفز الحالات المشبوهة الطابور لتصل إلى البشر، وتتغذّى الخلافات راجعةً لتنتج مُقيِّمًا أفضل.
تتناول هذه المقالة كلا الشطرين وكيف يترابطان.
شارة طابور الفرز في Potato
شطر الفرز: الأسوأ أولًا، لا الوارد أولًا الصادر أولًا
افتراضيًا، يكون طابور التوصيف بنظام FIFO (الوارد أولًا، الصادر أولًا): تُقدَّم العناصر بالترتيب الذي حُمِّلت به. وهذا هو الترتيب الخاطئ عندما يكون وقت المراجعة شحيحًا. فالمسار النظيف والمسار الذي ألقى فيه الوكيل خطأً يستحقان قدرًا مختلفًا تمامًا من الانتباه البشري، لكن FIFO يعاملهما بالمثل.
يعيد طابور الفرز ترتيب الطابور وفق إشارة جودة لكل عنصر. يمكن أن تكون الإشارة خطأً من الوكيل، أو إبهامًا للأسفل في الإنتاج، أو درجة آلية منخفضة، أو أي حقل في بياناتك:
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 | الحقل موجود أو غائب |
عندما تكون الإشارة رقمًا أصلًا، يمكنك قراءتها مباشرة من الحقل بدلًا من كتابة قواعد:
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، ثم إعادة التشغيل) هي الحلقة التي بُني حولها هذا.
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]تُشغِّل المُقيِّم من واجهة برمجة التطبيقات الإدارية، وتُخزَّن التنبؤات مؤقتًا لكل إصدار مطالبة بحيث تكون إعادة التشغيل رخيصة:
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 محرَّرًا. يُنشئ ذلك إصدار مطالبة جديدًا، فتستطيع مقارنة κ عبر الجولات وأن ترى فعلًا ما إذا كانت إعادة كتابتك قد ساعدت:
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، تعرض كل صفحة توصيف حكم المُقيِّم المخزَّن مؤقتًا بجوار التصنيف البشري (اختياره وثقته وتعليله القابل للتوسيع) إلى جانب κ جارية للمهمة. ويملأ "قبول" الخيار المطابق. ويسجِّل كل حفظ بشري مقارنة بين البشري↔المُقيِّم تتغذّى منها نسبة الاتفاق الجارية، بحيث يتحدّث الـ κ الذي تضبط نحوه مع عمل الناس.
الجمع بين الاثنين
صُمِّمت الميزتان لتتركّبا في حلقة واحدة:
حلقة التقييم النشطة: الفرز، المراجعة البشرية، محاذاة المُقيِّم، تحسين الـ rubric
- الفرز يدفع المسارات المعطوبة والمنخفضة الثقة إلى مقدمة الطابور البشري.
- يراجع البشر تلك العناصر العالية القيمة، فيُنتجون تصنيفات ذهبية جديدة بالضبط حيث يكون النظام أقل يقينًا.
- المحاذاة تُسجِّل المُقيِّم مقابل ذلك الذهب، وتُظهر قائمة الخلافات بدقة أين يفترق المُقيِّم والبشر.
- أنت تُحسِّن الـ rubric، وتعيد التشغيل، وتراقب تحرّك κ، ثم تترك المُقيِّم الأفضل معايرةً يستوعب مزيدًا من الحجم السهل بحيث يظل وقت البشر يتدفّق إلى الحالات الصعبة.
تنفق كل دورة من الحلقة الانتباه البشري حيث يكون الأكثر قيمة، وتحوّله إلى مُقيِّم يمكنك الوثوق به خطوة أبعد قليلًا. وهذا هو المغزى كله: لا إزالة الناس من تقييم الوكلاء، بل توجيههم.
تأتي كلتا الميزتين ضمن Potato 2.6. راجع وثائق طابور الفرز ووثائق محاذاة المُقيِّم للمرجع الكامل، وعرض eval_trace لقراءة المسارات ذات الأولوية بسرعة.