Skip to content

الوضع الفردي

تصنيف مجموعات بيانات كاملة مع معلّق واحد يتعاون مع نموذج لغوي كبير من خلال سير عمل ذكي من 12 مرحلة.

الوضع الفردي

جديد في الإصدار v2.3.0

تتطلب مشاريع التعليق التوضيحي التقليدية معلّقين متعددين وحساب اتفاق المعلّقين وجولات تحكيم وتنسيق كبير. بالنسبة للعديد من فرق البحث، يكون هذا هو العائق الرئيسي: ليس واجهة التعليق التوضيحي، بل الجوانب اللوجستية لتوظيف فريق وتدريبه وإدارته.

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

في الاختبارات المعيارية الداخلية، حقق الوضع الفردي اتفاقًا بنسبة 95%+ مع خطوط أنابيب المعلّقين المتعددين الكاملة مع الحاجة إلى 10-15% فقط من إجمالي التصنيفات البشرية.

سير العمل من 12 مرحلة

يتقدم الوضع الفردي عبر 12 مرحلة. يتقدم النظام تلقائيًا بناءً على عتبات قابلة للإعداد، مع إمكانية تشغيل الانتقالات يدويًا أيضًا من لوحة تحكم المسؤول.

المرحلة 1: التعليق التوضيحي الأولي

يقوم المعلّق البشري بتصنيف مجموعة أولية. يختار Potato عناصر متنوعة وممثلة باستخدام التجميع المبني على التضمين لتعظيم تغطية توزيع البيانات.

حجم المجموعة الأولية الافتراضي: 50 عنصرًا (قابل للتعديل عبر seed_count)

المرحلة 2: معايرة النموذج اللغوي الكبير الأولية

يستقبل النموذج اللغوي الكبير التعليقات التوضيحية الأولية كأمثلة few-shot ويصنّف دفعة معايرة. يقارن Potato توقعات النموذج مقابل تصنيفات أولية محتجزة لتأسيس خط أساس للدقة.

المرحلة 3: تحليل الالتباس

يحدد Potato أنماط الخلاف المنهجية بين الإنسان والنموذج اللغوي الكبير. يبني مصفوفة التباس ويُبرز أكثر أنواع الأخطاء شيوعًا (مثل: "النموذج يصنف المحايد كإيجابي 40% من الوقت").

المرحلة 4: تحسين الإرشادات

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

المرحلة 5: توليد دوال التصنيف

مستوحاة من إطار ALCHEmist، يُولّد Potato دوال تصنيف برمجية من التعليقات التوضيحية الموجودة. وهي قواعد بسيطة مبنية على الأنماط (مثل: "إذا احتوى النص على 'ممتاز' ولا يوجد نفي، صنّف كإيجابي") يمكنها تصنيف العناصر السهلة بدقة عالية، مع الاحتفاظ بجهد الإنسان والنموذج للحالات الأصعب.

المرحلة 6: التصنيف النشط

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

المرحلة 7: حلقة التحسين الآلية

يعيد النموذج اللغوي الكبير تصنيف مجموعة البيانات الكاملة بالإرشادات والأمثلة المحدثة. يقارن Potato مقابل جميع التصنيفات البشرية ويُطلق دورة أخرى من تحليل الالتباس وتحسين الإرشادات إذا كانت الدقة أقل من العتبة.

المرحلة 8: استكشاف الخلافات

يراجع الإنسان جميع العناصر التي يختلف فيها النموذج اللغوي الكبير ودوال التصنيف. هذه عادةً هي الأمثلة الأكثر إفادة وصعوبة. تصنيفات الإنسان على هذه الحالات توفر أعلى قيمة هامشية.

المرحلة 9: توليف الحالات الحدية

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

المرحلة 10: التصعيد المتدرج بالثقة

يُعيّن النموذج اللغوي الكبير درجات ثقة لكل عنصر غير مصنف متبقٍ. تُصعّد العناصر إلى الإنسان بترتيب تنازلي للصعوبة (ثقة تصاعدية). يصنّف الإنسان حتى تستقر مقاييس الجودة.

المرحلة 11: تحسين الأوامر النصية

مستوحاة من DSPy، يُجري Potato تحسينًا آليًا للأوامر النصية باستخدام التصنيفات البشرية المتراكمة كمجموعة تحقق. يجرب عدة تنويعات للأوامر النصية (صياغة التعليمات، ترتيب الأمثلة، سلسلة التفكير مقابل المباشر) ويختار الأمر الأفضل أداءً.

