3,583 papers
arXiv:2610.34425 74 25 окт. 2026 г. FREE

CTXAgent: модель сама решает, когда сжимать историю, что оставить и что написать в передаточной записке

КЛЮЧЕВАЯ СУТЬ
Opus и Sol сжимали историю сами, на границах задач, примерно на 50–80k токенов. Это втрое раньше порога Claude Code. Цена сессии упала на 16–58% при том же качестве. Метод CTXAgent позволяет агенту самому решать, когда сжать историю, что выкинуть и что передать себе в записке. Раньше это решал счётчик токенов. Фишка: триггер сжатия — конец задачи, а не число токенов. Модели дают два инструмента. compact_context заменяет всю старую историю запиской-передачей (hand-off). curate_context меняет мусорные результаты инструментов на заметки в одну строку. Всё управление — один абзац в системном промпте.
Адаптировать под запрос
⚡

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
  • Авторы выложили агент, бенчмарк и все строки результатов.

📋 Дайджест исследования

Ключевая суть

Opus и Sol сжимали историю сами, на границах задач, примерно на 50–80k токенов. Это втрое раньше порога Claude Code. Цена сессии упала на 16–58% при том же качестве. Метод CTXAgent позволяет агенту самому решать, когда сжать историю, что выкинуть и что передать себе в записке. Раньше это решал счётчик токенов. Фишка: триггер сжатия — конец задачи, а не число токенов. Модели дают два инструмента. compact_context заменяет всю старую историю запиской-передачей (hand-off). curate_context меняет мусорные результаты инструментов на заметки в одну строку. Всё управление — один абзац в системном промпте.

Принцип работы

Обычный агент режет по счётчику. Набралось N токенов — сжал по готовому рецепту. Здесь наоборот. Задача закончена — модель пишет записку и стирает старый хвост. Мусор внутри задачи — заменяет заметкой в одну строку. Момент и содержание сжатия выбирает тот, кто знает, что уже не нужно. Движок только подсказывает «пора проверить контекст». Он делает это раз в 25 пакетов вызовов инструментов или после 20k новых токенов. Сам он ничего не режет. Если модель не справилась, включается обычное автосжатие. Это страховка. Представь рабочий стол. Счётчик сгребает бумаги в корзину каждый час. Хозяин убирает, когда дело сделано, и оставляет нужное.

Почему работает

Порог в токенах слепой. Он может сработать посреди задачи и выбросить нужное. А может молчать, пока вы тащите 150k мусора. Каждый новый запрос заново отправляет весь этот хвост, и вы платите за него снова и снова. Фиксированная сводка тоже не знает, что важно сейчас. По обзору в статье побочные ограничения переживают такое сжатие лишь примерно в 17% случаев. Только модель знает, что задача закончилась, какие файлы уже прочитаны и почему приняты решения. Сильные модели пишут хорошую записку без дообучения. Подвох первый. Каждая перезапись истории обнуляет кэш промпта с точки разреза. Sol резал 7–8 раз за сессию, и другие расходы выросли. Экономию съело. Подвох второй. Слабые модели не тянут. Haiku и Muse Wonder не вызвали compact_context ни разу. Sonnet вызвал его в одной сессии из трёх. В остальных контекст дорос до 212k и 280k токенов.

Когда применять

Разработка своих агентов → длинные сессии с кодом или анализом, где задачи идут друг за другом, особенно когда хвост из логов и листингов раздувает каждый запрос. Ещё подходит, если есть правила, которые должны жить всю сессию: язык ответа, запретные папки, формат. НЕ подходит, если у вас слабая модель: она просто не вызовет инструмент. Также не подходит, если вы работаете в Claude Code, Codex или Cursor без доступа к инструментам. Там этих функций из коробки нет. Учтите: авторы делали по 3 прогона, а разброс между запусками часто больше разницы между агентами. Бенчмарк синтетический, факты и правила в нём подсажены искусственно. Цифры показывают направление, а не точный выигрыш.

Мини-рецепт

1. Добавь два инструмента: compact_context(summary, keep_from, keep_ids) и curate_context(drop=[{id, note}]). Первый архивирует всё до keep_from и ставит записку. Второй меняет выбранные результаты на заметки.
2. Напиши один абзац в системный промпт: сжимай на границах задач, мелкий мусор чисти через curate_context. Факты пользователя и постоянные правила обязаны пережить сжатие.
3. Запрети суетиться: прямо напиши, что перезапись сбрасывает кэш промпта. Не режь после каждого шага.
4. Задай состав записки: цель, решения и почему, изменённые файлы, результаты, открытые вопросы, id сегментов для возврата. Лишнее убери, своё добавь.
5. Включи напоминалку: подсказка «проверь контекст» раз в 25 пакетов вызовов или после 20k токенов. Подгони под длину своих сессий.
6. Оставь страховку: обычное автосжатие на случай, если модель не справилась.
7. Считай всю цену, не только вход: если режет слишком часто, кэш съест экономию.
8. Нет своего агента: на границе задачи попроси модель написать записку и вставь её в новую сессию. Авторы такой ручной вариант не проверяли.

Примеры

