Узнайте, почему AI-агент тупеет к 80-му шагу и как компактирование контекста решает проблему. Освойте технику сохранения важного без потери смысла.
Вы запускаете AI-агента — на 10-м шаге он блестящ: быстр, точен, помнит каждую деталь. Но к 80-му шагу он предлагает уже отвергнутое решение, «забывает» файлы, редактированные 20 шагов назад, и противоречит собственным прежним решениям. Знакомо? Это не баг модели, а естественное следствие переполнения контекстного окна. В этой статье мы разберём, как компактирование (compaction) — умное сжатие истории — возвращает агенту ясность мышления.
Компактирование — это сжатие с потерями смысла. Вы берёте длинную, разросшуюся историю и заменяете её кратким представлением, сохраняющим важное для следующего шага и отбрасывающим лишнее. «С потерями» — ключевой момент: если бы сжатие было без потерь, вы бы просто получили те же токены в другом шрифте. Компактирование работает именно потому, что выбрасывает информацию. Всё мастерство — в том, что именно выбрасывать.
Это не очистка (/clear), которая вызывает полную амнезию, и не обрезка (trimming) — механическое удаление старейших сообщений по жёсткому правилу. Очистка хороша при смене задачи, но катастрофична в середине. Обрезка дешева, но тупа: она не знает, что самое старое сообщение — это ключевое решение, от которого зависит вся задача. Компактирование — золотая середина: умнее обрезки, менее разрушительно, чем очистка.
Попытка «просто подвести итог» разговора ведёт к нескольким типичным провалам:
Особенно опасна кумулятивная эрозия при повторном компактировании. Каждый проход теряет часть информации. Сжав сжатое пять раз, вы получаете испорченный телефон: конкретное указание «не трогать модуль auth» превращается в общую фразу. Это и есть реальная причина, по которой агенты «сходят с рельсов» после автоматического компактирования.
Правило, которое работает во всех серьёзных реализациях: сохраняйте решения и состояние, отбрасывайте процесс, который к ним привёл.
Пример из первой части: агент искал в базе данных и выяснил, что таблица пользователя называется documents_v2. Хорошее компактирование сохранит: «Таблица пользователя — documents_v2». Хорошее компактирование отбросит: 400 строк JSON, которые модель просмотрела, чтобы это выяснить. Факт долговечен и компактен; свидетельства факта огромны и теперь бесполезны — вы уже извлекли из них ценность. Хранить JSON — значит вечно платить аренду за информацию, которую вы уже обналичили.
Обобщая, вот чеклист для хорошей передачи контекста:
Особое внимание — ограничениям пользователя. «Решили использовать PostgreSQL» выглядит как факт, который стоит сохранить. «Пользователь сказал никогда не трогать модуль auth» выглядит как старый шум разговора. Но именно второе, будучи потерянным, заставит агента уверенно сделать то, что ему запретили. Фиксируйте ограничения: они должны пережить каждое компактирование без изменений, никогда не перефразируйтесь.
Два известных инструмента — Claude Code и Codex CLI — иллюстрируют разные подходы.
Делает ставку на автоматизацию. Есть ручная команда /compact, но основное поведение — авто-компактирование при заполнении примерно 95% контекстного окна. Оно суммирует всю траекторию и начинает с этого итога как с семени. Можно управлять (/compact "сфокусируйся на открытых TODO"). Сообщество отмечает, что 95% — слишком поздно: к этому моменту качество уже падает, и люди компактируют вручную задолго до срабатывания триггера.
Подход ближе к «передаче»: компактирование оформляется как контрольная точка, создающая итог для «другой LLM, которая продолжит задачу». Следующая модель должна развивать работу, а не переделывать. Триггер — порог токенов; последние сообщения пользователя сохраняются дословно вместе с итогом. Есть повторные попытки с экспоненциальной задержкой на случай сбоя вызова компактирования (а это LLM-вызов, и он может упасть).
Создай итог передачи, чтобы сессия кодирования могла продолжиться в новом контексте.
Итог будет ЕДИНСТВЕННОЙ доступной историей, поэтому сохрани:
1. Завершённая работа — что сделано и проверено (одна строка на пункт)
2. Текущее состояние — изменённые файлы и их статус
3. В работе — что делается прямо сейчас
4. Следующие шаги — конкретные действия
5. Ограничения — предпочтения и требования пользователя, процитированные дословно
6. Критические ссылки — имена таблиц, ID, пути к файлам, ключевые решения и почему
Будь плотным. Отбрось рассуждения, сырой вывод инструментов и всё, что уже устарело.
Не выдумывай и не предполагай ничего, чего нет в разговоре.
Последняя строка — «не выдумывай» — ваша дешёвая защита от отравления. Работа суммаризатора — сжатие, а не творчество. Как только он начинает заполнять пробелы, он фабрикует галлюцинацию, которую следующий шаг примет за истину.
Компактирование заставляет признать то, что остальной стек позволяет избегать: вы не можете сохранить всё, поэтому должны решить, что вашему агенту позволено забыть. Внешняя память и поиск позволяют уклониться — спрятать, потом достать. Но внутри одной длительной задачи, на конечном столе, уклоняться некуда. Что-то должно уйти — и компактирование выбирает, что выживет осознанно, вместо того чтобы позволить контекстному окну выбрать за вас, молча вытолкнув самое важное ограничение за край внимания.
Лучшее компактирование, как и лучшая инженерия, — это в основном вычитание. Сохранить documents_v2 и сжечь JSON; одна строка ограничения переживёт тысячу строк болтовни. Мантра из первой части становится острее: лучший токен — тот, который вам не пришлось отправлять. Компактирование — это способ узнать, какие это были токены, и решиться их удалить.
Прямо сейчас откройте своего агента и проверьте, как он управляет контекстом. Если он использует авто-компактирование при 95% — настройте триггер раньше. Если он вообще не компактирует — добавьте хотя бы ручную команду с промптом выше. И главное: фиксируйте ограничения пользователя дословно — это единственное, что нельзя потерять.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →