Skip to content

محرّك الوسم

وسِم مجموعة بيانات باستخدام النماذج، واختبر الوسوم الآلية مقابل عيّنة عشوائية عمياء من الوسوم البشرية، ثم انشر مجموعة البيانات مع شهادة بما اختُبر.

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

يتوفر المحرّك بدءاً من Potato 2.11. ويشغّله خادم التوسيم، وسطر الأوامر potato label، وواجهة REST API، وخادم MCP، وPython SDK، وكلها تعمل على ملف engine.sqlite نفسه في مجلد المهمة.

متى يناسب المحرّك الدراسة

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

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

من تنبؤ النموذج إلى الوسم النهائي

يحفظ المحرّك تنبؤات الآلة وطلبات البشر ونتائج العقود في مخزن واحد، ويمرّ كل عنصر بالخطوات الست نفسها:

  1. المصادر هي النماذج. قد يكون المصدر نموذج LLM، أو نموذج رؤية ولغة، أو نموذج قرار (Laya أو Jev أو OpenJev)، أو كاشف كائنات، أو نموذج حَكَم LLM، أو نموذجاً مدرَّباً على وسوم الدراسة نفسها، أو لجنة تحكيم من مصادر أخرى، أو وسوماً لديك أصلاً. ويسجّل كل مصدر درجة ثقة مع كل تنبؤ.
  2. تُرتّب السلسلة المتتالية (cascade) المصادر. يذهب العنصر إلى المصدر الأول، وإن لم يقبل العقد تلك الإجابة جرّبه المصدر التالي. وبعد آخر مصدر يذهب العنصر إلى شخص.
  3. الطلبات هي ما يطلبه المحرّك من البشر. يسجّل كل طلب سبب إنشائه (مثل المعايرة أو الإشهاد أو التحقق أو التدقيق)، واحتمال أن يكون عنصره قد سُحب في العيّنة، وما إذا كان الشخص قد رأى إجابة آلية. وتُسحب طلبات المعايرة عشوائياً، وهي عمياء دائماً.
  4. تختبر العقود الوسوم الآلية مقابل الوسوم البشرية على العيّنة العشوائية. يختار نصف تلك العيّنة (قسم dev) قاعدة القبول، ويختبرها النصف الآخر (قسم cert). وحالة العقد هي met أو insufficient (يلزم مزيد من الوسوم، مع تقدير لعددها) أو infeasible أو violated أو stale.
  5. يعطي الحسم كل عنصر وسمه النهائي. والوسم إما وسم آلي مقبول بموجب عقد مستوفى، أو وسم وضعه شخص، أو معلّق.
  6. تسجّل الشهادة نتيجة كل عقد، والسلسلة المتتالية مع إصدارات النماذج والموجّهات، وعدد الوسوم البشرية التي ذهبت إلى كل غرض، وإنفاق النماذج، وملخّصاً (digest) لسجل الاستدعاءات.

القواعد التي تقوم عليها الضمانات

العقد المستوفى عبارة إحصائية عن العيّنة العشوائية التي وسمها البشر، وهو صحيح بسبب الطريقة التي تُسحب بها تلك العيّنة وتُستخدم. ويفرض المحرّك خمس قواعد:

  • الطلبات العمياء لا تعرض أي إجابة آلية. ما دام شخص يحمل طلب معايرة أو إشهاد أو تدقيق، يحجب الخادم كل إجابة آلية عن ذلك العنصر. فالتوسيم المسبق، والحَكَم المضمّن، ومساعد الذكاء الاصطناعي (الذي يجيب بـ 403)، وأزرار المساعدة بالذكاء الاصطناعي كلها معطّلة. فالوسم الذي يُعطى بعد رؤية إجابة الآلة ليس فحصاً مستقلاً لتلك الإجابة.
  • الاختيار والاختبار يستخدمان وسوماً مختلفة. تُختار العتبات على وسوم dev وتُختبر على وسوم cert. ويجري كل اختبار جديد على وسوم cert بمستوى أشدّ، لذا فإن إعادة الإشهاد حتى ينجح اختبارٌ لا تضخّم الثقة.
  • البشر وحدهم يُشهِدون. يجوز للمُعلِّقين الآليين المشاركة في استنتاج الوسم النهائي، ولا يشاركون أبداً في الوسوم التي يُختبر العقد مقابلها.
  • أي تغيير يجعل الشهادة قديمة. تغيير مصدر أو موجّه أو عتبة أو المخطط يضع على كل عقد متأثر الحالة stale، وينقل وسومه المقبولة إلى pending_recert حتى يُختبر العقد من جديد. وتُحفظ الوسوم البشرية.
  • تنبؤات الآلة لا تشغل خانات المُعلِّقين. لا تُحتسب تنبؤات المحرّك ضمن الحدود القصوى للمُعلِّقين لكل عنصر.

