Orkas Orkas
الرئيسية المدونة البنية
البنية

اكتشاف الحلقات ليس اكتشاف التعثر: رصد الوكلاء الذين يدورون في مكانهم دون تكرار

لدى Orkas ثلاث آليات للحماية من الحلقات. لا تلتقط أيٌّ منها نموذجًا قادرًا يصيبه التعثر، لأن الثلاث تسأل إن كان يكرر نفسه — والنموذج العالق لا يفعل ذلك أبدًا. إليك نقطة العمى، وتعريف التقدم من جهة المخرجات الذي استعرناه من BEACON، وما نخطط لقياسه قبل تغيير أي شيء.

هذه أولى سلسلة ملاحظات تصميمية عن الوكلاء ذوي المهام طويلة الأمد، استلهمناها من قراءة متأنية لـ BEACON (جامعة تشجيانغ، arXiv:2605.06078).

نعتقد أن صمود الوكيل خلال مهمة طويلة يتطلب تحقق أمرين:

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

يتناول هذا المقال منع التعثر، لأنه الجانب الذي كلّفنا أكثر من غيره.

الخلاصة الموجزة الوكيل الذي يدور في مكانه دون تكرار يحتاج أيضًا إلى اكتشافه كشف التعثر مدمج في Orkas، لذا تخبرك عملية التنفيذ الطويلة بأنها عالقة بدلًا من إنفاق بقية ميزانيتك بصمت.
نزّل Orkas — مجانًا

العَرَض

وصلتنا تقارير من المستخدمين، ورأينا ذلك داخليًا أيضًا: بعض المهام الطويلة جدًا تتوقف عن التقدم في منتصف الطريق.

انظر إلى السجلات وستجد الوكيل مشغولًا — يقرأ الملفات، ويبحث، وينفّذ الأوامر، ولا يخمل أبدًا. لكن بعد نصف ساعة، لا يكون شيء قد تقدم.

كان تفسيرنا الأول فقدان السياق: أسقط الضغط السجل الذي يبيّن أن مسارًا قد جُرّب بالفعل، فعاد الوكيل وجرّبه من جديد. وعند قراءة الشيفرة والسجلات معًا، اتضح أن ذلك لا يمثل سوى نصف القصة.

كانت لدينا آليات حماية بالفعل — ثلاث طبقات منها

الطبقةالمعيارالعتبات
تكرار مطابقاسم الأداة + المعاملات بصيغتها المعيارية، متطابقة على مستوى البايتLOOP_WARN=3 تحذير / LOOP_HARD=5 إيقاف قسري
شبه تكرارمتطابق باستثناء حقول المعرّف / الطابع الزمني المتغيّرةNEAR_DUP_LOOP_WARN=6 / NEAR_DUP_LOOP_HARD=12
تلاقي مؤشرات الدوران≥2 عمليتا ضغط و استهلاك ≥75% من ميزانية حلقة الأدواتSPIN_CONVERGENCE_MIN_COMPACTIONS=2
SPIN_CONVERGENCE_TOOL_LOOP_RATIO=0.75

يقول التعليق على تلك الطبقة الثالثة حرفيًا: إشارة مركّبة إلى «احتمال الدوران في المكان بعد فقدان السياق». كان أحدهم قد توقّع هذا بالفعل. لذلك لم تكن المشكلة يومًا أننا لم نبنِ شيئًا — بل أن ما بنيناه لم يستطع رصده.

نقطة العمى: الثلاث كلها كواشف من جهة المدخلات

البصمة التي تعتمد عليها كل طبقة هي اسم الأداة + المعاملات بصيغتها المعيارية. وهذا يجيب عن سؤال واحد بالضبط: هل تفعل الشيء نفسه مرتين؟

لكن النموذج القادر حين يعلق لا يكرر الاستدعاءات. بل يفعل هذا:

قراءة الملف A → grep X → إعادة قراءة A بنطاق أسطر مختلف
  → تنفيذ أمر مختلف قليلًا → قراءة الملف B → grep مجددًا …

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

كشف الحلقات ليس كشف التعثر. الأول ينظر إلى المدخلات. والثاني يجب أن ينظر إلى المخرجات.

تقدّم الورقة البحثية هذا التعريف من جهة المخرجات بالضبط

مكافأة BEACON داخل المقطع:

r_t = R_ms · γ^(t_k − t)    إذا انتهى المقطع بمرحلة إنجاز
    = 0                     خلاف ذلك

المقطع الذي لا ينتهي بمرحلة إنجاز يحصل على صفر بالضبط، بصرف النظر عن عدد الإجراءات التي احتواها. لا يدخل عدد الإجراءات في المعادلة مطلقًا. وهذه أوضح صياغة رسمية لمبدأ الانشغال ≠ التقدم رأيناها.

طبقة خط الأساس أشد صرامة. فخط الأساس هو متوسط العائد للمجموعة لكل خطوة ، لذا فإن المقطع الذي استغرق 8 خطوات بينما كان متوسط المجموعة 5 يصبح تقدير أفضليته بالكامل مائلًا إلى السالب، وتزداد العقوبة مع مقدار التجاوز. الدوران في المكان لا يكتفي بعدم تلقي المكافأة؛ بل يُعاقَب عليه فعليًا وبصورة تناسبية.

يعرض الشكل 8 من الورقة مسارًا فاشلًا يتلقى فيه الإجراءان الأخيران قيمة متطابقة قدرها −2.20. ذلك الذيل — الفترة التي تلي آخر مرحلة إنجاز ولا تبلغ مرحلة أخرى — هو الشكل الرياضي للدوران في المكان. وهو شائع: فالمسارات التي تُكمل هدفًا فرعيًا واحدًا على الأقل لكنها تفشل في المهمة تظل عند نسبة ثابتة تبلغ 39–47% من العينات.

