Skip to content
Tutorials10 min read

الوضع الفردي: كيف يمكن لمُوصِّف واحد توسيم 10,000 مثال

دليل تفصيلي خطوة بخطوة لاستخدام الوضع الفردي في Potato لتوسيم مجموعات البيانات الكبيرة بكفاءة من خلال التعاون بين الإنسان ونموذج اللغة الكبير، مع تقليل تكلفة التوصيف بنسبة تصل إلى 90%.

Potato Team·

الوضع الفردي: كيف يمكن لمُوصِّف واحد توسيم 10,000 مثال

لديك 10,000 مراجعة منتجات لتوسيمها للمشاعر (إيجابي، محايد، سلبي). توظيف ثلاثة مُوصِّفين لتوسيم كل شيء سيستغرق أسابيع ويكلف آلاف الدولارات. مع الوضع الفردي، يمكن لخبير مجال واحد تحقيق جودة مماثلة بتوسيم 500-1,000 نموذج فقط بينما يتولى نموذج اللغة الكبير الباقي -- مع مراجعة الإنسان لكل قرار يكون النموذج غير متأكد منه.

يرشدك هذا الدرس خلال العملية بأكملها من البداية إلى النهاية.


ما ستحتاجه

  • Potato 2.3.0+ مع إضافات الوضع الفردي: pip install potato-annotation[solo]
  • مفتاح API من OpenAI أو Anthropic (لمكوّن نموذج اللغة الكبير)
  • مجموعة بياناتك بتنسيق JSONL
  • مُوصِّف واحد ذو معرفة (قد تكون أنت)

الخطوة 1: تحضير بياناتك

أنشئ data/reviews.jsonl مع مراجعة واحدة لكل سطر:

json
{"id": "rev_001", "text": "Absolutely love this product! Best purchase I've made all year.", "source": "amazon"}
{"id": "rev_002", "text": "It works fine. Nothing special but gets the job done.", "source": "amazon"}
{"id": "rev_003", "text": "Broke after two weeks. Complete waste of money.", "source": "amazon"}
{"id": "rev_004", "text": "The quality is decent for the price point. I might buy again.", "source": "amazon"}
{"id": "rev_005", "text": "Arrived damaged and customer service was unhelpful.", "source": "amazon"}

لهذا الدرس، تخيل أن هذا الملف يحتوي على 10,000 مراجعة.


الخطوة 2: إنشاء الإعدادات

أنشئ config.yaml:

yaml
task_name: "Product Review Sentiment (Solo Mode)"
task_dir: "."
 
data_files:
  - "data/reviews.jsonl"
 
item_properties:
  id_key: id
  text_key: text
 
# --- Solo Mode Configuration ---
solo_mode:
  enabled: true
 
  llm:
    endpoint_type: openai
    model: "gpt-4o"
    api_key: ${OPENAI_API_KEY}
    temperature: 0.1
    max_tokens: 64
 
  # Quality targets
  seed_count: 50
  accuracy_threshold: 0.93
  confidence_threshold: 0.85
 
  # Phase-specific settings
  phases:
    seed:
      count: 50
      selection: diversity
      embedding_model: "all-MiniLM-L6-v2"
 
    calibration:
      batch_size: 200
      holdout_fraction: 0.2
 
    labeling_functions:
      enabled: true
      max_functions: 15
      min_precision: 0.92
      min_coverage: 0.01
 
    active_labeling:
      batch_size: 25
      strategy: hybrid
      max_batches: 15
 
    refinement_loop:
      max_iterations: 3
      improvement_threshold: 0.02
 
    disagreement_exploration:
      max_instances: 150
      show_llm_reasoning: true
      show_nearest_neighbors: 3
 
    edge_case_synthesis:
      enabled: true
      count: 30
 
    confidence_escalation:
      escalation_budget: 150
      batch_size: 25
      stop_when_stable: true
 
    prompt_optimization:
      enabled: true
      candidates: 8
      metric: f1_macro
 
    final_validation:
      sample_size: 100
      min_accuracy: 0.93
 
  # Instance prioritization
  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
 
# --- Annotation Schema ---
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the overall sentiment of this review?"
    labels:
      - "Positive"
      - "Neutral"
      - "Negative"
    label_requirement:
      required: true
    sequential_key_binding: true
 
output_annotation_dir: "output/"
output_annotation_format: "jsonl"
 
parquet_export:
  enabled: true
  output_dir: "output/parquet/"

الخطوة 3: تشغيل الخادم

bash
potato start config.yaml -p 8000

