ورقة غش ART (Agent Reinforcement Trainer)
ART (Agent Reinforcement Trainer) من OpenPipe هو إطار عمل مفتوح المصدر لتدريب الوكلاء القائمين على LLM مع التعلم التعزيزي بشكل أساسي GRPO. الفكرة المحددة لها هي بنية split: عميل خفيف الوزن يقوم بتشغيل rollouts لوكيلك في الكود الخاص بك من خلال نقطة نهاية متوافقة مع OpenAI بينما خادم/خلفية يتعامل مع الاستدلال (vLLM) والتدريب (GRPO مدعوم من Unsloth)، بشكل اختياري على آلة GPU منفصلة. هذا يجعلها مناسبة جداً للوكلاء متعددي الأدوار والذين يستخدمون الأدوات والذين يحتاجون إلى تدريب “أثناء العمل” مقابل مكافأة.
التعلم التعزيزي يمكن أن يكون غير مستقر وجشعاً للحساب. ابدأ بحجم صغير وسجل كل شيء تحقق من وظيفة المكافأة على حفنة من rollouts قبل التوسع.
التثبيت
| الخطوة | الأمر |
|---|
| التثبيت | pip install openpipe-art |
| مع extras (الخلفية) | pip install "openpipe-art[backend]" |
| uv | uv add openpipe-art |
| المتطلبات | GPU CUDA للخلفية (التدريب/الاستدلال) |
المفاهيم الأساسية
| الحد | المعنى |
|---|
| النموذج | معالج نموذج قابل للتدريب (art.TrainableModel) مسجل مع خلفية |
| الخلفية | حيث يعمل الاستدلال + التدريب (GPU محلي أو بعيد) |
| Rollout | حلقة وكيل واحدة تنتج مسار وحافز |
| المسار | الرسائل/استدعاءات الأدوات/الخيارات التي تسجلها وتتعلم منها ART |
| GRPO | Group Relative Policy Optimization — خوارزمية RL الافتراضية |
| المكافأة | قيمة عددية يعينها الكود الخاص بك لمسار (أعلى = أفضل) |
تحديد نموذج
import art
model = art.TrainableModel(
name="agent-001",
project="my-agent",
base_model="Qwen/Qwen2.5-7B-Instruct",
)
backend = art.LocalBackend() # or a remote backend
await model.register(backend)
| الكائن | الغرض |
|---|
art.TrainableModel(...) | السياسة التي تدربها |
art.LocalBackend() | تشغيل الاستدلال + التدريب على GPU المحلي |
model.register(backend) | ربط نموذج بخلفية |
model.openai_client() | عميل متوافق مع OpenAI للـ rollouts |
كتابة Rollout
import art, weave
@weave.op
async def rollout(model: art.Model, scenario) -> art.Trajectory:
client = model.openai_client()
traj = art.Trajectory(messages_and_choices=[], reward=0.0)
messages = [{"role": "user", "content": scenario.prompt}]
completion = await client.chat.completions.create(
model=model.name, messages=messages,
)
choice = completion.choices[0]
traj.messages_and_choices.append(choice)
traj.reward = score(choice.message.content, scenario) # your reward fn
return traj
حلقة التدريب
for step in range(NUM_STEPS):
groups = await art.gather_trajectory_groups(
(art.TrajectoryGroup(rollout(model, s) for _ in range(GROUP_SIZE))
for s in scenarios)
)
await model.train(groups, config=art.TrainConfig(learning_rate=1e-5))
| الاستدعاء | الوصف |
|---|
art.TrajectoryGroup(...) | مجموعة من rollouts مقارنة مع بعضها البعض (GRPO) |
art.gather_trajectory_groups(...) | تشغيل rollouts بالتزامن وجمع المجموعات |
model.train(groups, config=...) | تحديث GRPO واحد من المجموعات المجمعة |
art.TrainConfig(...) | معدل التعلم وفائقة تدريب التدريب |
model.get_step() | خطوة التدريب الحالية (للنقاط والاستئناف) |
نصائح تصميم المكافأة
| المبدأ | السبب |
|---|
| احفظ المكافآت مربوطة | يثبت تقديرات ميزة GRPO |
| كافئ النتيجة وليس الصياغة | تجنب اختراق المكافآت على الصياغة |
| أضف تشكيل صغير لنجاح الأداة | يساعد على نسب الائتمان متعدد الخطوات |
| استخدم RULER للتصنيف النسبي | مساعد ART لترتيب المسارات في مجموعة عندما لا توجد مقياس نظيف |
الملاحظة
| الأداة | التكامل |
|---|
| Weights & Biases | تسجيل أصلي لمنحنيات المكافآت/الخسارة |
| Weave | تزيين rollouts مع @weave.op لالتقاط التتبع |
| LangfuseTracing | مدعوم لفحص المسار |
ART مقابل معالجات RL أخرى
| الجانب | ART | OpenRLHF | verl |
|---|
| التركيز | الوكلاء متعددي الخطوات | RLHF قابل للتوسع | RL عالي الإنتاجية |
| البنية | split client/server | Ray + vLLM | Ray + vLLM |
| الخلفية | vLLM + Unsloth | vLLM | vLLM |
| الأفضل ل | الوكلاء المدربين في الكود الخاص بك | خطوط أنابيب RLHF واسعة النطاق | توفر البحث |
الموارد