تعليق مكافأة العملية
اجمع إشارات مكافأة لكل خطوة لتدريب نماذج مكافأة العملية عبر وضعَي التعليق: الخطأ الأول وكل خطوة. وصدّر مباشرةً إلى صيغ تدريب PRM وDPO وSWE-bench.
جديد في الإصدار v2.4.0
تتطلب نماذج مكافأة العملية (PRMs) وسوم صحة لكل خطوة لا درجة واحدة على مستوى النتيجة. وتدريب PRM فعّال يعني جمع تعليقات تحدد بالضبط أين أخطأ الوكيل في تتبع متعدد الخطوات، وأي نوع من الأخطاء وقع، وهل كان التعافي ممكناً. وهذا يختلف عن التعليق القائم على النتيجة، حيث لا تحكم إلا على النتيجة النهائية.
يوفر Potato وضعَي تعليق محسّنين لمقايضات مختلفة بين السرعة والتفصيل عند جمع بيانات مكافأة العملية. وضع الخطأ الأول مصمم للتوسيم الثنائي السريع: ينقر المعلّق على أول خطوة خاطئة، فتُعلَّم كل الخطوات التالية تلقائياً بأنها ملوّثة. أما وضع كل خطوة فيطلب من المعلّق تقييم كل خطوة على حدة، فينتج إشارات أغنى بكلفة وقت تعليق أطول.
ويتكامل الوضعان مع عرض تتبعات البرمجة، وعرض تتبعات الوكلاء، وعرض وكلاء الويب، فتستطيع جمع مكافآت العملية لأي نوع من تتبعات الوكلاء.
وضع الخطأ الأول
في وضع الخطأ الأول، يقرأ المعلّق التتبع بالتسلسل وينقر على أول خطوة أخطأ فيها الوكيل. وتُوسم كل الخطوات السابقة للخطوة المنقورة بأنها صحيحة تلقائياً. أما الخطوة المنقورة وكل ما يليها فتُوسم بأنها خاطئة (المنقورة بوصفها «الخطأ الأول» والبقية بوصفها «لاحقة للخطأ»).
وهذا ينتج صيغة الوسوم المطلوبة بالضبط لتدريب PRMs الثنائية: متتالية من الوسوم +1 يتلوها -1 عند نقطة الخطأ و-1 لكل الخطوات المتبقية.
التهيئة
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)"سير عمل التعليق التوضيحي
- يقرأ المعلّق التتبع من أعلاه إلى أسفله
- تكون الخطوات في البداية غير موسومة (رمادية)
- ينقر المعلّق على أول خطوة خاطئة
- تتحول الخطوات من 0 إلى N-1 إلى الأخضر (صحيحة)
- تتحول الخطوة N إلى الأحمر (الخطأ الأول)
- تتحول الخطوات من N+1 إلى النهاية إلى البرتقالي (لاحقة للخطأ)
- إن كان التتبع كله صحيحاً، ينقر المعلّق على All Steps Correct
صيغة المخرجات
{
"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 كلها.
وضع كل خطوة
في وضع كل خطوة، يقيّم المعلّق كل خطوة في التتبع على حدة. وهذا ينتج إشارات أغنى -- إذ يمكن أن تكون الخطوة «صحيحة جزئياً» أو «غير ضرورية» بدل صحيحة/خاطئة فقط. كما يلتقط الحالات التي يتعافى فيها الوكيل من خطأ، وهو ما لا يستطيع وضع الخطأ الأول تمثيله.
التهيئة
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سير عمل التعليق التوضيحي
- لكل خطوة في التتبع أداة تقييم بجانبها
- يختار المعلّق وسماً لكل خطوة
- إن قُيّمت الخطوة بأنها Incorrect أو Partially Correct وكانت فئات الأخطاء مفعّلة، ظهرت قائمة منسدلة لاختيار نوع الخطأ
- يتيح حقل ملاحظات اختياري شرحاً نصياً حراً
- تعرض درجة جارية في الأعلى المكافأة التراكمية
صيغة المخرجات
{
"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
}
}
}مرجع التهيئة
خيارات التهيئة الكاملة لمخطط تعليق مكافأة العملية:
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:
python -m potato.export \
-i output/ \
-f prm \
-o results/prm_training_data.jsonlصيغة المخرجات:
{
"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. ويقرن المصدِّر التتبعات التي يفوق أحدها الآخر في المكافأة التراكمية:
python -m potato.export \
-i output/ \
-f dpo \
-o results/dpo_pairs.jsonl \
--min-score-gap 0.5صيغة المخرجات:
{
"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:
python -m potato.export \
-i output/ \
-f swebench \
-o results/swebench_results.jsonيولّد هذا ملف JSON القياسي لتقييم SWE-bench، بمعرّفات الحالات، ورقع النموذج، وحالة الحل المستخلصة من أحكام المعلّقين.
التحليل
يوفر Potato دوال مساعدة لتحليل تعليقات مكافأة العملية:
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}")التمثيل البصري
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 صيغ الوسوم المستخدمة في هذه المقاربات مقابلةً مباشرة. ويعطي خط التصدير بيانات جاهزة للتدريب من دون معالجة مسبقة إضافية.
انظر أيضاً
- التعليق التوضيحي لوكيل البرمجة -- عرض تتبعات وكلاء البرمجة والتعليق عليها
- التعليق التوضيحي للوكلاء -- التعليق على تتبعات الوكلاء لأغراض عامة مع تقييمات لكل دور
- صيغ التصدير -- كل صيغ التصدير المدعومة
- مراقبة الجودة -- الاتفاق بين المعلّقين والفصل في الخلافات
للاطلاع على تفاصيل التنفيذ، راجع الوثائق المصدرية.