افتح http://localhost:8000 وسجّل الدخول. ستظهر لوحة تحكم الوضع الفردي، تُظهر أنك في المرحلة 1: التوصيف الأولي.


الخطوة 4: المرحلة 1 -- التوصيف الأولي (50 نموذجاً)

اختار Potato 50 مراجعة متنوعة باستخدام التجميع القائم على التضمينات. هذه ليست عشوائية؛ تم اختيارها لتعظيم تغطية توزيع بياناتك.

وسِّم كل واحدة. هذه هي المرحلة الأهم -- جودة تسمياتك الأولية تحدد مدى جودة تعلم نموذج اللغة الكبير. خذ وقتك وكن متسقاً.

تقدير الوقت: 15-25 دقيقة بمعدل 20-30 ثانية لكل نموذج.

عند إنهائك للنموذج الخمسين، ينتقل Potato تلقائياً إلى المرحلة 2.


الخطوة 5: المرحلة 2 -- المعايرة الأولية لنموذج اللغة

تعمل هذه المرحلة تلقائياً. يرسل Potato لنموذج اللغة الكبير دفعة من 200 نموذج مع 50 تسمية أولية كأمثلة قليلة. ثم يقارن تنبؤات النموذج مع 10 تسميات أولية محجوزة لتقدير الدقة الأساسية.

سترى مؤشر تقدم في لوحة التحكم. يستغرق هذا عادةً 1-2 دقيقة حسب مزوّد نموذج اللغة.

النتيجة النموذجية: يحقق نموذج اللغة دقة 75-85% في المعايرة الأولى. هذا متوقع -- لم يتعلم النموذج بعد أسلوب توصيفك المحدد.


الخطوة 6: المرحلة 3 -- تحليل الارتباك

يعرض Potato مصفوفة ارتباك تُظهر أين يختلف نموذج اللغة عن تسمياتك. مخرج نموذجي:

text
Confusion Analysis (Round 1)
============================
Overall Accuracy: 0.82 (target: 0.93)

Top Confusion Pairs:
  Neutral -> Positive:  14 instances (7.0%)
  Negative -> Neutral:   9 instances (4.5%)
  Positive -> Neutral:   4 instances (2.0%)

هذا يخبرك أن نقطة ضعف النموذج الرئيسية: يميل لترقية المراجعات المحايدة إلى إيجابية. هذا شائع -- نماذج اللغة غالباً متحيزة نحو المشاعر الإيجابية.

إجراؤك: راجع أزواج الارتباك. انقر على كل زوج لرؤية النماذج المحددة التي أخطأ فيها النموذج. هذا يساعدك على فهم أنماط فشل النموذج.


الخطوة 7: المرحلة 4 -- تحسين الإرشادات

بناءً على تحليل الارتباك، يولّد Potato إرشادات محسّنة لنموذج اللغة. ترى عرضاً جنباً إلى جنب:

  • الإرشادات الحالية: الموجّه الأولي المستخدم لنموذج اللغة
  • التعديلات المقترحة: تغييرات محددة يقترحها النموذج بناءً على أنماط الأخطاء

على سبيل المثال، قد يقترح Potato إضافة:

"المراجعات التي تصف المنتج بأنه 'مقبول' أو 'عادي' أو 'لا بأس' بدون عاطفة قوية يجب أن تُوسم محايدة، حتى لو ذكرت الشراء مرة أخرى."

راجع كل تعديل مقترح. وافق أو عدّل أو ارفض كلاً منها. يمكنك أيضاً إضافة توضيحاتك الخاصة.

تقدير الوقت: 5-10 دقائق.


الخطوة 8: المرحلة 5 -- إنشاء دوال التوسيم

يولّد Potato دوال توسيم برمجية من الأنماط في تسمياتك الأولية. هذه قواعد سريعة وحتمية تتعامل مع الحالات السهلة:

text
Generated Labeling Functions:
  LF1: Strong positive words (love, amazing, best, excellent)
       Precision: 0.97, Coverage: 0.06
  LF2: Strong negative words (terrible, awful, worst, waste)
       Precision: 0.95, Coverage: 0.04
  LF3: Exclamation + positive adjective
       Precision: 0.94, Coverage: 0.03
  LF4: Return/refund mention + negative context
       Precision: 0.92, Coverage: 0.02
  ...
  Total coverage: 0.18 (1,800 of 10,000 instances)

تغطي دوال التوسيم 18% من مجموعة بياناتك بدقة 92%+. هذه النماذج تُوسم تلقائياً، مما يحرر جهد نموذج اللغة والإنسان للحالات الأصعب.