المرحلة 12: التحقق النهائي

يُجري الإنسان مراجعة نهائية لعينة عشوائية من العناصر المصنفة بواسطة النموذج. إذا وصلت الدقة إلى العتبة، تكون مجموعة البيانات مكتملة. وإلا، يعود النظام إلى المرحلة 6.


الإعداد

بداية سريعة

إعداد وضع فردي بسيط:

yaml
task_name: "Sentiment Classification"
task_dir: "."
 
data_files:
  - "data/reviews.jsonl"
 
item_properties:
  id_key: id
  text_key: text
 
solo_mode:
  enabled: true
 
  # LLM provider
  llm:
    endpoint_type: openai
    model: "gpt-4o"
    api_key: ${OPENAI_API_KEY}
 
  # Basic thresholds
  seed_count: 50
  accuracy_threshold: 0.92
  confidence_threshold: 0.85
 
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    labels:
      - Positive
      - Neutral
      - Negative
 
output_annotation_dir: "output/"
output_annotation_format: "jsonl"

مرجع الإعداد الكامل

yaml
solo_mode:
  enabled: true
 
  # LLM configuration
  llm:
    endpoint_type: openai        # openai, anthropic, ollama, vllm
    model: "gpt-4o"
    api_key: ${OPENAI_API_KEY}
    temperature: 0.1             # low temperature for consistency
    max_tokens: 256
 
  # Phase control
  phases:
    seed:
      count: 50                  # number of seed instances
      selection: diversity        # diversity, random, or stratified
      embedding_model: "all-MiniLM-L6-v2"
 
    calibration:
      batch_size: 100
      holdout_fraction: 0.2      # fraction of seed used for validation
 
    confusion_analysis:
      min_samples: 30
      significance_threshold: 0.05
 
    guideline_refinement:
      auto_suggest: true         # LLM suggests guideline edits
      require_approval: true     # human must approve changes
 
    labeling_functions:
      enabled: true
      max_functions: 20
      min_precision: 0.90        # only keep high-precision rules
      min_coverage: 0.01         # must cover at least 1% of data
 
    active_labeling:
      batch_size: 25
      strategy: uncertainty       # uncertainty, diversity, or hybrid
      max_batches: 10
 
    refinement_loop:
      max_iterations: 3
      improvement_threshold: 0.02
 
    disagreement_exploration:
      max_instances: 200
      sort_by: confidence_gap
 
    edge_case_synthesis:
      enabled: true
      count: 50
      diversity_weight: 0.3
 
    confidence_escalation:
      escalation_budget: 200     # max instances to escalate
      batch_size: 25
      stop_when_stable: true     # stop if last batch accuracy is 100%
 
    prompt_optimization:
      enabled: true
      candidates: 10             # number of prompt variants to try
      metric: f1_macro
      search_strategy: bayesian  # bayesian, grid, or random
 
    final_validation:
      sample_size: 100
      min_accuracy: 0.92
      fallback_phase: 6          # go back to Phase 6 if validation fails
 
  # Instance prioritization across phases
  prioritization:
    pools:
      - name: uncertain
        weight: 0.30
        description: "LLM confidence below threshold"
      - name: disagreement
        weight: 0.25
        description: "LLM and labeling functions disagree"
      - name: boundary
        weight: 0.20
        description: "Near decision boundary in embedding space"
      - name: novel
        weight: 0.10
        description: "Far from all existing labeled examples"
      - name: error_pattern
        weight: 0.10
        description: "Matches known confusion patterns"
      - name: random
        weight: 0.05
        description: "Random sample for calibration"

القدرات الرئيسية

تحليل الالتباس

بعد كل جولة تصنيف، يبني Potato مصفوفة التباس بين تصنيفات الإنسان والنموذج اللغوي الكبير. تعرض لوحة تحكم المسؤول:

  • الدقة والاستدعاء ومقياس F1 لكل فئة من منظور النموذج
  • أكثر أزواج الالتباس شيوعًا (مثل: "المحايد مصنف خطأ كإيجابي: 23 عنصرًا")
  • أمثلة عناصر لكل زوج التباس
  • مخططات الاتجاه تُظهر التحسن عبر جولات التحسين

