Skip to content
Announcements7 min read

Potato 2.11: محرّك الوسم والوسوم الآلية المُشهَد عليها

يَسِم Potato 2.11 مجموعة البيانات بالنماذج، ويختبر الوسوم الآلية على عيّنة بشرية عمياء، ويكتب شهادة. وتُغلَق الجلسات الخاملة الآن بعد 8 ساعات.

Potato Team

يضيف Potato 2.11 محرّك الوسم، الذي يَسِم مجموعة بيانات باستخدام النماذج ويستعين بعيّنة عشوائية عمياء من الوسوم البشرية ليقيس كم مرة تخطئ النماذج. تحدّد ما يجب أن تستوفيه الوسوم النهائية، مثل ألا تزيد الوسوم الآلية المقبولة الخاطئة على 10%، بثقة 90%. يقبل المحرّك الوسوم الآلية التي يدعمها اختبار إحصائي، ويرسل العناصر الباقية إلى البشر، ويكتب شهادة تسجّل ما اختُبر وعلى كم وسماً بشرياً. ويوسّع الإصدار أيضاً تقرير الاتفاق ليشمل الكائنات ثلاثية الأبعاد، والتأريض الزمني، والتوسيم المتدرّج، وآثار الوكلاء، ويصلح خللاً في الصور قد يحتسب العناصر التي لم يلمسها أحد على أنها أُجيب عنها.

bash
pip install --upgrade potato-annotation

ملاحظات الترقية

صارت الجلسات الخاملة تُغلَق، بعد 8 ساعات افتراضياً. قبل 2.11 لم يكن لـ session_timeout_minutes أي أثر في التطبيق المشغَّل، لأن الفحص كان مسجّلاً على كائن تطبيق يتخلّص منه potato start. أما الآن فالجلسة التي تبقى خاملة مدة أطول من الإعداد تُمسح، ويذهب طلبها التالي إلى صفحة تسجيل الدخول. ستبدأ الأكشاك وأجهزة المختبر المشتركة التي تبقى مسجّلة الدخول طوال الليل في رؤية حالات خروج، لذا ارفع session_timeout_minutes حيث تعتمد دراسة على بقاء الجلسة مفتوحة. ولا تتأثر التوسيمات المحفوظة من قبل.

ثلاثة مفاتيح أقدم تطبع ملاحظة عند بدء التشغيل. تواصل icl_labeling وjudge_calibration وpre_annotation العمل كما كانت تماماً، ويطبع كل منها في stderr سطراً يبدأ بـ NOTE: يسمّي ما يقابله في المحرّك. والملاحظات للعلم فقط، لذا لا يفشل potato validate --strict بسببها. ومن المقرّر حذف هذه المفاتيح في 3.0، ويكتب لك potato label migrate-config كتلة labeling_engine المقابلة.

محرّك الوسم

المحرّك مخصّص للدراسات التي فيها عناصر أكثر مما يستطيع البشر وسمه، ونموذج يصيب في معظم الأحيان. يعامل المحرّك النماذج بوصفها مصادر، تُجرَّب في سلسلة متتالية بالترتيب الذي تسردها به، ويرسل العنصر إلى شخص بعد آخر مصدر. ويمكن أن تكون المصادر نماذج LLM، أو نماذج رؤية ولغة، أو نماذج قرار مثل Laya، أو كواشف YOLO، أو نماذج حَكَم LLM، أو لجان تحكيم، أو نماذج مدرَّبة على وسوم الدراسة نفسها، أو وسوماً لديك أصلاً.

العقد هو ما يختبره المحرّك. والعقد الرئيسي، selective_risk، يضع حداً أعلى لنسبة الوسوم الآلية المقبولة الخاطئة. يختار المحرّك عتبة ثقة على نصف العيّنة العمياء، ويختبرها على النصف الآخر باختبار ذي حدّين أحادي الجانب، مستخدماً Learn-then-Test بتسلسل ثابت. ويجري كل اختبار جديد بمستوى أشدّ، لذا فإن إعادة الإشهاد حتى ينجح اختبارٌ لا تضخّم الثقة. ويُبلغ العقد ppi عن انتشار كل وسم بفترة مبنية بطريقة الاستدلال المدعوم بالتنبؤ (prediction-powered inference)، وتبقى هذه الفترة صحيحة أياً كانت جودة النموذج. ويشغّل no_worse_than_human اختبار المُعلِّق البديل لاستبدال شخص أو حَكَم، ويقارن distributional توزيع وسوم النموذج بطريقة انقسام البشر على العناصر الذاتية.