إجراؤك: راجع الدوال المُولّدة. عطّل أي واحدة تبدو غير موثوقة. هذا اختياري -- يحتفظ Potato فقط بالدوال فوق عتبة الدقة المُعدّة.


الخطوة 9: المرحلة 6 -- التوسيم النشط (125-375 نموذجاً)

هذه هي مرحلة التوسيم البشري الرئيسية. يختار Potato النماذج باستخدام نظام تحديد الأولويات ذو الست مجموعات:

  • غير مؤكد (30%): مراجعات تكون ثقة نموذج اللغة فيها أقل من 85%
  • خلاف (25%): مراجعات يعطي فيها النموذج ودوال التوسيم تسميات مختلفة
  • حدودي (20%): مراجعات قرب حد القرار في فضاء التضمينات
  • جديد (10%): مراجعات لا تشبه أي شيء وسمته حتى الآن
  • نمط خطأ (10%): مراجعات تطابق أنماط ارتباك معروفة (مثل الإيجابية الفاترة)
  • عشوائي (5%): مراجعات عشوائية للمعايرة

تُوسمها في دفعات من 25. بعد كل دفعة، يحدّث Potato تقدير دقة النموذج ويقرر ما إذا كان سيستمر.

المسار النموذجي:

  • الدفعات 1-3 (75 نموذجاً): ترتفع الدقة من 82% إلى 87%
  • الدفعات 4-6 (150 نموذجاً): تصل الدقة إلى 90%
  • الدفعات 7-10 (250 نموذجاً): تستقر الدقة عند 91-92%

إذا وصلت الدقة إلى 93% (عتبتك)، ينتقل الوضع الفردي إلى المرحلة 10. وإلا، يستمر إلى المرحلة 7.

تقدير الوقت: 45-90 دقيقة إجمالاً، حسب عدد الدفعات المطلوبة.


الخطوة 10: المرحلة 7 -- حلقة التحسين الآلي

إذا كانت الدقة لا تزال أقل من العتبة بعد التوسيم النشط، يشغّل Potato جولة أخرى من حلقة التحسين:

  1. يعيد نموذج اللغة توسيم مجموعة البيانات الكاملة بإرشادات محدّثة وأمثلة قليلة إضافية
  2. يُعاد حساب الدقة مقابل جميع التسميات البشرية
  3. يتم تحديد أنماط ارتباك جديدة
  4. يتم تحسين الإرشادات مرة أخرى

هذه المرحلة معظمها آلية. تحتاج فقط للموافقة على تغييرات الإرشادات.

النتيجة النموذجية: تتحسن الدقة بنسبة 2-4% لكل جولة تحسين.


الخطوة 11: المرحلة 8 -- استكشاف الخلافات

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

  • نص المراجعة
  • تنبؤ نموذج اللغة وثقته
  • أصوات دوال التوسيم
  • 3 أمثلة مُوسمة أقرب مع تسمياتها
  • استدلال سلسلة التفكير لنموذج اللغة

هذه حالات صعبة حقاً. تسمياتك هنا لها أعلى قيمة هامشية لأي توصيف في العملية بأكملها.

تقدير الوقت: 20-30 دقيقة لـ 100-150 نموذجاً.


الخطوة 12: المرحلة 9 -- تصنيع الحالات الحدية

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

"إنه منتج مقبول بالنسبة للسعر. قد أحصل على آخر إذا كان هناك تخفيض."

تُوسم هذه الأمثلة الاصطناعية، وتُضاف إلى سياق الأمثلة القليلة لنموذج اللغة.

تقدير الوقت: 10-15 دقيقة لـ 30 مثالاً.


الخطوة 13: المرحلة 10 -- تصعيد الثقة المتتالي

وسم نموذج اللغة الآن معظم مجموعة البيانات. يرتّب Potato جميع النماذج المُوسمة بالنموذج حسب الثقة ويرسل الأقل ثقة إليك في دفعات من 25.

text
Confidence Escalation Progress:
  Batch 1: 25 instances, 23/25 correct (92%)
  Batch 2: 25 instances, 24/25 correct (96%)
  Batch 3: 25 instances, 25/25 correct (100%)
  -> Stopping: last 3 batches stable

بمجرد رؤيتك لثلاث دفعات متتالية أصاب فيها النموذج كل شيء، يستنتج الوضع الفردي أن التسميات عالية الثقة المتبقية موثوقة.

تقدير الوقت: 15-20 دقيقة.


الخطوة 14: المرحلة 11 -- تحسين الموجّه