الوصول إلى تحليل الالتباس برمجيًا:

bash
python -m potato.solo confusion --config config.yaml

المخرجات:

text
Confusion Analysis (Round 2)
============================
Overall Accuracy: 0.87 (target: 0.92)

Top Confusion Pairs:
  neutral -> positive:  23 instances (15.3%)
  negative -> neutral:  11 instances (7.3%)
  positive -> neutral:   5 instances (3.3%)

Per-Class Performance:
  Positive:  P=0.91  R=0.94  F1=0.92
  Neutral:   P=0.78  R=0.71  F1=0.74
  Negative:  P=0.93  R=0.88  F1=0.90

حلقة التحسين الآلية

تتكرر حلقة التحسين بين تصنيف النموذج وتحليل الالتباس وتحديث الإرشادات. كل تكرار:

  1. يصنّف النموذج اللغوي الكبير مجموعة البيانات الكاملة بالإرشادات الحالية
  2. يقارن Potato مقابل جميع التصنيفات البشرية المتاحة
  3. إذا كانت الدقة أقل من العتبة، يتم تشغيل تحليل الالتباس
  4. يقترح النموذج تعديلات على الإرشادات بناءً على أنماط الأخطاء
  5. يراجع الإنسان التعديلات ويوافق عليها
  6. تتكرر الدورة (حتى max_iterations)
yaml
solo_mode:
  llm:
    endpoint_type: anthropic
    model: "claude-sonnet-4-20250514"
    api_key: ${ANTHROPIC_API_KEY}
 
  phases:
    refinement_loop:
      max_iterations: 3
      improvement_threshold: 0.02    # stop if improvement is less than 2%

دوال التصنيف (مستوحاة من ALCHEmist)

يُولّد Potato دوال تصنيف خفيفة من الأنماط الملاحظة في التعليقات التوضيحية البشرية. هذه ليست استدعاءات للنموذج اللغوي؛ بل هي قواعد سريعة وحتمية.

أمثلة على دوال التصنيف المُولّدة:

python
# Auto-generated labeling function 1
# Precision: 0.96, Coverage: 0.08
def lf_strong_positive_words(text):
    positive = {"excellent", "amazing", "fantastic", "outstanding", "perfect"}
    if any(w in text.lower() for w in positive):
        if not any(neg in text.lower() for neg in {"not", "never", "no"}):
            return "Positive"
    return None  # abstain
 
# Auto-generated labeling function 2
# Precision: 0.93, Coverage: 0.05
def lf_explicit_negative(text):
    negative = {"terrible", "awful", "horrible", "worst", "disgusting"}
    if any(w in text.lower() for w in negative):
        return "Negative"
    return None

إعداد سلوك دوال التصنيف:

yaml
solo_mode:
  phases:
    labeling_functions:
      enabled: true
      max_functions: 20
      min_precision: 0.90
      min_coverage: 0.01
      types:
        - keyword_match
        - regex_pattern
        - length_threshold
        - embedding_cluster

مستكشف الخلافات

يعرض مستكشف الخلافات العناصر التي تتعارض فيها الإشارات المختلفة. لكل عنصر، يرى المعلّق:

  • تصنيف النموذج اللغوي الكبير المتوقع ودرجة ثقته
  • أصوات دوال التصنيف (إن وُجدت)
  • أقرب الجيران المصنفين في فضاء التضمين
  • النص/المحتوى الأولي

هذا هو نشاط التعليق التوضيحي الأعلى قيمة: كل تصنيف يحل غموضًا حقيقيًا.

yaml
solo_mode:
  phases:
    disagreement_exploration:
      max_instances: 200
      sort_by: confidence_gap     # or "lf_disagreement" or "random"
      show_llm_reasoning: true    # display LLM's chain-of-thought
      show_nearest_neighbors: 3   # show 3 nearest labeled examples

التصعيد المتدرج بالثقة

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

yaml
solo_mode:
  phases:
    confidence_escalation:
      escalation_budget: 200
      batch_size: 25
      stop_when_stable: true
      stability_window: 3        # stop if last 3 batches are all correct

ترتيب أولويات العناصر متعدد الإشارات

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

