حين يمتلئ السياق، تعلّم كيف تُقلّصه
«يستطيع الوكيل النسيان استراتيجياً والعمل للأبد.» النسيان الاستراتيجي = قدرة هندسية.
لماذا نحتاج 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):
- تقدير عدد الـ token:
len(str(messages)) // 4(تقريبي لكنٍّ كافٍ). - تجاوز العتبة → حفظ النص الكامل في
.transcripts/transcript_TIMESTAMP.jsonlاحتياطياً. - جعل LLM يكتب ملخصاً للمحادثة بأكملها.
- استبدال
messagesبأكملها بسطر واحد"[compressed] SUMMARY...".
الثمن واضح — ضياع التفاصيل ونبرة الحوار، وتبقى الخطوط الرئيسية فحسب. لكن الوكيل يستطيع الاستمرار في العمل، وهذه الفائدة الجوهرية.
الطبقة الثالثة · النموذج يستدعي أداة compact بنفسه
auto_compact تُطلق تلقائياً من harness دون علم النموذج. الطبقة الثالثة تعكس ذلك: تمنح النموذج أداة compact ليطلب الضغط بنفسه بمبادرته — مثلاً حين يشعر أن الاستكشاف السابق لم يعد ذا صلة ويريد بدء مرحلة جديدة.
النموذج يستدعي:
tool_use("compact", focus="keep the API design decisions")
يُطلق آلية مشابهة لـ auto، لكن مع معامل focus يُخبر بما يجب الاحتفاظ به عند التلخيص. في العمل الفعلي هذا مفيد جداً — النموذج يعلم أي أجزاء «مهام صغيرة انتهت»، وهو أدق من الإطلاق الآلي الاستدلالي لـ harness.
أي طبقة مناسبة؟ أسئلة تحديد
للسيناريوهات التالية، قرّر أي طبقة أنسب للإطلاق: micro / auto / manual.