تجربة استبعاد واحدة تستبعد محفّزات عدد الخطوات

التقسيمالنتيجةمقارنة بخط الأساس (72.8)
تقسيم عشوائي إلى 5 أجزاء74.2+1.4
مراحل إنجاز حقيقية91.4+17.2

التقسيم وفق أعداد اعتباطية من الخطوات لا يضيف شيئًا يُذكر. أما التقسيم وفق بنية حقيقية فيضيف الكثير.

والآن أعد النظر في معيار طبقتنا الثالثة — استهلاك 75% من ميزانية حلقة الأدوات. هذا محفّز يعتمد على عدد اعتباطي من الخطوات. يسأل كم استهلكت، لا ماذا أنجزت. الصيغة الصحيحة هي:

✗  إذا كانت الخطوات > N                              → تدخّل
✓  إذا كانت الخطوات > N وكانت مراحل الإنجاز المتحقق منها صفرًا → تدخّل

لن يطلق الثاني إنذارًا خاطئًا في مهمة طويلة بحق وتحرز تقدمًا، لأن مثل هذه المهمة تبلغ مراحل إنجاز أثناء سيرها. أما الأول فسيفعل.

توجد أيضًا حلقة تغذية راجعة إيجابية

ضع الثوابت جنبًا إلى جنب. يبدأ الضغط عند 82% من نافذة السياق. ويتطلب تلاقي مؤشرات الدوران عمليتي ضغط مع استهلاك 75% من ميزانية الحلقة قبل أن يتفعّل.

دوران في المكان → امتلاء السياق → تفعيل الضغط → ضياع الحالة الدائمة في التلخيص
     → إعادة استنتاج ما فُقد → مزيد من الدوران

يستدل كاشف الدوران على الدوران بملاحظة تكرار الضغط — لكن الضغط هو الخطوة نفسها التي تسبب فقدان الذاكرة. إنه يرصد عَرَضًا لاحقًا، ويضطر إلى انتظار اكتمال دورتين من الحلقة.

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

ما نضيفه: كشف التعثر من جهة المخرجات

طبقة رابعة مبنية على عدّادين. كلاهما مشتق آليًا من ملاحظات الأدوات التي يسجّلها المضيف أصلًا؛ ولا يحتاج أيٌّ منهما إلى حكم النموذج.

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

تغيّرات الحالة الجديدة بعد إزالة التكرار. وهو الأكثر فائدة بين الاثنين:

  • قراءة ملف تطابق بصمة محتواه قراءة سابقة ليست معلومة جديدة — فإعادة قراءة الملف نفسه بنطاق أسطر مختلف لا تغيّر البصمة.
  • الأمر الذي يطابق اسمه ورمز خروجه وبصمة مخرجاته جميعًا تشغيلًا سابقًا ليس معلومة جديدة.
  • عملية الكتابة التي تتساوى فيها البصمة اللاحقة مع السابقة تعني أنه لم يُكتب شيء فعليًا.

يستهدف هذا العدّاد بالضبط الحالة التي تفوت مطابقة البصمات: كل إجراء مختلف، والمكسب المعلوماتي صفر. المعيار آلي ولا يحتاج إلى فهم دلالي.

ثم ينبغي أن يكون الضغط مستمرًا بدلًا من حثٍّ واحد:

إظهار العدّاد في السياق ليراه النموذج
  → فرض مراجعة للخطة (الإقرار بأن هذا المسار مسدود)
    → سؤال المستخدم
      → إيقاف التنفيذ، مع الحفاظ على مراحل الإنجاز التي تحققت بالفعل

تلك الدرجة الأخيرة مهمة. إذا كان التنفيذ سيتوقف، فيجب أن يتوقف محتفظًا بما حققه — وهو التقدم الجزئي نفسه البالغ 39–47% الذي قاست الورقة ضياعه.

ما لا تقدّمه لنا الورقة

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

ويحتاج خط أساسها لكل خطوة أيضًا إلى متوسط طول مقاطع المجموعة مرجعًا. في بيئة الإنتاج، تُنفَّذ مهمة المستخدم عادةً مرة واحدة بالضبط، لذا لا توجد مجموعة. أفضل بديل متاح هو الإحصاءات التاريخية لمهام مشابهة، لكنه أكثر ضجيجًا بكثير ولا يحمل أيًا من ضمانات عزل التباين التي تقدّمها الورقة.

الخطوة الأولى هي القياس، لا الإصلاح

قبل تغيير أي منطق لاتخاذ القرار، نريد إضافة أدوات رصد والإجابة عن سؤال لا نستطيع الإجابة عنه حاليًا: من حالات التعثر التي تحدث في الإنتاج، كم منها من نوع فقدان الذاكرة وكم منها من نوع انعدام التدرج؟

  • إذا كانت مصحوبة غالبًا بـ مكسب معلوماتي يساوي صفرًا مع اختلاف جميع بصمات الاستدعاءات → فهي من نوع انعدام التدرج. الطبقات الثلاث الحالية عاجزة بنيويًا عن رصدها، والحل هو الكشف من جهة المخرجات.
  • إذا كانت مصحوبة غالبًا بـ إعادة قراءة محتوى سبق أن أزاله الضغط → فهي من نوع فقدان الذاكرة. ما يحتاج إلى الإصلاح هو ما يحتفظ به الضغط.

تستدعي هاتان النتيجتان استثمارات مختلفة تمامًا. القياس أولًا أقل تكلفة من التصميم أولًا، وأدوات الرصد شبه مجانية لأن الملاحظات موجودة بالفعل.

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