الإعداد الذي يُشهِد على نموذج LLM واحد في مخطط للمشاعر يضيف مفتاحين إلى دراسة عادية:

yaml
assignment_strategy: engine
 
labeling_engine:
  enabled: true
  sources:
    - id: gemma
      kind: llm
      endpoint_type: vllm
      model: google/gemma-4-12B-it-qat-w4a16-ct
      base_url: http://localhost:8001/v1
      confidence: {method: logprob}
  contracts:
    - id: accuracy
      kind: selective_risk
      schema: sentiment
      error: 0.1
      confidence: 0.9
  budgets:
    human_labels: 400

يقرأ confidence: {method: logprob} ثقة النموذج من احتمالات الرموز، وهذا يحتاج إلى استدعاء واحد لكل عنصر، وعادةً ما يكون الأفضل معايرةً بين طرق الثقة في المحرّك. ويسمح العقد بألا تزيد الوسوم المقبولة الخاطئة على 10%، وثقته البالغة 90% هي القيمة الافتراضية في Potato. ويضع budgets.human_labels حداً أقصى لعدد الطلبات البشرية التي يجوز للمحرّك فتحها، و400 هو الحد الذي يستخدمه المثال النصي المرفق.

يمرّر المثال النصي المرفق مع Potato 481 مراجعة عبر سلسلة متتالية يأتي فيها Laya قبل Gemma 12B. وفي ذلك التشغيل استُوفي عقد الـ 10% على 165 وسماً بشرياً، وقبل المحرّك 316 وسماً آلياً، كلها من Gemma لأن عتبة Laya لم تُثبَّت قط. وكان خطؤها المقيس مقابل الوسوم المرجعية 7.6%. أما مثال آثار الوكلاء ففيه 288 أثراً اصطناعياً مع نتائج مرجعية. أصاب الحَكَم في 80% منها، لكنه أعطى ثقة 1.0 لكل حكم، فلم يجد selective_risk ما يضع عليه عتبة وبقي غير قابل للتحقيق. وفترة PPI لنجاح المهمة من البيانات نفسها، [0.57، 0.76]، غطّت المعدل المرجعي البالغ 0.60، في حين قال الحَكَم وحده 0.76.

حدود العقد المستوفى

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

واجهات المحرّك

يقف ملف engine.sqlite نفسه خلف كل الواجهات، فيمكنك أن تبدأ دراسة في واحدة وأن تُشهِد في أخرى:

  • potato label run|status|certify|certificate|export|calls|distill|optimize|migrate-config في سطر الأوامر؛
  • وواجهة REST API تحت /api/engine/v1؛
  • وخمس أدوات engine_* في خادم MCP؛
  • وpotato.labeling_engine.sdk.Study في Python؛
  • وصفحة إدارة على /admin/labeling-engine تعرض حالة العقود، ومنحنى الخطأ مقابل التغطية، ومخطط موثوقية لكل مصدر، وسجل استدعاءات النماذج.

يكتب potato label export الوسوم مع مصدرها، والشهادة بصيغ JSON وMarkdown وHTML، وبطاقة مجموعة البيانات، وسجل الاستدعاءات. وتشرح صفحة محرّك الوسم دراسة أولى خطوة بخطوة، وتغطي صفحة عقود محرّك الوسم ما يختبره كل عقد وكيف يفشل.

الوضع الفردي

صار بإمكان الوضع الفردي إخفاء اقتراحه. يحجب solo_mode.suggestions وسم نموذج LLM عن كل عنصر أو عن عيّنة عشوائية. فالاقتراح المعروض على الشاشة يجذب الإجابة نحوه، لذا يقرأ التسليم الاتفاقَ على العناصر العمياء. ويمكن أن تكون نماذج القرار (laya وأي خادم /v1/systemone) طبقة أولى سريعة، ويفحص الوضع الفردي ai_budget.cap_usd الخاص بالمشروع قبل بدء الوسم وقبل كل دفعة. ومن الجديد أيضاً مجموعة ذهبية، ولجنة تحكيم للوسم، وترتيب تدريجي للعناصر (curriculum). وحين يكون المحرّك مفعّلاً، يكتب الوضع الفردي تنبؤاته في مخزن المحرّك، فيستطيع المحرّك معايرتها والإشهاد عليها. وتضم صفحة الوضع الفردي الإعدادات.