لا يتحقق المحرّك من صواب الوسوم البشرية. فكل عقد يقيس الآلات مقابل الأشخاص الذين وسموا العيّنة، لذا فإن عقداً اختُبر مقابل أشخاص غير موثوقين يشهد بالاتفاق مع أشخاص غير موثوقين. استخدم ضبط الجودة والتداخل (humans.overlap) والعقد no_worse_than_human لفحص البشر أيضاً.

دراسة أولى

يأتي Potato بثلاث دراسات مثالية تحت examples/labeling-engine/، واحدة لكلٍّ من النصوص والصور وآثار الوكلاء. ويسرد الجدول المصادر والعقود التي تستخدمها كل واحدة:

المثالالمصادرالعقود
text-certified-sentiment/Laya (نموذج قرار)، ونموذج LLM عبر Ollamaمخاطرة انتقائية عند 10%، وانتشار PPI
image-objects-and-people/كاشف YOLOv8n، ونموذج رؤية عبر Ollamaمخاطرة انتقائية على الصناديق (IoU) وعلى وسم يشير إلى وجود شخص
agent-trace-judge/نموذج حَكَم LLM مع تبديل ترتيب الوسوممخاطرة انتقائية، وليس أسوأ من البشر، ونجاح المهمة عبر PPI

يعمل المثال النصي بأربعة أوامر. الأول يَسِم كل عنصر بالسلسلة المتتالية ويسحب أول عيّنة عمياء، والثاني يقدّم تلك العيّنة إلى البشر، والأخيران يختبران العقود ويطبعان الشهادة بعد أن يَسِم البشر العيّنة:

bash
potato label run examples/labeling-engine/text-certified-sentiment/config.yaml
potato start examples/labeling-engine/text-certified-sentiment/config.yaml -p 8000
potato label certify examples/labeling-engine/text-certified-sentiment/config.yaml
potato label certificate examples/labeling-engine/text-certified-sentiment/config.yaml --format md

لإضافة المحرّك إلى دراستك، أضف هذه المفاتيح إلى إعداد يحتوي أصلاً على data_files وعلى مخطط توسيم اسمه sentiment. يشترط العقد ألا تزيد الوسوم الآلية المقبولة الخاطئة على 10%، بثقة 90%، ويضع budgets.human_labels حداً أقصى لعدد الطلبات البشرية التي يجوز للمحرّك فتحها:

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

يحدّد المصدر ثقته من الاحتمالات اللوغاريتمية للرموز (method: logprob)، وهي طريقة تحتاج إلى استدعاء واحد لكل عنصر، وعادةً ما تكون الأفضل معايرةً بين طرق تقدير الثقة. تسرد صفحة الإعداد كل مفتاح، وتشرح صفحة العقود ما يختبره كل عقد.

الطلبات في صفحة التوسيم

مع assignment_strategy: engine، تُقدَّم للمُعلِّقين طلبات المحرّك، الأعلى أولوية أولاً. والترتيب هو: الفصل في الخلاف، ثم الإشهاد، ثم المعايرة، ثم المقيّمون الإضافيون للعقود التوزيعية، ثم العناصر التي لم تستطع أي آلة وسمها، ثم التحقق، ثم التدقيق. وتُقدَّم طلبات المعايرة بترتيب عشوائي ثابت، تتداخل فيه طلبات dev وcert. ويُعطى الشخص كل الطلبات المفتوحة على عنصر ما دفعة واحدة، طلباً واحداً لكل مخطط، ولا يُعطى أبداً طلبين للمخطط نفسه على العنصر نفسه.

