تخطَّ إلى المحتوى

ورقة غش ART (Agent Reinforcement Trainer)

ورقة غش 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]"
uvuv add openpipe-art
المتطلباتGPU CUDA للخلفية (التدريب/الاستدلال)

المفاهيم الأساسية

الحدالمعنى
النموذجمعالج نموذج قابل للتدريب (art.TrainableModel) مسجل مع خلفية
الخلفيةحيث يعمل الاستدلال + التدريب (GPU محلي أو بعيد)
Rolloutحلقة وكيل واحدة تنتج مسار وحافز
المسارالرسائل/استدعاءات الأدوات/الخيارات التي تسجلها وتتعلم منها ART
GRPOGroup 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 أخرى

الجانبARTOpenRLHFverl
التركيزالوكلاء متعددي الخطواتRLHF قابل للتوسعRL عالي الإنتاجية
البنيةsplit client/serverRay + vLLMRay + vLLM
الخلفيةvLLM + UnslothvLLMvLLM
الأفضل لالوكلاء المدربين في الكود الخاص بكخطوط أنابيب RLHF واسعة النطاقتوفر البحث

الموارد