TL;DR
CTXAgent — это агент, где сжатием контекста управляет сама модель, а не порог в токенах. Ей дают два инструмента и один абзац системного промпта. Первый инструмент, compact_context, заменяет всю старую историю запиской-передачей (hand-off), которую модель пишет сама. Второй, curate_context, заменяет отдельные ненужные результаты инструментов на однострочные заметки. Абзац говорит, когда что использовать.
Обычные агенты (Claude Code, Codex, OpenCode) режут историю, когда набралось N токенов, и по фиксированному рецепту. Ни момент, ни содержание модель не выбирает. Хотя только она знает, что задача закончилась и прочитанные файлы больше не нужны. Платишь ты за это дважды. Каждый запрос заново отправляет весь накопленный хвост, и он дорожает. А важное (факт от пользователя, правило «заканчивай каждый ответ строкой REF») тонет среди мусора или вылетает при сжатии.
Что показали эксперименты: сильные модели справляются сами, слабые нет. Opus и Sol сжимали историю на границах задач, примерно на 50–80k токенов, то есть втрое раньше порога Claude Code. Цена сессии падала на 16–58% при том же качестве. Haiku и Muse Wonder не вызывали compact_context ни разу. Sonnet вызвал в одной сессии из трёх. Отдельно: слишком частое сжатие может съесть всю экономию, потому что каждая перезапись ломает кэш промпта.
Схема метода
НАСТРОЙКА (один раз, в своём агенте):
Инструмент 1: compact_context(summary, keep_from, keep_ids)
→ архив всего до keep_from + записка-передача от модели
Инструмент 2: curate_context(drop=[{id, note}])
→ результаты инструментов заменяются на однострочные заметки
Абзац в системном промпте (одинаковый для всех моделей)
Страховка: обычное автосжатие, если модель не справилась
В РАБОТЕ:
Модель работает → задача закончена → compact_context с запиской
Внутри задачи накопился мусор → curate_context
Движок раз в 25 пакетов вызовов инструментов или после 20k новых токенов
дописывает подсказку «пора проверить контекст», но сам ничего не режет
Пример применения
В статье инструменты вызывает сама модель в своём агенте. Читателю без собственного агента доступен ручной аналог: он сам просит модель написать записку на границе задач и переносит её в новую сессию. Структура записки взята из статьи. Сам ручной запуск авторы не тестировали.
Задача: Вы с Claude Code три часа делали интеграцию интернет-магазина с ЮKassa. Платёж проходит, вебхуки приходят, задача закрыта. Теперь надо перейти к выгрузке заказов в «МойСклад». Контекст забит логами тестов, длинными листингами файлов и отладкой подписи вебхука. Всё это больше не нужно, но каждый новый запрос тащит за собой этот хвост. Ещё вы в начале сказали: «никогда не трогай папку legacy/ и всегда отвечай на русском». Правила должны пережить сжатие.
Промпт:
Задача по ЮKassa закрыта. Перед переходом к выгрузке заказов в «МойСклад»
напиши записку-передачу (hand-off) для себя в новой сессии. Структура:
1. Цель: что делали и зачем
2. Решения и почему: ключевые решения с обоснованием
3. Изменённые файлы: список с одной строкой о том, что изменено
4. Результаты: что работает, что проверено тестами
5. Открытые вопросы: что не доделано
6. Что стоит перечитать: файлы и места, к которым понадобится вернуться
7. Незыблемые правила от меня: дословно, всё, что я просил соблюдать всегда
(папку legacy/ не трогать, отвечать по-русски)
Не включай логи, листинги и промежуточные попытки. Только то, что нужно для продолжения.
Результат: Модель выдаст компактную записку по семи пунктам. Правила пользователя будут вынесены в отдельный блок и сохранены дословно. Эту записку вы вставляете первым сообщением в новую сессию или передаёте в /compact. Дальнейшая работа идёт без хвоста из логов, и каждый запрос дешевле.
Почему это работает
Слабость: порог в токенах ничего не знает о работе. Он может сработать посреди задачи и выбросить нужное, а может не сработать, пока вы тащите 150k токенов мусора. Рецепт сжатия тоже общий. Фиксированная сводка не знает, какие решения важны именно сейчас. Исследования из обзора показывают, что побочные ограничения переживают такое сжатие лишь примерно в 17% случаев.
Сильная сторона: модель отлично понимает, что задача закончилась, какие файлы уже прочитаны и какие решения принимались и почему. Сильные модели умеют это сформулировать в записке и без дополнительного обучения.
Как метод обходит слабость: момент и содержание сжатия отдаются тому, кто знает контекст. Абзац в промпте задаёт рамки: сжимать на границах задач, не после каждого шага, правила пользователя держать живыми. Страховочное автосжатие закрывает случаи, когда модель не справилась.
Рычаги управления: - Граница задачи как триггер → вместо порога в токенах. Это главный рычаг метода. - Запрет частой перезаписи → каждая перезапись обнуляет кэш промпта с точки разреза. Если модель режет слишком часто (как Sol, около 7–8 раз за сессию), другие расходы растут и экономия съедается. - Состав записки → цель, решения и почему, изменённые файлы, результаты, открытые вопросы, id сегментов для возврата. Убери то, что не нужно в твоей работе, добавь своё. - Подсказка о проверке → в статье срабатывает каждые 25 пакетов вызовов или после 20k новых токенов. Меняй под длину своих сессий. - Страховка → оставь обычное автосжатие как запасной вариант.
Шаблон промпта
Это реконструкция по описанию в разделе 3.1 статьи. Дословный текст абзаца находится в Приложении A, во фрагменте, который мне доступен, его нет.
Ты сам управляешь своим контекстом и сам решаешь, что в нём ещё актуально.
Правила:
- Каждая перезапись истории сбрасывает кэш промпта с точки разреза.
Не перезаписывай контекст после каждого шага.
- compact_context используй на границах задач, когда завершён существенный
объём работы. Он заменяет старую историю запиской-передачей.
В записку включи: {цель}, {принятые решения и почему}, {изменённые файлы},
{результаты}, {открытые вопросы}, {id сегментов, к которым стоит вернуться}.
- curate_context используй для мелкого мусора внутри текущей задачи:
заменяй результаты инструментов, на которые ты уже отреагировал,
своей однострочной заметкой. Всё, что не названо, остаётся без изменений.
- Факты, которые назвал пользователь, и постоянные инструкции
({постоянные_правила}) обязаны пережить любое сжатие.
Что подставлять:
- {цель}, {решения} и остальные поля — что именно должна содержать записка в твоей работе. Для кода это файлы и тесты, для аналитики — источники и допущения.
- {постоянные_правила} — то, что должно жить всю сессию: язык, запретные папки, формат ответа.
🚀 Быстрый старт — вставь в чат:
Вот шаблон абзаца системного промпта для агента, который сам управляет контекстом.
Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит, какие пункты нужны в записке-передаче и какие правила пользователя должны пережить сжатие. Именно от этих полей зависит, что агент не потеряет при смене задачи.
Ограничения
⚠️ Нужен свой агент: обе функции (
compact_context,curate_context) надо добавить как инструменты. В Claude Code, Codex и Cursor из коробки их нет. Читателю без кода доступен только ручной аналог через записку-передачу, и его авторы не проверяли.
⚠️ Слабые модели не справляются: Haiku и Muse Wonder ни разу не вызвали полное сжатие. Sonnet вызвал его в одной сессии из трёх, в остальных довёл контекст до 212k и 280k токенов. Метод работает только на сильных моделях. Авторы использовали один и тот же абзац для всех.
⚠️ Слишком частое сжатие может подорвать экономию: у некоторых моделей другие расходы выросли, потому что кэш сбрасывался слишком часто. Экономия сильно зависит от прайс-листа провайдера: у Astra кэш в десять раз дешевле обычного входа, у Fable в сорок, у остальных в двадцать.
⚠️ Результаты шумные: по три прогона на конфигурацию, а разброс между запусками одного и того же агента нередко больше разницы между агентами. Сравнение с Claude Code показывает направление, но не точную цифру.
⚠️ Синтетический бенчмарк: задачи собраны из готовых наборов, а факты и правила подсажены искусственно. Реальная работа с агентом устроена менее аккуратно.
⚠️ Фрагмент статьи обрезан: во входных данных нет раздела про потери от сжатия и Приложения A. Выводы о том, что именно теряется, здесь не приведены.
Как исследовали
Исследователи собрали бенчмарк из готовых задач. Это упражнения Aider-polyglot, многошаговые научные задачи SciCode и тяжёлые задачи SWE-bench Pro и Terminal-Bench 4.0. Между задачами они подсадили три вида зависимостей. Первый вид — факты, о которых позже спрашивают. Второй — разовые наблюдения: файл со случайным id создаётся, агент его печатает, файл удаляется, значение теперь есть только в разговоре. Третий — постоянные правила вроде «заканчивай каждый ответ строкой REF». Всё проверялось автоматически.
Сессии длились от 35 до 212 ходов. Самая длинная, «марафон», — около 1,5 млн токенов сырой истории. Семь сильных моделей прогнали в двух вариантах: с инструментами контекста и без, на идентичном промпте. Так можно честно сравнить стоимость и баллы.
Второй эксперимент: те же сессии через Claude Code, Codex, OpenCode и CTXAgent за одним учётным прокси, который считал токены по классам, включая попадания в кэш, и обнаруживал сжатие по падению размера запроса.
Что узнали. Opus и Sol резали историю при 50–80k токенов, вдвое–втрое раньше порога Claude Code, а цена сессии падала на 16–58% при почти том же качестве. Модели разделились на три группы. Сильные действуют сами, средние дают смешанный результат из-за прайс-листа, слабые не используют инструменты вовсе. С Opus 5.5 CTXAgent сохранил успешность Claude Code при стоимости на 34% ниже конфигурации с окном 200k и на 49% ниже конфигурации по умолчанию.
Что удивило. Гипотеза предыдущей работы (SelfCompact) была такой: открытые модели без каркаса не справляются, а сильные могут. Она подтвердилась. Но «могут» не означает «всегда выгодно»: цена зависит от прайс-листа и от частоты сжатий.
Оригинал из исследования
compact_context(summary, keep_from, keep_ids)
— archives everything between the system prompt and keep_from and replaces it
by one summary segment whose text the model wrote, without a summariser call
or additional cost; an index of the archived tool results is appended so that
a later recall knows its handle.
curate_context(drop=[{id, note}])
— lists the unreviewed tool results and lets the model replace the ones it has
acted on by its own one-line note; everything not named is kept verbatim.
Контекст: это описание двух инструментов из раздела 3.1. Подсказку о проверке движок дописывает к последнему результату инструмента, а сам ничего не режет.
Адаптации и экстраполяции
💡 Адаптация для обычного чата (ручная версия, не из статьи): в длинном диалоге в ChatGPT или Claude в конце каждого крупного блока работы просите модель написать записку-передачу и переходите в новый чат. Структура: цель, решения и почему, результаты, открытые вопросы, правила, которые нельзя терять.
Блок закончен. Напиши записку для нового чата: цель, принятые решения с обоснованием, что получилось, что осталось открытым, и дословно все мои постоянные правила. Без лишних деталей.
🔧 Техника: правила в отдельном блоке записки → правила не теряются при сжатии. В статье инструкция требует, чтобы факты пользователя и постоянные правила выжили при любом сжатии. Для ручной версии вынесите их отдельным пунктом и просите переносить дословно. Это моя адаптация, у авторов отдельного блока в записке нет.
Ресурсы
- Работа: CTXAgent — Self-Controlled Context Management of LLM Agents
- Авторы: Matthias Busch, Marius Tacke, Roland C. Aydin, Christian Feiler, Christian J. Cyron
- Организации: Hamburg University of Technology, Helmholtz-Zentrum Hereon, DFKI, Saarland University
- Связанные работы из обзора: SelfCompact (Li et al.), Context Language Models, VISTA, Context-Folding, AgentFold, CliffCompaction, TokenPilot
- Бенчмарки-основы: Aider-polyglot, SciCode, SWE-bench Pro, Terminal-Bench 4.0
- Авторы выложили агент, бенчмарк и все строки результатов.