تذكر ملاحظة قصيرة فوق العنصر نوع الطلب، وفي صفحة تضم عدة أسئلة تسمّي السؤال:

  • أعمى. نص الملاحظة "Label this one yourself. Suggestions are off for this item." ويبقى العنصر أعمى لذلك الشخص بعد أن يحفظه، وعند إعادة التحميل وعند الرجوع (Back).
  • تحقّق. تكون إجابة الآلة معبّأة، وتطلب الملاحظة الإبقاء عليها إن كانت صحيحة وتغييرها إن لم تكن. وتسجّل الصفحة الإجابة المعبّأة مسبقاً، فيمكنك قياس كم مرة يقبلها البشر. ولا يُحفظ شيء حتى يتصرف الشخص، فالصفحة المتروكة مفتوحة لا تجيب نيابةً عنه. أما المخططات التي لا تستطيع الصفحة تعبئة إجاباتها مسبقاً (المقاطع الزمنية، والكائنات ثلاثية الأبعاد، وآثار الوكلاء) فتُقدَّم عمياء بدلاً من ذلك.
  • حسم. لم يمكن قبول أي وسم آلي، فتكون إجابة الشخص هي الوسم.

الطلب الذي يحمله شخص دون أن يجيب عنه طوال runtime.hold_minutes (60 افتراضياً) يعود إلى المجمّع ويختفي من صفحته. والوسم المحفوظ على عنصر لم يقدّمه المحرّك لذلك الشخص لا يُغلق أبداً طلب شخص آخر، ويحتفظ به المحرّك وسماً عضوياً. وحين يقبل إشهاد جديد وسوماً آلية، يلغي المحرّك طلبات التحقق والحسم المفتوحة على العناصر التي صار يغطيها. أما الطلبات التي يحملها شخص بالفعل فتبقى معه، وتحلّ إجابته محلّ الوسم الآلي.

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

يقدّم Pocket Mode طلبات المحرّك أيضاً، دفعة كاملة في كل مرة، ويطلب المزيد قبل أن يعرض "All caught up". ولا يعرض Pocket Mode أي إجابة آلية أبداً، لذا يُسجَّل طلب التحقق المقدَّم فيه على أنه أعمى، ما لم تكن صفحة سطح المكتب قد عرضت الإجابة على ذلك الشخص من قبل. وفي بطاقات الحسم والفصل في الخلاف يعرض الملاحظة نفسها التي تعرضها صفحة سطح المكتب.

صفحة الإدارة

حين يكون المحرّك مفعّلاً، ترتبط لوحة تحكم المسؤول بـ Labeling engine على /admin/labeling-engine. ولكل مخطط بياني في الصفحة عرض جدولي أيضاً. وتعرض الصفحة:

  • حالة كل عقد، وتغطيته، ورقم النظرة (look)، وعدد الوسوم الإضافية التي يحتاجها، مع العبارة الكاملة التي يقرّرها (العقد غير المستوفى يذكر هدفه، لا ضماناً)؛
  • فترات كل عقد ppi، بجانب الفترات المحسوبة من البشر وحدهم؛
  • تحذيراً عن أي مصدر فشل تشغيله الأخير أو كانت كل إجاباته أخطاء؛
  • منحنى الخطأ مقابل التغطية لآخر مستوى في السلسلة المتتالية، مع الحد الأعلى المضمون والهدف؛
  • مخطط موثوقية لكل مستوى، يرسم الثقة المعلنة مقابل نسبة الإجابات الصحيحة على الوسوم البشرية، مع ECE ودرجة Brier، وتُرسم الفئات قليلة الوسوم بلون أبهت؛
  • عمليات تدقيق الوسوم المقبولة، بوصفها أخطاء مقابل الهدف، وما إذا كانت عمليات التدقيق أقل من أن تحسم الأمر؛
  • الطلبات البشرية حسب الغرض والحالة؛
  • سجل استدعاءات النماذج، الأحدث أولاً، مع الرموز وزمن الاستجابة والتكلفة؛
  • وأزراراً لتشغيل تمريرة للمخطِّط، والإشهاد فوراً، وفتح الشهادة.

إذا فُتحت الصفحة دون جلسة مسؤول، تنتقل إلى نموذج المفتاح في لوحة التحكم. وإذا كان المحرّك معطّلاً، تذكر ذلك وتسمّي المفتاح الذي يفعّله.

قراءة إضافية

للاطلاع على تفاصيل التنفيذ، راجع الوثائق المصدرية.