الدرس 03 · تخطيط

دع الوكيل يتتبع تقدمه بنفسه

«يستطيع الوكيل تتبع تقدمه الخاص — ويمكنني رؤية ذلك.» اجعل النموذج يضع قائمته بنفسه، ثم استخدم آلية بسيطة لجعله يتذكر تحديثها.

⏱ ~10 د · 📝 3 مكونات تفاعلية · 🧑‍💻 مبني على shareAI-lab · s03_todo_write.py

التخطيط الذاتي المنظم

Claude Code عند العمل يحتاج عادةً خطوات متعددة: grep للبحث → قراءة ملفات → تعديل الكود → تشغيل الاختبارات. إن تركت النموذج «يتقدم بالحدس»، ترى أداءه جيداً في الخطوات الأولى ثم يبدأ بالنسيان وينتهي بنتائج منقوصة.

حل s03 هو أداة قائمة مهام: النموذج نفسه يستدعي أداة todo لإضافة مهام، ويتحقق TodoManager من البنية ويحفظها ويعيد العرض الحالي. لهذا فائدتان:

  • النموذج مُجبر على إظهار «ما يجب فعله» بصراحة — مجرد الكتابة تساعده على ترتيب أفكاره.
  • البشر يرون ما يُفكر فيه. تجربة تصحيح الأخطاء تتحسن عشرة أضعاف.
# TODO 视图,每一项都是结构化的
[ ] #1: grep "TODO" across src/
[>] #2: read src/app.py and list comments     # 正在做
[ ] #3: generate summary markdown
[ ] #4: write to TODO_LIST.md

(0/4 completed)

قاعدة صارمة: مهمة in_progress واحدة فقط في كل لحظة

في TodoManager.update() تحقق واحد:

if in_progress_count > 1:
    raise ValueError("Only one task can be in_progress at a time")

تبدو صارمة، لكنها في الواقع تساعد النموذج. لو سُمح بثلاث مهام «قيد التنفيذ» في آنٍ واحد، سيتشتت ولن يُكمل أياً منها. إجبار التسلسل يجعله ينتهي من كل مهمة قبل بدء التالية.

المكوّن التالي يتيح لك محاكاة دور النموذج وإرسال payloads مختلفة لـ todo، لترى أيها يجتاز التحقق وأيها يُرفض.

Nag reminder: ثلاث جولات بلا تحديث؟ إنذار

حتى مع وجود أداة todo، يميل النموذج أحياناً إلى «نسيان» تحديثها — ينجز أشياء كثيرة، لكن المهمة in_progress لا تزال عند البند الثاني. أسلوب s03 هو عداد بسيط جداً:

rounds_since_todo = 0
while True:
    response = LLM(messages, tools)
    ...
    used_todo = any(b.name == "todo" for b in tool_uses)
    rounds_since_todo = 0 if used_todo else rounds_since_todo + 1
    if rounds_since_todo >= 3:
        results.append({"type":"text", "text":"<reminder>Update your todos.</reminder>"})

حين يصل العداد إلى 3، يُحقن reminder في رسالة المستخدم للجولة التالية. النموذج حين يراه يتحرك تلقائياً ليستدعي todo. هذا تحويل بالهندسة لـقيد ناعم («رجاءً احتفظ بالقائمة محدثة») إلى محفز إلزامي.

ما اسم هذا النمط؟

في أوساط تصميم الـ agent، يُسمى هذا structured self-planning with soft nudges — إعطاء النموذج حالة منظمة يجب أن يكتب فيها، مع تذكيرات مُحدَّدة التوقيت. يستخدم Claude Code الحقيقي نمطاً مشابهاً لكن أكثر تحفظاً (تكرار أقل، صياغة محايدة).

لماذا لا نكتب «حدّث todo في كل خطوة» مباشرة في system prompt؟ يمكن فعل ذلك، لكن امتثال النموذج للتعليمات العامة في system prompt يتراجع كلما طالت المحادثة. تحويل التعليمة إلى «reminders مُحقنة باستمرار» يُعطي نتائج أكثر ثباتاً.
تفاعلي

Widget 1 · Kanban · تطور todo عبر الجولات

اضغط Step وشاهد كيف يُحرك النموذج المهام من pending إلى in_progress ثم إلى completed. لاحظ أن in_progress لا تحوي إلا مهمة واحدة في كل لحظة.

[ ] قيد الانتظار
[>] قيد التنفيذ
[x] مكتمل
جاهز للبدء…
تفاعلي

Widget 2 · Validation · أي 5 payloads تجتاز التحقق؟

حين يستدعي النموذج أداة todo يُمرر مصفوفة items. يُشغّل TodoManager سلسلة تحقق: text غير فارغ، status صالح، in_progress بحد أقصى واحد، الإجمالي ≤ 20. اضغط لتحكم على كل payload.

أصبت في 0 / 5
تفاعلي

Widget 3 · Nag Counter · ماذا يحدث بعد 3 جولات بلا تحديث todo

اضغط Next Turn وشاهد هل يُطلق العداد حقن reminder. كل جولة يُختار عشوائياً «استدعاء todo» أو «عدمه» — النموذج الحقيقي يتصرف بهذا التذبذب أيضاً.

rounds_since_todo: 0