الوضع الفردي
تصنيف مجموعات بيانات كاملة مع معلّق واحد يتعاون مع نموذج لغوي كبير من خلال سير عمل ذكي من 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.
الإعداد
بداية سريعة
إعداد وضع فردي بسيط:
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"مرجع الإعداد الكامل
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 عنصرًا")
- أمثلة عناصر لكل زوج التباس
- مخططات الاتجاه تُظهر التحسن عبر جولات التحسين
الوصول إلى تحليل الالتباس برمجيًا:
python -m potato.solo confusion --config config.yamlالمخرجات:
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
حلقة التحسين الآلية
تتكرر حلقة التحسين بين تصنيف النموذج وتحليل الالتباس وتحديث الإرشادات. كل تكرار:
- يصنّف النموذج اللغوي الكبير مجموعة البيانات الكاملة بالإرشادات الحالية
- يقارن Potato مقابل جميع التصنيفات البشرية المتاحة
- إذا كانت الدقة أقل من العتبة، يتم تشغيل تحليل الالتباس
- يقترح النموذج تعديلات على الإرشادات بناءً على أنماط الأخطاء
- يراجع الإنسان التعديلات ويوافق عليها
- تتكرر الدورة (حتى
max_iterations)
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 دوال تصنيف خفيفة من الأنماط الملاحظة في التعليقات التوضيحية البشرية. هذه ليست استدعاءات للنموذج اللغوي؛ بل هي قواعد سريعة وحتمية.
أمثلة على دوال التصنيف المُولّدة:
# 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إعداد سلوك دوال التصنيف:
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مستكشف الخلافات
يعرض مستكشف الخلافات العناصر التي تتعارض فيها الإشارات المختلفة. لكل عنصر، يرى المعلّق:
- تصنيف النموذج اللغوي الكبير المتوقع ودرجة ثقته
- أصوات دوال التصنيف (إن وُجدت)
- أقرب الجيران المصنفين في فضاء التضمين
- النص/المحتوى الأولي
هذا هو نشاط التعليق التوضيحي الأعلى قيمة: كل تصنيف يحل غموضًا حقيقيًا.
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 جميع العناصر المصنفة حسب الثقة ويُصعّد الأقل ثقة إلى الإنسان. يستمر هذا على دفعات حتى تستقر الجودة.
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 نظام مجمّعات مرجّحة لاختيار العناصر الأكثر إفادة. ست مجمّعات تغذي قائمة انتظار أولويات موحدة:
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 النموذج اللغوي الكبير لتوليد أمثلة اصطناعية تستهدف نقاط الضعف المعروفة:
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 تحسينًا آليًا للأوامر النصية لإيجاد أفضل تنسيق تعليمات للنموذج اللغوي الكبير:
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مراقبة التقدم
تعرض لوحة تحكم المسؤول تقدم الوضع الفردي في الوقت الفعلي:
- المرحلة الحالية والتقدم داخل كل مرحلة
- التصنيفات البشرية المكتملة مقابل الميزانية الإجمالية
- دقة النموذج اللغوي الكبير عبر الزمن (لكل جولة)
- تغطية ودقة دوال التصنيف
- مدرج تكراري لتوزيع الثقة
- الوقت المقدر للإكمال
الوصول من سطر الأوامر:
python -m potato.solo status --config config.yamlSolo 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% لحساب إحصائيات الاتفاق. يمنحك هذا كفاءة الوضع الفردي مع ضمان جودة التحقق متعدد المعلّقين.
solo_mode:
enabled: true
# ... solo mode config ...
# Hybrid: assign verification sample to second annotator
verification:
enabled: true
sample_fraction: 0.15
annotator: "reviewer_1"قراءة إضافية
- دليل الوضع الفردي: تصنيف 10,000 مثال -- شرح تفصيلي خطوة بخطوة
- التعلم النشط -- نظام التعلم النشط الأساسي
- دعم الذكاء الاصطناعي -- إعداد تكامل النموذج اللغوي الكبير
- مراقبة الجودة -- ضمان جودة التعليقات التوضيحية
- MACE -- تقدير الكفاءة (مفيد للتحقق في الوضع الهجين)
لمزيد من تفاصيل التنفيذ، راجع الوثائق المصدرية.