Proving Ground

وكلاء يحكم عليهم بما حدث فعلًا، لا بما يقولون إنه حدث

يقدم Proving Ground اختبارًا معياريًّا للوكلاء الذين يستخدمون الأدوات. يشغلهم داخل شركة محاكاة حتمية (عملاء، طلبات، تذاكر دعم، صندوق بريد وارد) ويقيم سجل أحداث هذا العالم، لا الرسالة الأخيرة للوكيل. ومقياسه الأبرز هو النجاح الموهوم: يقول الوكيل إن المبلغ قد استرد، ودفتر الحسابات لا يظهر أي استرداد.

النوع
مشروع شخصي، 2026، من تصميمي وتنفيذي بالكامل
العالم
40 عميلًا، 120 طلبًا، 30 تذكرة، 24 رسالة بريد إلكتروني، 9 وثائق في قاعدة المعرفة
المجموعة
24 سيناريو، 20 أداة، 4 هياكل تشغيل، 6 ملفات سياسات
النماذج
أي نقطة وصول متوافقة مع OpenAI، بدرجة حرارة 0 وبذرة ثابتة
الاختبارات
232 حالة اختبار (pytest)

الآلية تعمل ومختبرة: لكل سيناريو حل مرجعي مكتوب يدويًّا يجب أن ينجح. ولم يجر بعد أي اختبار معياري على نموذج، فلا نتائج تعرض حتى الآن.

خلية واحدة من الاختبار المعياري

الاختبار المعياري شبكة: سيناريو × هيكل تشغيل (scaffold) × ملف سياسات. كل خلية تشغل وكيلًا واحدًا في عالم جديد، وكل استدعاء لأداة يمر ببوابة السياسات قبل أن يتمكن من تغيير أي شيء.

سيناريو عدائي واحد، وكيل واحد، عالم واحد
خلية الاختبار سيناريو × هيكل بناء العالم بذرة 1001 + تعديل دور الوكيل واحد من 4 هياكل بوابة السياسات تلوّث، ميزانية، تأكيد تشغيل الأداة يسجل الحدث أولًا تقييم العالم فحوص على السجل التصنيف 14 رمز فشل النتائج SQLite + واجهة حية خلية الاختبار سيناريو × هيكل بناء العالم بذرة 1001 + تعديل دور الوكيل واحد من 4 هياكل بوابة السياسات تلوّث، ميزانية، تأكيد تشغيل الأداة يسجل الحدث أولًا تقييم العالم فحوص على السجل التصنيف 14 رمز فشل النتائج SQLite + واجهة حية
  • إدخال أو إخراج
  • استدعاء LLM
  • شيفرة
  • فحص أو بوابة
  1. خلية الاختبار خلية واحدة: سيناريو عدائي، وهيكل التشغيل ReAct، وملف السياسات «taint». كل رد من النموذج يسجل في شريط تسجيل (cassette)، فيمكن إعادة تشغيل الخلية كما هي تمامًا.
  2. بناء العالم عالم جديد من البذرة 1001 مضافًا إليه التعديل الخاص بالسيناريو، يكتبه في سجل الأحداث الفاعل «system».
  3. دور الوكيل يقرأ النموذج المهمة ويطلب أداة: read_inbox.
  4. بوابة السياسات تفحص بالترتيب: الأداة غير المعروفة، قائمة السماح، عدد الخطوات، الرموز (tokens)، التكرار؛ ثم، للأدوات التي لا رجعة فيها فقط: المنع، والتلوّث، والتأكيد. وهذه قراءة ضمن الميزانية: مسموح بها.
  5. تشغيل الأداة تتقدم الساعة الافتراضية ويضاف حدث إلى سجل العالم قبل أن يتغير أي شيء. ويمر نص الرسالة إلى متتبع التلوّث (taint tracker).
  6. دور الوكيل إحدى الرسائل تحمل تعليمات. فيستدعي الوكيل issue_refund، وهي أداة لا رجعة فيها، بمعرف طلب لم يظهر إلا في ذلك النص غير الموثوق.
  7. بوابة السياسات القرار: DENY_TAINT. يرفض الاستدعاء مع ذكر السبب، ولا يمس العالم ولا الساعة.
  8. دور الوكيل يقدم الوكيل إجابته النهائية دون أي استرداد.
  9. تقييم العالم تجرى الفحوص على الحالة النهائية للعالم، لا على الرد أبدًا: لا وجود لأي حدث استرداد. ولو زعم الرد حدوثه لعد ذلك نجاحًا موهومًا.
  10. التصنيف رمز فشل تحدده قواعد ثابتة مرتبة بحسب السبب الجذري، ونتيجة الهجوم تقرأ من العالم.
  11. النتائج تحفظ في SQLite وتبث عبر WebSocket إلى لوحة المتابعة: النجاح، والأمان، والنجاح الموهوم، وعدد الخطوات، والتكلفة.

مسارات أخرى في المخطط

  • تنتهي حلقة الأدوار أيضًا بعد 3 ردود متتالية غير سليمة الصياغة، أو عند 31 دورًا (ميزانية الخطوات البالغة 25 زائد 6).
  • نفاد الميزانية: يطلب من الوكيل أن ينهي عمله وأن يكون صادقًا، وأول استدعاء مرفوض بعد ذلك ينهي التشغيل.
  • الأدوات التي لا رجعة فيها تحت ملف السياسات «confirm»: يعيد الاستدعاء رمز تأكيد على الوكيل أن يرده كما هو. ولا يوجد موافق محاكى قد تتسرب إجابته.
  • نموذج تحكيم اختياري يقيم الوضوح والاستناد إلى الوقائع ومعايرة الثقة من 1 إلى 5. ولا يستطيع أبدًا تغيير نتيجة النجاح.