تعمل هذه المرحلة تلقائياً. يجرّب Potato 8 متغيرات للموجّه ويختار الذي يحقق أعلى درجة F1 على تسمياتك البشرية المتراكمة:

text
Prompt Optimization Results:
  Variant 1 (direct, 5 examples):     F1=0.91
  Variant 2 (CoT, 5 examples):        F1=0.93
  Variant 3 (direct, 10 examples):    F1=0.92
  Variant 4 (CoT, 10 examples):       F1=0.94  <-- selected
  Variant 5 (direct, 15 examples):    F1=0.92
  Variant 6 (CoT, 15 examples):       F1=0.93
  Variant 7 (self-consistency, 5x):   F1=0.94
  Variant 8 (self-consistency, 10x):  F1=0.94

يُستخدم أفضل موجّه لجولة إعادة توسيم نهائية.


الخطوة 15: المرحلة 12 -- التحقق النهائي

يختار Potato 100 نموذج عشوائي وُسمت بالنموذج لتراجعها. تُوسمها، ويقارن Potato مع تسميات النموذج.

text
Final Validation:
  Reviewed: 100 instances
  LLM correct: 94/100 (94%)
  Threshold: 93%
  -> PASSED

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

تقدير الوقت: 10-15 دقيقة.


ملخص النتائج

بعد المرور بجميع المراحل الـ 12، تحقق من الإحصائيات النهائية:

bash
python -m potato.solo status --config config.yaml
text
Solo Mode Complete
==================
Dataset: 10,000 instances
Total human labels: 612
  Seed: 50
  Active labeling: 275
  Disagreement exploration: 137
  Edge case synthesis: 30
  Confidence escalation: 75
  Final validation: 45

LLM labels: 8,200 (accuracy: 94.1%)
LF labels: 1,800 (precision: 95.3%)
Unlabeled: 0

Final label distribution:
  Positive: 4,823 (48.2%)
  Neutral:  3,011 (30.1%)
  Negative: 2,166 (21.7%)

Total human time: ~3.5 hours
Estimated multi-annotator cost (3x): ~$4,500
Solo Mode cost: ~$450 (API fees) + ~$175 (annotator time)
Savings: ~88%

وسم الإنسان 612 من 10,000 نموذج (6.1%). تولى نموذج اللغة ودوال التوسيم الباقي بدقة 94%+.


تصدير النتائج

صدّر مجموعة البيانات المُوسمة النهائية:

bash
python -m potato.solo export --config config.yaml --output final_labels.jsonl

كل سطر يتضمن التسمية ومصدرها:

json
{"id": "rev_001", "sentiment": "Positive", "source": "human", "confidence": 1.0}
{"id": "rev_002", "sentiment": "Neutral", "source": "llm", "confidence": 0.91}
{"id": "rev_003", "sentiment": "Negative", "source": "labeling_function", "confidence": 0.97}

لتصدير Parquet:

python
import pandas as pd
df = pd.read_parquet("output/parquet/annotations.parquet")
print(df["value"].value_counts())

ضمان الجودة: التحقق الهجين

لمجموعات بيانات بجودة النشر، أضف مُوصِّفاً ثانياً لمراجعة عيّنة:

yaml
solo_mode:
  verification:
    enabled: true
    sample_fraction: 0.10
    annotator: "reviewer_1"

هذا يعيّن 1,000 نموذج عشوائي لمُوصِّف ثانٍ. يمكنك بعد ذلك حساب اتفاق المُوصِّفين بين تسميات الوضع الفردي وتسميات المراجع.


استكشاف الأخطاء وإصلاحها

دقة نموذج اللغة تستقر تحت العتبة

  • زِد عدد البذور: جرّب 75-100 نموذج أولي بدلاً من 50
  • غيّر نموذج اللغة: جرّب claude-sonnet-4-20250514 بدلاً من GPT-4o (أو العكس)
  • خفّض العتبة: إذا كانت 93% غير قابلة للتحقيق، فكّر هل 90% مقبولة لحالة استخدامك
  • تحقق من بياناتك: بعض مجموعات البيانات غامضة بطبيعتها. إذا كان اتفاق الإنسان-الإنسان سيكون 90% فقط، لا تتوقع من النموذج أداءً أفضل

المرحلة 6 تستغرق دفعات كثيرة جداً

  • زِد حجم الدفعة: غيّر batch_size من 25 إلى 50
  • اضبط أوزان المجموعات: إذا كانت معظم النماذج المُصعّدة من مجموعة "غير مؤكد"، قلّل وزنها وزِد "خلاف" و"نمط_خطأ"

دوال التوسيم ذات تغطية منخفضة

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

قراءة إضافية