Skip to main content

Сжатие контекста

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

Когда срабатывает

Перед каждым ответом Велес оценивает размер промпта. Как только оценка превышает долю окна, заданную полем threshold (по умолчанию 50 %), запускается сжатие. Порог считается от контекстного окна модели, а не от окна модели, которая пишет резюме. Сжатие срабатывает заранее, до переполнения окна, поэтому у модели всегда остаётся запас на ответ.

Что происходит при сжатии

  1. Выбор границы. Велес выбирает точку разреза так, чтобы:
    • защитить «хвост» из свежих сообщений по бюджету токенов (targetRatio) и не меньше, чем protectLastN последних сообщений;
    • разрез всегда попадал на сообщение пользователя и никогда не разрывал пару «вызов инструмента / результат инструмента».
  2. Генерация резюме. Ходы до границы отправляются вспомогательной модели, которая заполняет структурированный шаблон: активная задача, цель, ограничения, выполненные действия, текущее состояние, решения, отвеченные и открытые вопросы, затронутые файлы, оставшаяся работа, критический контекст. Резюме пишется на языке беседы, а секреты заменяются на [REDACTED].
  3. Накопительное обновление. Если резюме уже существует, модель обновляет его, а не пишет заново: выполненные пункты переносятся в «сделано», отвеченные вопросы — в «решённые». Так преемственность сохраняется через множество циклов сжатия.
  4. Сохранение. Резюме кладётся в метаданные сессии и при следующих запросах подставляется в системный промпт с пометкой «только для справки». Сжатый участок дополнительно выгружается в долговременную память (файлы memory/), поэтому его можно найти инструментом memory_search.
Свёрнутая история подаётся модели как справочный материал, а не как активные инструкции. Благодаря этому модель отвечает на последнее сообщение пользователя и не пытается «доделать» уже завершённую или отменённую работу.

Защита от сбоев

  • Запасное резюме. Если вспомогательная модель недоступна или вернула пустой ответ, Велес формирует детерминированное запасное резюме (последние сообщения пользователя и упомянутые файлы) и дописывает его к прежнему резюме, не теряя ранее накопленную преемственность.
  • Пауза после ошибки. После сбоя генерации резюме включается пауза, чтобы Велес не тратил вызовы модели на повторные неудачные попытки каждый ход.
  • Защита от «пробуксовки». Если очередной цикл почти не уменьшил размер промпта, сжатие останавливается и предлагает начать новую беседу командой /new.

Настройка

Все параметры находятся в блоке agents.defaults.compression — см. Конфигурация.
ПолеПо умолчаниюНазначение
enabledtrueВключает сжатие. При false действует прежняя посегментная выгрузка в память
threshold0.5Доля окна, при превышении которой запускается сжатие (0.2–0.95)
targetRatio0.2Бюджет защищённого хвоста как доля порога (0.05–0.8)
protectLastN20Минимум последних сообщений, сохраняемых дословно
maxSummaryTokens3000Верхний предел размера резюме
summaryModel""Модель для резюме; пусто — модель сессии

Связь с памятью

Сжатие контекста и долговременная память дополняют друг друга. Сжатие управляет активным окном беседы, а память хранит устойчивые факты и полные стенограммы. При каждом сжатии свёрнутый участок выгружается в память, поэтому детали не пропадают: резюме удерживает связность прямо в промпте, а память позволяет поднять точные записи по запросу. Команда /new завершает беседу и очищает накопленное резюме вместе с рабочим окном.