[ПЛОХО] : Контекст уже длинный, просто продолжай и переходи к выгрузке в МойСклад
[ХОРОШО] : Задача по ЮKassa закрыта. Перед выгрузкой заказов в МойСклад напиши записку-передачу для себя в новой сессии. Пункты: 1) цель; 2) решения и почему; 3) изменённые файлы, по строке на каждый; 4) что работает и проверено тестами; 5) открытые вопросы; 6) что стоит перечитать; 7) мои незыблемые правила дословно (папку legacy/ не трогать, отвечать по-русски). Логи, листинги и промежуточные попытки не включай. В плохом случае старый хвост из логов и отладки подписи едет в каждый запрос. Правила тонут среди мусора. В хорошем случае правила вынесены в отдельный пункт, а вся отладка уходит. Записку вставляешь первым сообщением в новую сессию. [ПЛОХО для системного промпта агента]: Сжимай контекст, когда он станет слишком большим [ХОРОШО для системного промпта агента]: Ты сам управляешь своим контекстом. Каждая перезапись истории сбрасывает кэш, поэтому не делай её после каждого шага. compact_context вызывай на границах задач: в записке укажи цель, решения и почему, изменённые файлы, результаты и открытые вопросы. curate_context используй для мелкого мусора внутри задачи. Факты пользователя и постоянные правила должны пережить любое сжатие.
Источник: CTXAgent - Self-Controlled Context Management of LLM Agents
ArXiv ID: 2610.34425 | Сгенерировано: 2026-10-27 23:10

Проблемы LLM

ПроблемаСутьКак обойти
Автосжатие длинной сессии теряет правила пользователя и режет не вовремяСессия растёт. Инструмент сжимает историю по порогу: набралось N токенов. Порог не знает, закончилась ли задача. Он может сработать посреди работы. Сводка шаблонная и не знает, какие решения важны сейчас. Постоянные правила («отвечай по-русски», «не трогай папку X») пропадают чаще, чем хотелось бы. Если не сжимать, старый хвост логов дорожает с каждым запросомСжимай сам, на границе задачи. Попроси модель написать записку-передачу. Правила пользователя вынеси в отдельный блок и сохрани дословно. Начни новую сессию с этой записки. Обычное автосжатие оставь как запасной вариант

Методы

МетодСуть
Записка-передача на границе задачи — дешёвая сессия без потери правилКогда задача закончена, попроси модель написать записку для себя в новой сессии. Структура: 1. Цель. 2. Решения и почему. 3. Изменённые файлы. 4. Результаты. 5. Открытые вопросы. 6. Что стоит перечитать. 7. Незыблемые правила от меня — дословно. Добавь: «Не включай логи, листинги и промежуточные попытки». Вставь записку первым сообщением в чистую сессию. Почему работает: только модель знает, что задача закрыта и какие файлы больше не нужны. Она же знает, какие решения важны для продолжения. Отдельный блок с правилами не даёт им раствориться в пересказе. Чистый контекст делает каждый следующий запрос дешевле. Когда да: долгая работа из нескольких задач (код, аналитика, документы), есть постоянные правила. Когда нет: одна короткая задача. Или задачи тесно связаны и старые детали ещё нужны. Поля записки меняй под свою работу: для аналитики это источники и допущения. Важно: ручной вариант без своего агента авторы не проверяли. Проверь на своей задаче

Тезисы

ТезисКомментарий
Частая перезапись истории съедает экономию из-за кэшаПровайдер запоминает начало запроса и берёт за него малую цену. Кэшированный ввод дешевле обычного в 10–40 раз. Если изменить историю в середине, всё после точки изменения считается заново по полной цене. Сжатие после каждого шага может стоить дороже, чем жизнь с длинным хвостом. Применяй: сжимай редко, на границах задач. Перед сменой схемы сжатия проверь прайс-лист: чем дешевле кэш, тем осторожнее надо менять историю
📖 Простыми словами

CTXAgent - Self-Controlled Context Management of LLM Agents

arXiv: 2610.34425

Все стандартные алгоритмы чистят память LLM по порогу токенов, и это полная лажа. Модель копит гигабайты мусора, а потом автоматический скрипт тупо отрезает половину диалога прямо посреди сложной мысли. Архитектура CTXAgent отдаёт руль управления самой модели: она сама решает, когда и что выкинуть, потому что только она понимает, какой шаг задачи сейчас идёт.

Это как если бы клининг в офисе приходил ровно в три часа дня и сгребал в шредер каждую вторую бумагу с твоего стола, невзирая на незаконченные чертежи и открытые договоры. Гораздо логичнее дать сотруднику нормальную корзину и блокнот, чтобы он сам выбросил пустые стаканчики и составил короткую записку сменщику. Обычный лимит токенов — это как раз та самая уборщица-вредитель.

Под капотом всё гениально просто: один абзац системного промпта и два инструмента. Первый — compactcontext — начисто сносит старую историю и вставляет вместо неё авторскую *записку-передачу*. Второй — curatecontext — точечно превращает простыни логов от вызова функций в однострочные выжимки. При тупом машинном сжатии важные ограничения задачи выживают всего в 17% случаев, а когда модель упаковывает смыслы сама — критические детали не теряются.

Авторы гоняли метод на автономных агентах, но принцип универсален вообще для любой длинной работы с нейросетями. Незачем тащить за собой 150k токенов мусора в надежде, что ассистент не захлебнётся. Точно так же работает и ручной аналог: на границе этапов просишь модель сделать структурированный хэнд-офф и смело переносишь его в абсолютно чистый чат.

Короче: хватит молиться на встроенную память чатов и надеяться на тупые костыли контекстного окна. Дай модели инструменты самоконтроля или хотя бы заставляй её подводить итоги вручную перед новым шагом. Кто приучит свои системы вовремя чистить рабочий стол — спасёт кучу денег и навсегда забудет про галлюцинации от перегруза.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с