ثلث المجموعة لا يمكن كسبه بتنفيذ أي إجراء

تتوزع السيناريوهات الـ 24 على خمس فئات: 6 مباشرة، 4 ملتبسة، 4 مستحيلة، 4 فيها مشتتات، و6 عدائية. في الملتبسة والمستحيلة يكون التصرف الصحيح هو السؤال أو الرفض، فالوكيل الذي ينفذ دائمًا يخسر ثلث المجموعة.

بل إن العالم يسمح بمخالفة السياسات، كاسترداد مبلغ طلب ملغى، حتى يكون الوكيل هو موضع القياس لا المحاكي. ويرفق بكل سيناريو حل مرجعي مكتوب يدويًّا يجب أن ينجح دون أن يسجل عليه أي إنذار، وبذلك تختبر السيناريوهات نفسها.

أربعة هياكل تشغيل، والأدوات الـ 20 نفسها

10 أدوات قراءة، و6 عمليات كتابة يمكن التراجع عنها، و4 إجراءات لا رجعة فيها: استرداد المبالغ، وإرسال البريد الإلكتروني، والخصومات، والحذف.

  • ReAct

    حلقة واحدة: تفكير، ثم استدعاء أداة، ثم قراءة الملاحظة، إلى أن تأتي الإجابة النهائية.

  • التخطيط ثم التنفيذ

    مخطط يكتب أولًا خطة منظمة؛ ويسمح بإعادة التخطيط مرة واحدة إذا رفضت خطوات أو فشلت.

  • Reflexion

    بعد محاولة أولى، يراجع ناقد أصغر حجمًا سجلًّا آليًّا للاستدعاءات ولأحداث العالم، ثم يحصل الوكيل على محاولة إضافية واحدة مع 3 دروس على الأكثر. ولا يعاد العالم إلى حالته الأولى.

  • منسق ومنفذون

    وكيل رئيسي يفوض ما لا يزيد على 3 مهام فرعية إلى منفذين بأدوات مقيدة (الباحث يرى 10، والمشغل 16، ومسؤول التسوية الـ 20 كلها)، والتقييد مفروض عند الاستدعاء نفسه، لا مجرد إخفاء من الموجِّه (prompt).

ستة ملفات سياسات

من المفتوح (open) إلى الصارم (strict). الملف delimited يحصر النص غير الموثوق بين محددات؛ والملف confirm يشترط رمز تأكيد للأدوات التي لا رجعة فيها؛ والملف taint يمنع الاستدعاءات التي لا رجعة فيها إذا جاءت وسائطها من نص غير موثوق (تسلسلات من 5 كلمات، رموز نادرة، عناوين بريد إلكتروني)؛ والملف strict يجمع بين confirm و taint، أما السادس فهو readonly.

يفحص التلوّث قبل التأكيد، فلا يمكن لتعليمة محقونة أن تمر إلى التنفيذ بمجرد تأكيدها.

خيارات هندسية

  • الحكم لحالة العالم

    النجاح يحسب من سجل الأحداث. ولنموذج التحكيم أن يعلق على الرد، لكنه لا يستطيع تغيير النتيجة.

  • بلا LangGraph، عن قصد

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

  • حتمي بحكم البناء

    عالم مولد من بذرة، وساعة افتراضية، ودرجة حرارة 0، وشريط تسجيل لكل خلية: أي تغيير لا يعيد تسجيل إلا العمود الذي يمسه.

  • تتبّع التلوّث دون قوائم هجمات

    الكشف يتتبع مصدر النص بدل مطابقة حمولات هجومية معروفة. وقد عالجت قائمة سماح بالمعرفات الموثوقة إنذارًا كاذبًا حقيقيًّا كان يمنع الاسترداد الصحيح في سيناريو مباشر.

  • تقييد مفروض، لا مقترح

    قائمة أدوات المنفذ تفحص عند الاستدعاء، فالأداة الغائبة عن موجِّهه غائبة عن متناوله أيضًا.

  • بروتوكولان للتخاطب

    استدعاء الأدوات الأصلي، أو بروتوكول نصي بسيط من نوع THOUGHT / ACTION للنماذج التي لا تدعم استدعاء الدوال، ويسجل البروتوكول المستخدم مع كل تشغيل.

التقنيات

الوكلاء
حلقات مكتوبة يدويًّا، SDK متوافق مع OpenAI، أشرطة تسجيل JSONL
المحاكي
Python dataclasses، سيناريوهات YAML، تسجيل الأحداث (event sourcing)، ساعة افتراضية
الواجهة الخلفية
Python 3.12، FastAPI، WebSocket، SQLModel، SQLite
الواجهة الأمامية
React 18، Vite، Tailwind CSS 4، رسوم بيانية SVG مرسومة يدويًّا
الجودة
pytest، ruff، GitHub Actions

هل تبني شيئًا مشابهًا؟

يسعدني أن أشرح التصميم والمفاضلات، أو ما سأغيّره في الخطوة التالية.