الدرس 06 · ذاكرة

حين يمتلئ السياق، تعلّم كيف تُقلّصه

«يستطيع الوكيل النسيان استراتيجياً والعمل للأبد.» النسيان الاستراتيجي = قدرة هندسية.

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

لماذا نحتاج compact؟

بعد تشغيل الوكيل لفترة طويلة، تنتفخ messages[]: كل read_file يُعيد آلاف الـ token، كل bash يُعيد مئات، ولكل جولة نص تفكير النموذج. بعد 50 جولة يمكن للسياق بلوغ 100,000+ token. نتيجتان:

  • بلوغ حد النموذج: ينهار عند حجم النافذة، أو ترتفع تكلفة كل استدعاء API خطياً.
  • تشتت الانتباه: المهمة الحالية تغرق في tool_results لا علاقة لها بالموضوع من 30 جولة مضت.

فكرة s06: جعل الوكيل ينسى ما ليس مهماً بنشاط، مع الاحتفاظ بالحالة الجوهرية. ثلاث طبقات من الأخف إلى الأثقل.

الطبقة الأولى · micro_compact (تعمل صامتة كل جولة)

أرخص الطبقات. تعمل قبل كل استدعاء LLM وتستبدل نتائج الأدوات القديمة التي تتجاوز الثلاث بعنصر نائب:

# 第 10 轮往前,大部分 tool_result 变成:
{
  "type": "tool_result",
  "tool_use_id": "toolu_01A",
  "content": "[Previous: used bash]"   # 从几千字符缩到几十
}

استثناء: نتائج read_file لا تُضغط. لماذا؟ لأن ما يُقرأ هو مرجع، وضغطه يُجبر النموذج على إعادة القراءة وهو أغلى.

PRESERVE_RESULT_TOOLS = {"read_file"}  # 永不压缩

شاهد micro_compact يأكل النتائج القديمة جولة بجولة

المحاكاة أدناه تُشغّل 10 جولات تفاعل، مع تشغيل micro_compact قبل كل جولة. شاهد tool_results القديمة تتحول إلى [Previous: ...]، بينما تحتفظ آخر 3 نتائج بشكلها الكامل.

الطبقة الثانية · auto_compact (تُطلق عند بلوغ العتبة)

حتى مع تشغيل micro المستمر، ستنتفخ البيانات حتماً مع الوقت. s06 يضع عتبة (افتراضياً 50,000 token):

  1. تقدير عدد الـ token: len(str(messages)) // 4 (تقريبي لكنٍّ كافٍ).
  2. تجاوز العتبة → حفظ النص الكامل في .transcripts/transcript_TIMESTAMP.jsonl احتياطياً.
  3. جعل LLM يكتب ملخصاً للمحادثة بأكملها.
  4. استبدال messages بأكملها بسطر واحد "[compressed] SUMMARY...".

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

الطبقة الثالثة · النموذج يستدعي أداة compact بنفسه

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

النموذج يستدعي:

tool_use("compact", focus="keep the API design decisions")

يُطلق آلية مشابهة لـ auto، لكن مع معامل focus يُخبر بما يجب الاحتفاظ به عند التلخيص. في العمل الفعلي هذا مفيد جداً — النموذج يعلم أي أجزاء «مهام صغيرة انتهت»، وهو أدق من الإطلاق الآلي الاستدلالي لـ harness.

أي طبقة مناسبة؟ أسئلة تحديد

للسيناريوهات التالية، قرّر أي طبقة أنسب للإطلاق: micro / auto / manual.

تفاعلي

Widget 1 · Micro Compact · شاهد tool_result يتقادم جولة بجولة

اضغط Step للتقدم، وراقب كيف تُستبدل tool_results القديمة بـ [Previous: used X]، بينما تحتفظ آخر 3 بشكلها الكامل. read_file لا يُضغط أبداً (مُظلل بالأخضر).

الجولة: 0 · الـ Token: ~0
تفاعلي

Widget 2 · Threshold Simulator · أي الطبقات تُفعَّل عند ارتفاع الـ token

حرّك المنزلق لتغيير عدد الـ token وشاهد أي الطبقات الثلاث تصبح نشطة.

3000
تفاعلي

Widget 3 · أي طبقة مناسبة · 6 سيناريوهات

لكل سيناريو اختر micro / auto / manual، مع شرح متى يُفعَّل كل منها.

أصبت في 0 / 6