الاتفاق

صار /admin/iaa يُبلغ عن الاتفاق على spatial_annotation وtemporal_grounding وtiered_annotation ومخططات آثار الوكلاء الخمسة، وكان يتخطاها من قبل بوصفها غير مدعومة. تحصل الكائنات ثلاثية الأبعاد والمقاطع الزمنية على متوسط اتفاق المجموعات المتطابقة، وهو غير مصحَّح للصدفة، وتحصل خطوات آثار الوكلاء على ألفا كريبندورف وكابا كوهين، مع اعتبار كل خطوة من كل أثر وحدةً. ولم يعد /admin/api/agreement يُبلغ عن المخططات المهيكلة، ويحيل إلى /admin/iaa بدلاً من ذلك، لأن تلك المخططات، حين اختُزلت إلى أسماء الوسوم، أظهرت اتفاقاً تاماً بين كل زوج من المُعلِّقين. وصار مقطعان متطابقان طولهما صفر يُحتسبان متفقَين. ويستبعد النشر وPaper Mode المقيّمين الآليين من الوسوم الذهبية وأرقام الاتفاق.

إصلاحات تمسّ دراسات 2.10

ثلاثة إصلاحات قد تغيّر أرقاماً جمعتها أو أبلغت عنها من قبل:

  • كانت صفحة الصور تحفظ إجابة معبّأة مسبقاً من تلقاء نفسها. في مخطط image_annotation مع pre_annotation، كانت اللوحة تحفظ الأشكال المعبّأة مسبقاً على أنها إجابة المُعلِّق حين تعيد ترتيب نفسها بعد التحميل، فيُحتسب العنصر الذي لم يلمسه أحد على أنه أُجيب عنه. وفي دراسة صور على 2.10 فيها توسيمات مسبقة، قد يكون العنصر الذي تطابق أشكاله المحفوظة توسيمه المسبق تماماً لم يُلمس قط، لذا عامل تلك العناصر على أنها غير مراجَعة ما لم تُظهر بيانات التوقيت لديك خلاف ذلك.
  • كان Paper Mode يحسب كابا بشيفرته الخاصة. صار Paper Mode ووحدة الاتفاق يحسبان كابا كوهين عبر الدالة نفسها التي يستخدمها /admin/iaa، لذا قد يختلف كابا الذي أُبلغ عنه من Paper Mode قبل 2.11 عن الذي يعرضه /admin/iaa للبيانات نفسها.
  • كان الفصل في الخلاف والتوسيع التلقائي في Prolific يحتسبان المقيّمين الآليين. كان بوسع المُعلِّقين الآليين إرسال عنصر إلى الفصل في الخلاف، وكان min_human_annotations يُتجاهَل، وكان التوسيع التلقائي في Prolific يحتسب التوسيمات الآلية ضمن الحدود القصوى لكل عنصر.

أما الإصلاحات الباقية فتغيّر ما تستطيع الدراسة فعله. صارت الصور على الخوادم التي لا ترسل ترويسات CORS، مثل cocodataset.org، تُحمَّل. وعلى صورة كهذه، صارت أدوات التعبئة بالفيضان وSAM والتقسيم بموجّه نصي تذكر سبب عجزها عن قراءتها. والشكل المُوسَم مسبقاً الذي لا يحمل color يأخذ لون وسمه بدلاً من أن يُسقَط. وصار زر "Generate prompt" في الوضع الفردي يطلب من نموذج المراجعة كتابة الموجّه الأول. وحالات الرفض عبر potato mcp connect تعود أخطاءً من الأداة بدلاً من نجاحات. وصار اكتشاف الحالات الحدية يعمل على vLLM، الذي لم يكن يُرجع حقول الحالات الحدية حتى أُضيفت إلى مخطط الاستجابة.

تثبيت 2.11

رقِّ باستخدام pip install --upgrade potato-annotation، أو اسحب ghcr.io/davidjurgens/potato:2.11.0. ويحتاج نموذج القرار Laya الذي يعمل داخل العملية إلى الإضافة الجديدة decision، أي pip install 'potato-annotation[decision]'، وهي لا تدخل ضمن all لأنها تجلب torch. وتسرد ملاحظات الإصدار كل تغيير، وتضم صفحة ما الجديد ملخص كل إصدار من 2.x.