الانتقال إلى المحتوى الرئيسي

التنفيذ المتين ليس استدلالاً متيناً: تخزين حالة الوكيل دون فقدان القصد

حفظ مؤشر خطوة الوكيل ليس حفظاً لحالة مهمته. الأنظمة التي تخزّن نقطة استئناف التنفيذ دون القصد تستأنف في مسارات طليقة وغير متماسكة.

لقطة قريبة لرف خوادم تُظهر مصابيح حالة وكابلات شبكة موسومة موصولة بمحوّل.

شيئان يُسمّيان الحالة

عادةً ما تسجّل نقطة الاستئناف (checkpoint) في بيئة تشغيل الوكيل ميكانيكا التشغيل: أي عقدة من الرسم البياني نُفّذت، وأي أداة استُدعيت، وما أعادته الأداة، وأي حافة ما زالت معلّقة. هذه هي حالة التنفيذ. وهي كافية للإجابة عن سؤال "أين كانت الآلة؟"

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

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

إعادة التخطيط من هدف بائد

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

آثار جانبية مكررة

الحالة الكلاسيكية: نجح آخر استدعاء أداة لكن ضاع الإقرار. محرّك التنفيذ المتين الذي يستأنف عند أول خطوة غير مكتملة سيعيد إصدار الاستدعاء. وإذا كان الاستدعاء charge_card أو send_email أو create_ticket، فصار للتشغيل اثنان الآن. هذا ليس فشل استدلال؛ بل فشل عقد نقطة الاستئناف. سجّل السجل نية الاستدعاء، لا واقعة الأثر، ولا يمكن التمييز بينهما إلا إذا حمل الأثر نفسه مفتاحاً يتعرف عليه النظام اللاحق.

Close-up of a modern building facade with geometric design and reflective windows

انحراف الافتراضات

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

عقد نقطة استئناف قابل للعمل

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

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

الآلية التي تجعل هذا يعمل عملياً هي مفتاح idempotency محصور بنطاق التشغيل، مشتق من مدخلات مستقرة لا من الساعة الجدارية أو التسلسل:

key = hash(run_id, step_name, canonical_args)

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

الآلية الثانية هي الرفض. تحمل نقطة الاستئناف إصدار مخطط، وترفض بيئة التشغيل الاستئناف عبر إصدارات غير متوافقة بدلاً من محاولة ترحيل بأفضل جهد. ترحيل القصد هو إعادة تخطيط، وإعادة التخطيط ينبغي أن تكون عملية صري![Colorful absIridescent swirls in a soap bubble texture, resembling an oil slickCircuit board macro

متى لا تستأنف

التنفيذ المتين افتراضي، لا خير شامل. ثلاث حالات ترجّح إعادة الدخول بدلاً من المتابعة.

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

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

مجموعات افتراضات لم تعد صالحة. إذا سُحب أي قيد مقبول من مصدره، فلا استمرار صالح للتشغيل. له إعادة بدء صالحة.

المقايضة

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

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

ما ينبغي تسجيله

قاعدة عملية: قبل كتابة دالة نقطة الاستئناف، اكتب ما سيحتاجه مشغّل جديد لتولي التشغيل في منتصف الطريق دون سؤال المشغّل الأصلي عن أي شيء. تلك القائمة هي حالة القصد. مؤشر الخطوة ليس عليها. وكل ما عليها ينبغي أن يكون في نقطة الاستئناف، مُصدَّراً بإصدار، ومقترناً بمفتاح idempotency لكل أثر يمكن أن يُحدثه التشغيل في العالم الخارجي. الاستدلال المتين هو الخاصية التي تنجو من إعادة التشغيل؛ أما التنفيذ المتين فهو مجرد الآلية التي تجعل إعادة التشغيل ممكنة.

مشاركةXLinkedInرابط دائم5 دقيقة قراءة

قراءات ذات صلة

الأسئلة التي يجيب عنها هذا

What is the difference between execution state and intent state in an agent run?

Execution state is the cursor: which step ran, which tool returned what, what is pending. Intent state is the goal, the accepted constraints, the assumptions committed to, and the unresolved obligations. A checkpoint that stores only the cursor can resume the machine but not the reasoning.

Why do resumed agents produce duplicate side effects?

Because the journal records the intent to call a tool, not the fact of the effect. If the call succeeded but the acknowledgement was lost, replay re-issues it. Run-scoped idempotency keys derived from stable inputs let the downstream system recognise the replay and return the prior result instead of repeating the effect.

When should a run not be resumed?

When it crossed an authorisation boundary, when the gap since the last checkpoint exceeds the half-life of the external facts it depends on, or when an accepted constraint has been withdrawn at its source. These cases call for re-approval or re-planning, not continuation.

Should checkpoints be migrated across schema versions?

No. Migration of intent is a re-plan and should be an explicit, logged operation. The runtime should version the checkpoint schema and refuse to resume across incompatible versions rather than attempting a silent best-effort migration.