الوحدة 7 — الضوابط: ميزانيّة الرموز والصلاحيّات ونقاط التوقّف
وكيل بلا حدود مخاطرة يومًا ما ستُدفع فاتورتها: حلقة لانهائيّة تلتهم الرصيد، أداة كتابة تُحدث قرارًا لا رجعة فيه، صلاحيّات ممنوحة زيادة. هذه الوحدة تُلبس الوكيل درعًا: أربع طبقات ضبط تعمل معًا.
الطبقة 1: حدّ التكرار
سبق أن رأينا حدّ التكرار في الوحدة 2. في الإنتاج، تعامل معه معاملة حاجز إلزاميّ:
- افتراضيّ محافظ: 10 خطوات لأسئلة عامّة، 15 لأسئلة معقّدة. لا 40.
- تسجيل صريح للحالات التي تبلغ الحدّ: هذه ليست «طلبات كبيرة»، بل مؤشّر عطل. راجع كلّ حالة.
- لا رفع الحدّ لع لاج مشكلة. إن تجاوز الوكيل الحدّ باستمرار، السبب أعمق: أداة مكسورة، أو تعليمة غامضة، أو وصف يُغري بالتكرار.
الطبقة 2: ميزانيّة رموز
الحدّ بعدد الخطوات لا يكفي: خطوة واحدة قد تقرأ صفحة ويب من 60 ألف حرف فترفع الفاتورة وحدها. نُضيف ميزانيّة رموز:
class BudgetRmoz:
def __init__(self, max_input=15000, max_output=3000):
self.total_input = 0
self.total_output = 0
self.max_input = max_input
self.max_output = max_output
def enregistrer(self, usage):
self.total_input += usage.prompt_tokens
self.total_output += usage.completion_tokens
if self.total_input > self.max_input:
raise BudgetDepasse("رموز الإدخال تجاوزت الحدّ")
if self.total_output > self.max_output:
raise BudgetDepasse("رموز المخرَج تجاوزت الحدّ")
budget = BudgetRmoz()
# في كلّ نداء نموذج:
budget.enregistrer(reponse.usage)
عند بلوغ الحدّ، نتوقّف بجواب صريح: «لم أستطع إتمام الطلب في الميزانيّة المخصَّصة». هذا أفضل من جواب مقتضب مبنيّ على معلومة ناقصة، وأصدق مع المستخدم.
الطبقة 3: صلاحيّات لكلّ أداة
ليست كلّ الأدوات متساوية. نُصنِّفها بثلاث مستويات:
- قراءة:
recherche_web,lire_page,base_interne. تنفَّذ تلقائيّا. - كتابة داخليّة:
noter_faitتكتب في مذكّرة مؤقّتة. تنفَّذ تلقائيّا، لكن يُسجَّل كلّ استدعاء. - كتابة خارجيّة:
envoyer_mail,creer_ticket_jira,payer. لا تنفَّذ بلا تأكيد بشريّ.
الصلاحيّات تُطبَّق ضمن مغلِّف تنفيذ:
NIVEAUX = {"recherche_web": "lecture", "envoyer_mail": "ecriture_externe"}
def executer(nom, args, session):
niveau = NIVEAUX[nom]
if niveau == "ecriture_externe":
if not session.confirme_utilisateur(nom, args):
return {"erreur": "المستخدم لم يُؤكِّد التنفيذ"}
# تنفيذ فعليّ
...
الطبقة 4: الإنسان في الحلقة
للأفعال غير القابلة للتراجع، نتوقّف قبل التنفيذ ونعرض على المستخدم:
- الاسم الحرفيّ للأداة.
- الوسائط المُقترَحة.
- ملخّص أثر الفعل.
النموذج البصريّ الأمثل ثلاثة أزرار: «نفِّذ»، «عدِّل الوسائط»، «إلغِ». لا زرّ افتراضيّ؛ الافتراضيّ هو الإلغاء. سبب ذلك: مستخدم متعب يضغط «موافق» بلا قراءة إن كان الافتراضيّ إيجابيًّا.
LangGraph يُقدِّم interrupt_before=["outil_dangereux"] جاهزًا لهذا. في تنفيذ يدويّ، نُدمجه في مغلِّف executer:
def executer(nom, args, session):
if NIVEAUX[nom] == "ecriture_externe":
decision = session.demander_confirmation({
"outil": nom,
"arguments": args,
"resume": decrire_effet(nom, args),
})
if decision["action"] == "annuler":
return {"annule": True, "raison": decision.get("commentaire", "")}
if decision["action"] == "modifier":
args = decision["nouveaux_arguments"]
return fonctions[nom](**args)
البيئة المعزولة
القراءة من الويب تجلب معها مخاطر: صفحة مسمومة تحقن تعليمات، رابط يستدعي خدمة داخليّة، ملف يُنزَّل حجمه هائل. نُشغِّل قراءة الصفحات في بيئة معزولة:
- شبكة محدودة: يُسمح فقط بالمنافذ 80/443 على قائمة نطاقات معتمَدة.
- مهلة زمنيّة: كلّ تحميل صفحة يفشل بعد عشر ثوان.
- سقف حجم: 500 كيلوبايت لكلّ صفحة؛ أكبر من ذلك، نُقتطع.
- عزل من الشبكة الداخليّة: لا وصول إلى
10.0.0.0/8مثلًا.
هذا لا يمنع كلّ الهجمات (سنرى الحقن في الوحدة 8)، لكنّه يمنع الأخطر: مسح شبكة داخليّة بأداة نموذج.
الخيط الأحمر: طبقات الأمان
وكيل البحث الآن يعمل بأربع طبقات:
- حدّ تكرار 12 خطوة.
- ميزانيّة رموز 20 ألفًا مُدخَل و4 آلاف مخرَج.
- صلاحيّات: كلّ أدواته «قراءة» أو «كتابة داخليّة»، لا كتابة خارجيّة بعد. حين نُضيف
envoyer_mail_manager(لإرسال المذكّرة النهائيّة)، ستحتاج تأكيدًا. - بيئة معزولة لـ
lire_page.
نتيجة: 30 اختبار تشغيل، لا حالة واحدة تجاوزت الميزانيّة بغير تسجيل مقروء، ولا استدعاء بلا تأكيد لأداة كتابة خارجيّة.
الفخّ: الضوابط بعد الحادث
فرق كثيرة تُضيف الضوابط بعد حادث مكلف: 400 دولار في ليلة، أو بريد أُرسل بلا مراجعة. الضوابط الأربعة أعلاه رخيصة إن كُتبت أوّلًا، مُكلِفة إن كُتبت بعد. اعتبرها جزءًا من تعريف الوكيل، لا ميزة إضافيّة.
فخّ آخر: ضوابط في التطوير، مُعطَّلة في الإنتاج «لأنّها تُبطئ الاختبارات». هذا ينسف الضبط. الحلّ: نفس الضوابط، بمعامل مختلف. مثلًا: حدّ التكرار 8 في التطوير (كشف أسرع للأخطاء)، 12 في الإنتاج.
كلّ ضابط أعلاه له إعدادات؛ الإعدادات الافتراضيّة آمنة. مطوّر مستعجل قد ينسى تفعيل ميزانيّة الرموز؛ إن كان الافتراضيّ «بلا سقف»، تنفجر الفاتورة. الافتراضيّ يجب أن يكون سقفًا محافظًا؛ من يحتاج توسيعه يُصرِّح بذلك.
الخلاصة
- أربع طبقات ضبط: حدّ تكرار، ميزانيّة رموز، صلاحيّات لكلّ أداة، تأكيد بشريّ للأفعال غير القابلة للتراجع.
- بلوغ حدّ التكرار مؤشّر عطل، لا طلب رفع؛ راجع السبب قبل رفع السقف.
- تأكيد بشريّ بثلاث خيارات صريحة (نفِّذ، عدِّل، ألغِ)؛ الافتراضيّ هو الإلغاء.
- بيئة معزولة لقراءة الويب تمنع أخطر السيناريوهات؛ وحقن التعليمات ما زال ممكنًا (الوحدة 8).