Skip to content

تعليق مكافأة العملية

اجمع إشارات مكافأة لكل خطوة لتدريب نماذج مكافأة العملية عبر وضعَي التعليق: الخطأ الأول وكل خطوة. وصدّر مباشرةً إلى صيغ تدريب PRM وDPO وSWE-bench.

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

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

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

ويتكامل الوضعان مع عرض تتبعات البرمجة، وعرض تتبعات الوكلاء، وعرض وكلاء الويب، فتستطيع جمع مكافآت العملية لأي نوع من تتبعات الوكلاء.

وضع الخطأ الأول

في وضع الخطأ الأول، يقرأ المعلّق التتبع بالتسلسل وينقر على أول خطوة أخطأ فيها الوكيل. وتُوسم كل الخطوات السابقة للخطوة المنقورة بأنها صحيحة تلقائياً. أما الخطوة المنقورة وكل ما يليها فتُوسم بأنها خاطئة (المنقورة بوصفها «الخطأ الأول» والبقية بوصفها «لاحقة للخطأ»).

وهذا ينتج صيغة الوسوم المطلوبة بالضبط لتدريب PRMs الثنائية: متتالية من الوسوم +1 يتلوها -1 عند نقطة الخطأ و-1 لكل الخطوات المتبقية.

التهيئة

yaml
annotation_schemes:
  - name: process_reward
    annotation_type: process_reward
    mode: first_error
    description: "Click the first step where the agent made a mistake"
 
    first_error:
      # Visual styling
      correct_color: "#22c55e"     # green for steps before the error
      error_color: "#ef4444"       # red for the first error step
      downstream_color: "#f97316"  # orange for steps after the error
      unmarked_color: "#6b7280"    # gray for steps not yet reviewed
 
      # Behavior
      require_confirmation: true   # ask "Are you sure?" before marking
      allow_no_error: true         # allow annotator to mark all steps correct
      show_step_content: true      # show step content in the annotation panel
 
      # Labels applied automatically
      labels:
        correct: "+1"
        first_error: "-1 (first error)"
        downstream: "-1 (downstream)"
        all_correct: "+1 (all correct)"

سير عمل التعليق التوضيحي

  1. يقرأ المعلّق التتبع من أعلاه إلى أسفله
  2. تكون الخطوات في البداية غير موسومة (رمادية)
  3. ينقر المعلّق على أول خطوة خاطئة
  4. تتحول الخطوات من 0 إلى N-1 إلى الأخضر (صحيحة)
  5. تتحول الخطوة N إلى الأحمر (الخطأ الأول)
  6. تتحول الخطوات من N+1 إلى النهاية إلى البرتقالي (لاحقة للخطأ)
  7. إن كان التتبع كله صحيحاً، ينقر المعلّق على All Steps Correct

صيغة المخرجات

json
{
  "id": "trace_042",
  "annotations": {
    "process_reward": {
      "mode": "first_error",
      "first_error_step": 4,
      "total_steps": 8,
      "labels": [1, 1, 1, 1, -1, -1, -1, -1]
    }
  }
}

وحين يوسم المعلّق كل الخطوات بأنها صحيحة، تكون قيمة first_error_step هي null ويحتوي مصفوف الوسوم على القيمة 1 كلها.

وضع كل خطوة

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

التهيئة

yaml
annotation_schemes:
  - name: process_reward
    annotation_type: process_reward
    mode: per_step
    description: "Rate each step independently"
 
    per_step:
      # Rating options
      labels:
        - value: "correct"
          display: "Correct"
          color: "#22c55e"
          score: 1.0
        - value: "partially_correct"
          display: "Partially Correct"
          color: "#eab308"
          score: 0.5
        - value: "incorrect"
          display: "Incorrect"
          color: "#ef4444"
          score: -1.0
        - value: "unnecessary"
          display: "Unnecessary"
          color: "#f97316"
          score: -0.5
        - value: "recovery"
          display: "Recovery from Error"
          color: "#3b82f6"
          score: 0.25
 
      # Optional error categorization for incorrect/partially correct steps
      error_categories:
        enabled: true
        categories:
          - "Wrong tool selected"
          - "Correct tool, wrong arguments"
          - "Hallucinated information"
          - "Repeated previous step"
          - "Logic error"
          - "Syntax error"
          - "Missed edge case"
          - "Unnecessary step"
          - "Other"
 
      # Behavior
      require_all_steps: true     # all steps must be rated before submission
      allow_notes: true           # optional text field per step
      show_running_score: true    # show cumulative reward score

