Skip to content
أدلةمدة القراءة 7 دقيقة

مراقبة الجودة للتوصيف بالتعهيد الجماعي

اجمع بين فحوصات الانتباه والعناصر المرجعية والتداخل بين المُوصِّفين وبيانات التوقيت لرصد التوصيفات منخفضة الجودة، مع مفاتيح إعداد Potato لكل منها وما تُبلغ عنه.

Potato Team

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

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

مراقبة الجودة على امتداد المشروع: فحوصات قبل التوصيف وأثناءه وبعدهمراقبة الجودة على امتداد المشروع

ما يرصده كل ضابط

تخفق الضوابط الأربعة في اتجاهات مختلفة، وهذا هو سبب تشغيل أكثر من واحد منها.

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

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

فحوصات الانتباه

فحوصات الانتباه عناصر ذات إجابة معروفة، تُدرج في تدفق التوصيف وفق جدول محدد، وتتحقق من أن المُوصِّف يقرأ قبل أن يجيب. يُدرجها Potato ويصححها وينبّه المُوصِّف ويحظره عند عتبة تحددها أنت، فتجري الحلقة كلها على الخادم بدلًا من سكربت لاحق.

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

yaml
attention_checks:
  enabled: true
  items_file: "data/attention_checks.json"
  frequency: 10              # one check every 10 items
  min_response_time: 3.0     # seconds; faster than this fails the check
 
  failure_handling:
    warn_threshold: 2
    warn_message: "Please read items carefully before answering."
    block_threshold: 5
    block_message: "You have been blocked due to too many incorrect responses."

يمنح ملف العناصر كل فحص معرّفًا، والنص الذي يراه المُوصِّف، والإجابة المتوقعة لكل مخطط:

json
[
  {
    "id": "attn_001",
    "text": "Please select 'Positive' for this item to verify you are reading carefully.",
    "expected_answer": {
      "sentiment": "positive"
    }
  }
]

تبقى النتائج بعد إعادة التشغيل. يكتبها Potato في quality_control_results.json داخل مجلد المخرجات فور تسجيلها ويعيد قراءتها عند بدء التشغيل، فلا يمحو النشر سجل إخفاقات المُوصِّف ولا يرفع الحظر عمّن كان محظورًا.

العناصر المرجعية

العناصر المرجعية (gold standards) عناصر وسمها خبراء، تُمزج في التدفق لقياس الدقة لا الانتباه. وهي صامتة افتراضيًا، أي أن النتائج تذهب إلى لوحة الإدارة ولا يتلقى المُوصِّف أي ملاحظات، وبذلك تُقاس الجودة دون تغيير السلوك الذي يجري قياسه. فعّل الملاحظات عندما تكون في مرحلة التدريب لا الفرز.

تُدرج العناصر المرجعية كل frequency عنصرًا، لذا يوازن هذا الإعداد بين دقة القياس وحصة الميزانية التي تذهب إلى عناصر لديك تسمياتها أصلًا. عنصر واحد من كل 20 يعطي نحو 25 عنصرًا مصححًا خلال نوبة من 500 عنصر:

yaml
gold_standards:
  enabled: true
  items_file: "data/gold_standards.json"
  mode: mixed                # mixed injects into the stream; this is the implemented mode
  frequency: 20
 
  accuracy:
    min_threshold: 0.7       # annotators below this are named in the dashboard
    evaluation_count: 10     # evaluate once an annotator has seen 10 gold items
 
  feedback:
    show_correct_answer: false
    show_explanation: false

يحمل ملف العناصر التوصيف الصحيح لكل مخطط، إضافة إلى شرح اختياري لحالة تفعيل الملاحظات:

json
[
  {
    "id": "gold_001",
    "text": "The service was absolutely terrible and I will never return.",
    "gold_label": {
      "sentiment": "negative"
    },
    "explanation": "Strong negative language indicates negative sentiment.",
    "difficulty": "easy"
  }
]

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

تظهر الدقة لكل مُوصِّف في /admin/api/quality_control، الذي يُبلغ عن configured_correct وconfigured_total إلى جانب الإجماليات. استخدم الأرقام المُعدّة عند المقارنة بين المُوصِّفين، لأن المجموعة المُعدّة واحدة للجميع، بينما تعتمد المجموعة المُرقّاة تلقائيًا على وقت انضمام كل مُوصِّف.

التداخل والاتفاق

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

yaml
num_annotators_per_item: 3
 
agreement_metrics:
  enabled: true
  min_overlap: 2
  refresh_interval: 60

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

التوقيت والقياس عن بُعد

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

python
def flag_fast_annotations(export, min_seconds=2.0):
    """Instances submitted faster than a floor, from an exported annotation file."""
    flagged = []
    for instance in export:
        bd = instance.get("behavioral_data") or {}
        seconds = bd.get("total_time_ms", 0) / 1000
        if seconds < min_seconds:
            flagged.append((instance["id"], seconds))
    return flagged

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

إعداد يضم الضوابط الأربعة

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

yaml
annotation_task_name: "Sentiment Annotation with Quality Control"
task_description: "Classify the sentiment of short texts."
 
data_files:
  - data/items.json
 
item_properties:
  id_key: id
  text_key: text
 
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment of this text?"
    labels:
      - Positive
      - Negative
      - Neutral
 
num_annotators_per_item: 3
 
attention_checks:
  enabled: true
  items_file: data/attention_checks.json
  frequency: 15
  min_response_time: 3.0
  failure_handling:
    warn_threshold: 2
    block_threshold: 5
 
gold_standards:
  enabled: true
  items_file: data/gold_standards.json
  mode: mixed
  frequency: 25
  accuracy:
    min_threshold: 0.7
    evaluation_count: 10
 
agreement_metrics:
  enabled: true
  min_overlap: 2
  refresh_interval: 60
 
output_annotation_dir: annotation_output

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

ضوابط على مستوى المنصة

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

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

الفرز المسبق على المنصة والفحوصات الخاصة بـ Potato يكمل أحدهما الآخر. فالفرز المسبق يحدد من يصل إلى المهمة، وفحوصات الانتباه والعناصر المرجعية تقيس ما فعلوه بعد وصولهم.

قبل أن تجمع أي شيء

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

قراءات إضافية