Урок 06 · Память

Контекст переполняется — нужно уметь сжимать

«The agent can forget strategically and keep working forever.» Стратегическое забвение — это инженерная возможность.

⏱ ~12 мин · 📝 3 интерактивных компонента · 🧑‍💻 На основе shareAI-lab · s06_context_compact.py

Зачем нужен compact?

После долгой работы агента messages[] раздувается: каждый read_file возвращает несколько тысяч токенов, каждый bash — сотни, плюс текст рассуждений модели каждый раунд. За 50 итераций контекст легко достигает 100K+. Два последствия:

  • Достижение лимита модели: при превышении размера окна агент падает, или каждый API-вызов становится дороже линейно.
  • Размывание внимания: текущая задача тонет в tool_result из 30 раундов назад, модель начинает «уходить в сторону».

Подход s06: агент активно забывает неважное, сохраняя ключевое состояние. Три уровня — от лёгкого к тяжёлому.

Уровень 1 · micro_compact (работает тихо каждый раунд)

Самый дешёвый уровень. Перед каждым LLM-вызовом заменяет tool_result старше трёх последних на заполнитель:

# Начиная с 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_result превращаются в [Previous: ...], а последние три остаются нетронутыми.

Уровень 2 · auto_compact (срабатывает по порогу)

Даже при постоянно работающем micro накопленный объём в итоге превысит предел. В s06 задан порог (по умолчанию 50000 токенов):

  1. Оценить количество токенов через len(str(messages)) // 4 (грубо, но достаточно).
  2. При превышении порога — записать transcript на диск в .transcripts/transcript_TIMESTAMP.jsonl (для архива).
  3. Попросить LLM написать summary всего диалога.
  4. Полностью заменить messages одной строкой "[compressed] SUMMARY...".

Цена очевидна: теряются конкретные вывод инструментов и тон диалога, остаётся лишь выжимка. Но агент может продолжать работу — это главный выигрыш.

Уровень 3 · модель сама вызывает инструмент compact

auto_compact срабатывает автоматически — модель об этом не знает. Уровень 3 наоборот: дать модели инструмент compact, чтобы она сама запрашивала сжатие — например, когда чувствует, что предыдущее исследование уже не нужно и начинается новый этап.

Вызов модели:

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

Срабатывает так же, как auto, но принимает параметр focus — подсказывает, что важно сохранить при суммаризации. На практике очень полезно: модель лучше знает, какие задачи «уже завершены», и точнее, чем эвристика harness.

Какой уровень подходит? Тест-вопросы

Несколько сценариев — определите, какой уровень срабатывает логичнее: micro / auto / manual.

Интерактив

Виджет 1 · Micro Compact · наблюдайте, как tool_result стареют

Продвигайтесь по шагам и наблюдайте, как старые tool_result заменяются на [Previous: used X], а последние три остаются нетронутыми. read_file никогда не сжимается (зелёная подсветка).

Turn: 0 · Токены: ~0
Интерактив

Виджет 2 · Threshold Simulator · какой уровень активируется при разных объёмах

Перетащите ползунок, чтобы изменить количество токенов, и смотрите, какой из трёх уровней включается.

3000
Интерактив

Виджет 3 · Какой уровень подходит · 6 сценариев

Для каждого сценария выберите micro / auto / manual и объясните, когда каждый уровень уместен.

Правильно: 0 / 6