سير عمل التعليق التوضيحي

  1. لكل خطوة في التتبع أداة تقييم بجانبها
  2. يختار المعلّق وسماً لكل خطوة
  3. إن قُيّمت الخطوة بأنها Incorrect أو Partially Correct وكانت فئات الأخطاء مفعّلة، ظهرت قائمة منسدلة لاختيار نوع الخطأ
  4. يتيح حقل ملاحظات اختياري شرحاً نصياً حراً
  5. تعرض درجة جارية في الأعلى المكافأة التراكمية

صيغة المخرجات

json
{
  "id": "trace_042",
  "annotations": {
    "process_reward": {
      "mode": "per_step",
      "total_steps": 6,
      "labels": [1.0, 1.0, -1.0, 0.25, 1.0, 1.0],
      "step_details": {
        "0": {"label": "correct"},
        "1": {"label": "correct"},
        "2": {
          "label": "incorrect",
          "error_category": "Wrong tool selected",
          "notes": "Agent used grep when it should have read the file directly"
        },
        "3": {
          "label": "recovery",
          "notes": "Agent recognized the mistake and tried a different approach"
        },
        "4": {"label": "correct"},
        "5": {"label": "correct"}
      },
      "cumulative_score": 2.75
    }
  }
}

مرجع التهيئة

خيارات التهيئة الكاملة لمخطط تعليق مكافأة العملية:

yaml
annotation_schemes:
  - name: process_reward
    annotation_type: process_reward
    mode: first_error              # "first_error" or "per_step"
    description: "Process reward annotation"
 
    # Required for mode: first_error
    first_error:
      correct_color: "#22c55e"
      error_color: "#ef4444"
      downstream_color: "#f97316"
      unmarked_color: "#6b7280"
      require_confirmation: true
      allow_no_error: true
      show_step_content: true
 
    # Required for mode: per_step
    per_step:
      labels:
        - value: "correct"
          display: "Correct"
          color: "#22c55e"
          score: 1.0
        - value: "incorrect"
          display: "Incorrect"
          color: "#ef4444"
          score: -1.0
      error_categories:
        enabled: false
        categories: []
      require_all_steps: true
      allow_notes: false
      show_running_score: false
 
    # Common options
    target: agentic_steps          # bind to trace steps
    keyboard_shortcuts:
      enabled: true
      correct: "1"
      incorrect: "2"
      partially_correct: "3"
      unnecessary: "4"
      next_step: "j"
      prev_step: "k"

التصدير إلى صيغ التدريب

يستطيع Potato تصدير تعليقات مكافأة العملية مباشرةً إلى الصيغ المستخدمة في خطوط تدريب PRM الشائعة.

صيغة تدريب PRM

صدّر وسوماً ثنائية على مستوى الخطوة لتدريب PRM:

bash
python -m potato.export \
  -i output/ \
  -f prm \
  -o results/prm_training_data.jsonl

صيغة المخرجات:

json
{
  "trace_id": "trace_042",
  "steps": [
    {"content": "Search for Tokyo population", "label": 1},
    {"content": "Parse search results", "label": 1},
    {"content": "Search for NYC population", "label": -1},
    {"content": "Compare populations", "label": -1}
  ]
}

أزواج التفضيل لـ DPO / RLHF