yaml
solo_mode:
  prioritization:
    pools:
      - name: uncertain
        weight: 0.30
      - name: disagreement
        weight: 0.25
      - name: boundary
        weight: 0.20
      - name: novel
        weight: 0.10
      - name: error_pattern
        weight: 0.10
      - name: random
        weight: 0.05
  • uncertain: العناصر التي تكون فيها ثقة النموذج أقل من confidence_threshold
  • disagreement: العناصر التي ينتج فيها النموذج ودوال التصنيف تصنيفات مختلفة
  • boundary: العناصر القريبة من حدود القرار في فضاء التضمين
  • novel: العناصر البعيدة عن أي مثال مصنف موجود
  • error_pattern: العناصر المطابقة لأنماط الالتباس المعروفة من الجولات السابقة
  • random: عينة عشوائية صغيرة للحفاظ على المعايرة واكتشاف النقاط العمياء

توليف الحالات الحدية

يستخدم Potato النموذج اللغوي الكبير لتوليد أمثلة اصطناعية تستهدف نقاط الضعف المعروفة:

yaml
solo_mode:
  phases:
    edge_case_synthesis:
      enabled: true
      count: 50
      diversity_weight: 0.3
      confusion_pairs:            # focus on these error types
        - ["neutral", "positive"]
        - ["negative", "neutral"]

يُولّد النموذج أمثلة غامضة بين أزواج التصنيفات المحددة. يصنّفها الإنسان، وتُضاف هذه التصنيفات إلى سياق few-shot لجولات تصنيف النموذج اللاحقة.

تحسين الأوامر النصية (مستوحى من DSPy)

في المرحلة 11، يُجري Potato تحسينًا آليًا للأوامر النصية لإيجاد أفضل تنسيق تعليمات للنموذج اللغوي الكبير:

yaml
solo_mode:
  phases:
    prompt_optimization:
      enabled: true
      candidates: 10
      metric: f1_macro
      search_strategy: bayesian
      variations:
        - instruction_style      # formal vs. conversational
        - example_ordering       # random, by-class, by-difficulty
        - reasoning_mode         # direct, chain-of-thought, self-consistency
        - example_count          # 3, 5, 10, 15 few-shot examples

مراقبة التقدم

تعرض لوحة تحكم المسؤول تقدم الوضع الفردي في الوقت الفعلي:

  • المرحلة الحالية والتقدم داخل كل مرحلة
  • التصنيفات البشرية المكتملة مقابل الميزانية الإجمالية
  • دقة النموذج اللغوي الكبير عبر الزمن (لكل جولة)
  • تغطية ودقة دوال التصنيف
  • مدرج تكراري لتوزيع الثقة
  • الوقت المقدر للإكمال

الوصول من سطر الأوامر:

bash
python -m potato.solo status --config config.yaml
text
Solo Mode Status
================
Current Phase: 6 (Active Labeling) - Batch 3/10
Human Labels: 142 / ~300 estimated total
LLM Accuracy: 0.89 (target: 0.92)
LF Coverage: 0.23 (labeling functions cover 23% of data)
Dataset Size: 10,000 instances
  - Human labeled: 142
  - LF labeled: 2,300
  - LLM labeled: 7,558
  - Unlabeled: 0

متى تستخدم الوضع الفردي مقابل التعليق التوضيحي التقليدي متعدد المعلّقين

استخدم الوضع الفردي عندما:

  • لديك خبير في المجال يمكنه تقديم تصنيفات عالية الجودة
  • الميزانية أو الجوانب اللوجستية تمنع توظيف معلّقين متعددين
  • المهمة لها فئات واضحة ومحددة جيدًا
  • تحتاج إلى تصنيف مجموعة بيانات كبيرة (1,000+ عنصر)
  • السرعة أهم من قياس اتفاق المعلّقين

استخدم التعليق التوضيحي التقليدي متعدد المعلّقين عندما:

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

النهج الهجين: استخدم الوضع الفردي للتصنيف المبدئي بالجملة، ثم عيّن معلّقًا ثانيًا لعينة عشوائية بنسبة 10-20% لحساب إحصائيات الاتفاق. يمنحك هذا كفاءة الوضع الفردي مع ضمان جودة التحقق متعدد المعلّقين.

yaml
solo_mode:
  enabled: true
  # ... solo mode config ...
 
  # Hybrid: assign verification sample to second annotator
  verification:
    enabled: true
    sample_fraction: 0.15
    annotator: "reviewer_1"

قراءة إضافية

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