Skip to content

प्रोसेस रिवॉर्ड एनोटेशन

प्रोसेस रिवॉर्ड मॉडल प्रशिक्षित करने के लिए first-error और प्रति-चरण एनोटेशन मोड से प्रति-चरण रिवॉर्ड संकेत जुटाएँ। सीधे PRM, DPO और SWE-bench प्रशिक्षण फ़ॉर्मैट में निर्यात करें।

v2.4.0 में नया

प्रोसेस रिवॉर्ड मॉडल (PRM) को एक कुल आउटकम-स्तरीय स्कोर की जगह प्रति-चरण शुद्धता लेबल चाहिए। कारगर PRM प्रशिक्षित करने का मतलब है ऐसे एनोटेशन जुटाना जो ठीक-ठीक बताएँ कि बहु-चरणीय ट्रेस में एजेंट कहाँ भटका, किस तरह का एरर हुआ, और उससे उबरना मुमकिन था या नहीं। यह आउटकम-आधारित एनोटेशन से अलग है, जहाँ आप सिर्फ़ अंतिम नतीजे को आँकते हैं।

प्रोसेस रिवॉर्ड डेटा जुटाते समय रफ़्तार और बारीकी के अलग-अलग संतुलन के लिए Potato दो एनोटेशन मोड देता है। First-error मोड तेज़ बाइनरी लेबलिंग के लिए बना है: एनोटेटर पहले ग़लत चरण पर क्लिक करता है, और उसके बाद के सारे चरण अपने आप दूषित चिह्नित हो जाते हैं। प्रति-चरण मोड में एनोटेटर हर चरण को स्वतंत्र रूप से आँकता है, जिससे ज़्यादा भरे-पूरे संकेत मिलते हैं पर एनोटेशन में समय ज़्यादा लगता है।

दोनों मोड कोडिंग ट्रेस डिस्प्ले, एजेंट ट्रेस डिस्प्ले और वेब एजेंट डिस्प्ले के साथ काम करते हैं, इसलिए आप किसी भी तरह के एजेंट ट्रेस के लिए प्रोसेस रिवॉर्ड जुटा सकते हैं।

First-Error मोड

first-error मोड में एनोटेटर ट्रेस को क्रम से पढ़ता है और उस पहले चरण पर क्लिक करता है जहाँ एजेंट ने एरर किया। क्लिक किए गए चरण से पहले के सारे चरण अपने आप सही लेबल हो जाते हैं। क्लिक किया गया चरण और उसके बाद के सारे चरण ग़लत लेबल होते हैं (क्लिक किया गया चरण "first error" के रूप में और बाक़ी "downstream of error" के रूप में)।

इससे ठीक वही लेबल फ़ॉर्मैट बनता है जो बाइनरी PRM प्रशिक्षित करने के लिए चाहिए: +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 से आख़िर तक नारंगी (downstream) हो जाते हैं
  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 होता है और labels सरणी में सारे मान 1 होते हैं।

प्रति-चरण मोड

प्रति-चरण मोड में एनोटेटर ट्रेस के हर चरण को स्वतंत्र रूप से आँकता है। इससे ज़्यादा भरे-पूरे संकेत मिलते हैं -- कोई चरण सिर्फ़ सही/ग़लत होने के बजाय "आंशिक रूप से सही" या "ग़ैरज़रूरी" भी हो सकता है। यह उन मामलों को भी पकड़ता है जहाँ एजेंट एरर से उबर जाता है, जिन्हें first-error मोड दर्ज नहीं कर सकता।

कॉन्फ़िगरेशन

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

इससे मानक SWE-bench मूल्यांकन JSON बनता है, जिसमें instance ID, मॉडल पैच, और एनोटेटरों के निर्णय से निकाली गई समाधान स्थिति होती है।

विश्लेषण

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 पैमाने के सॉफ़्टवेयर इंजीनियरिंग टास्क पर लागू करता है और प्रति-चरण लेबल से ऐसे वेरिफ़ायर प्रशिक्षित करता है जो एजेंट के ट्री सर्च को दिशा देते हैं।
  • Step-level RLHF पर शोध दिखाता है कि प्रति-चरण मानवीय फ़ीडबैक एपिसोड-स्तरीय फ़ीडबैक से ज़्यादा सैंपल-कुशल रिवॉर्ड मॉडल बनाता है।

Potato के first-error और प्रति-चरण मोड सीधे उन लेबल फ़ॉर्मैट से मेल खाते हैं जो ये तरीक़े इस्तेमाल करते हैं। निर्यात पाइपलाइन बिना किसी अतिरिक्त प्रीप्रोसेसिंग के प्रशिक्षण के लिए तैयार डेटा देती है।

यह भी देखें

क्रियान्वयन के विवरण के लिए स्रोत दस्तावेज़ देखें।