حين تكون لديك تتبعات معلَّقة متعددة للمهمة نفسها، صدّر تفضيلات زوجية لتدريب DPO أو RLHF. ويقرن المصدِّر التتبعات التي يفوق أحدها الآخر في المكافأة التراكمية:

bash
python -m potato.export \
  -i output/ \
  -f dpo \
  -o results/dpo_pairs.jsonl \
  --min-score-gap 0.5

صيغة المخرجات:

json
{
  "prompt": "Fix the failing test in test_parser.py",
  "chosen": [
    {"role": "assistant", "content": "Step 1: Read the test file..."},
    {"role": "assistant", "content": "Step 2: Identify the bug..."}
  ],
  "rejected": [
    {"role": "assistant", "content": "Step 1: Run all tests..."},
    {"role": "assistant", "content": "Step 2: Edit a random file..."}
  ]
}

نتائج متوافقة مع SWE-bench

صدّر نتائج التقييم بصيغة متوافقة مع مشاركات لوحة صدارة SWE-bench:

bash
python -m potato.export \
  -i output/ \
  -f swebench \
  -o results/swebench_results.json

يولّد هذا ملف JSON القياسي لتقييم SWE-bench، بمعرّفات الحالات، ورقع النموذج، وحالة الحل المستخلصة من أحكام المعلّقين.

التحليل

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

python
from potato.analysis import load_annotations, process_reward_stats
 
# Load annotations
annotations = load_annotations("output/")
 
# Step-level accuracy statistics
stats = process_reward_stats(annotations)
 
print(f"Total traces annotated: {stats['total_traces']}")
print(f"Traces with no errors: {stats['all_correct_count']} ({stats['all_correct_pct']:.1f}%)")
print(f"Average first-error position: step {stats['avg_first_error_step']:.1f}")
print(f"Average steps before error: {stats['avg_correct_prefix_length']:.1f}")
 
# Error distribution by step position
for position, count in stats['error_by_position'].items():
    print(f"  Step {position}: {count} errors")
 
# Error category distribution (per-step mode only)
if 'error_categories' in stats:
    for category, count in stats['error_categories'].items():
        print(f"  {category}: {count}")
 
# Inter-annotator agreement on first-error step
if stats['multi_annotator']:
    print(f"First-error agreement (exact): {stats['first_error_exact_agreement']:.2f}")
    print(f"First-error agreement (within 1): {stats['first_error_near_agreement']:.2f}")

التمثيل البصري

python
from potato.analysis import plot_error_distribution
 
# Plot error position distribution across all traces
plot_error_distribution(
    annotations,
    output_path="figures/error_distribution.png",
    normalize_by_trace_length=True,
    title="Where Do Agents First Go Wrong?"
)
 
# Plot per-step reward curves
from potato.analysis import plot_reward_curves
 
plot_reward_curves(
    annotations,
    output_path="figures/reward_curves.png",
    group_by="agent_model",
    title="Cumulative Reward by Model"
)

السياق البحثي

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

  • AgentPRM يبيّن أن نماذج مكافأة العملية المدرَّبة على وسوم على مستوى الخطوة تتفوق كثيراً على نماذج مكافأة النتيجة في توجيه وكلاء البرمجة أثناء البحث.
  • ToolRM وToolRL يبيّنان أن نماذج المكافأة المتخصصة في خطوات استخدام الأدوات تحسّن أداء الوكلاء في مهام استدعاء API وتوليد الكود.
  • DeepSWE يطبّق نماذج مكافأة العملية على مهام هندسة البرمجيات بحجم SWE-bench، مستخدماً وسوم كل خطوة لتدريب مدقّقات توجّه بحث شجرة الوكيل.
  • أبحاث RLHF على مستوى الخطوة تبيّن أن التغذية الراجعة البشرية لكل خطوة تنتج نماذج مكافأة أكفأ في استهلاك العينات من التغذية الراجعة على مستوى الحلقة كاملة.

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

انظر أيضاً

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