chimera-budget-the-context
Расходуйте по бюджету, который ниже реального окна, и учитывайте схемы инструментов, пересылаемые заново на каждом шаге, — это пол, до которого сжатие не достаёт.
Присвоено человеком, который прочитал карточку, а не заявлено файлом о самом себе. Карточка, которую агент выводит во время запуска, поглотившего недоверенное содержимое, рождается заражённой и удерживается на разбор, прежде чем её вообще извлекут.
Когда это вспоминается
- прогон упал от переполнения контекста
- поднимаю max-steps
- агент забыл, что делал
- добавляю ещё один MCP-сервер
- решаю, что выкинуть из промпта
Ценность обычно лежит в разделах «Избегать» и «Проверить». «Делать» — это раздел, который пишут все.
Текст карточки выше — перевод. Английский оригинал — это то, что импортирует командная строка, что читает агент во время работы и что подтверждает хеш ниже.
Повод
У вас крутится цикл, который на каждом шаге дописывает в список сообщений — агент ReAct, ход кодинга, ассистент с вызовом инструментов, — и список только растёт. Симптомы: провайдер выбрасывает ошибку по длине контекста, либо прогон выживает, но после долгого отрезка начинает работать не с тем файлом.
Это не относится к одиночному вызову, промпт которого вы собрали сами и можете измерить один раз. Когда ничего не накапливается, политику вытеснения проектировать не из чего.
Делать
- Прежде чем трогать цикл, запишите два числа: заявленное окно модели и ту его долю, которую
вы потратите на промпт. Chimera тратит 0.6 (
DEFAULT_BUDGET_FRACTIONвchimera/core/context_budget.py). Остальное оплачивает completion и расхождение между вашей оценкой токенов и реальным счётом провайдера. - Запускайте сжатие по доле бюджета, а не окна — Chimera срабатывает на 0.8 бюджета. Сжатию нужно место, куда сжимать; триггер, выставленный по окну, срабатывает, когда места уже не осталось.
- Измеряйте фиксированный пол отдельно от растущей части. Системное сообщение плюс полезная
нагрузка
tools=пересылаются заново на каждом шаге, и никакое сжатие сообщений их не касается. Запуститеchimera schema-bench(или посчитайте JSON сами), прежде чем решать, что дорого обходится именно история. Многословный импорт MCP или OpenAPI способен подложить десятки тысяч токенов под каждый отдельный шаг прогона. - Если проблема в поле, уменьшайте пол: выбросьте чисто аннотационные ключи схемы (
examples,title,default,$comment) и обрежьте прозу в описаниях параметров до первого предложения, оставивtype,properties,requiredиenumнетронутыми, чтобы выбор инструмента и валидность аргументов не изменились. Именно это делаетchimera/tools/schema_compact.py. Если всё равно велико — объявляйте меньше инструментов. - Задайте порядок вытеснения явно: системное сообщение — никогда, недавние ходы — дословно (Chimera держит 6), более старый отрезок — заменить сводкой или фактической заметкой. Никогда не переписывайте системное сообщение: это стабильный префикс, по которому ключуется кэш промптов, и его правка обесценивает весь кэш за ним.
- После сжатия заново подставьте то, без чего прогон перестаёт быть собой: задачу дословно, план, список задач со статусами и файл, который сейчас редактируется. Файл перечитывайте с диска, а не восстанавливайте по запомненной копии.
- Когда оцениваете размер в токенах сами, считайте нагрузку
tool_callsнаравне сcontent. Аргументы инструментов едут в сообщении ассистента и вcontentне входят; оценка размера, читающая толькоcontent, занижает ровно те сообщения, которые выросли.
Избегать
Поднимать --max-steps, потому что задача не завершилась. Это очевидный ход, и это тот самый
ход, который убивает прогон: больше шагов — длиннее список сообщений при том же окне.
Выбрасывать формулировку задачи. Она приходит пользовательским сообщением в самом начале, поэтому наивный компактор вытесняет её первой, а работать без неё агент не может вовсе. В итоге агент исполняет план, у которого удалили цель, — по-прежнему уверенно, по-прежнему выдавая правки, и нигде никакой ошибки. Файл он может перечитать; инструкцию — нет.
Оставлять сообщение tool в голове сохранённого хвоста:
older, recent = body[:-keep_recent], body[-keep_recent:] # can orphan a tool result
против
older, recent = body[:-keep_recent], body[-keep_recent:]
while recent and recent[0].get("role") == "tool":
older.append(recent.pop(0)) # tail starts on a legal turn
Большинство провайдеров отвергает сообщение tool, у которого пропал парный tool_call
ассистента, и тогда сжатие, которое должно было спасти прогон, его и заканчивает.
Также не настраивайте сначала на максимальное сжатие. Калибруйте от полноты: сохранить лишнее стоит токенов, то есть денег; удалить лишнее — потерять контекст, который понадобится позже, и этих сообщений больше нет. Одно — расход, другое — невосполнимо.
Проверить
Занизьте окно намеренно — направьте бюджет на фиктивное окно в 4K или запустите заведомо длинную задачу — и убедитесь в трёх вещах: сжатие сработало, прогон продолжился после него, и следующее сообщение содержало исходную строку задачи. Прогрепайте собранный промпт после сжатия на характерную фразу из задачи. Если её там нет, восстановление не работает, что бы ни говорили логи.
Затем проверьте пол двоичным вопросом: промпт одного шага с пустой историей уже выше вашего
порога? Если да, сжатие не поможет никогда — compact() возвращает changed=False на списке,
который не может уменьшить, и честное прочтение такого no-op — «это не помогло», а не «повторить в
ту же стену».
Риск
Слишком низкий бюджет сжимает прогоны, которым это не требовалось, а каждое сжатие переписывает суффикс промпта и выбрасывает попадания в кэш, стоящие за ним. На долгой сессии кодинга это реальный счёт, оплаченный ради предотвращения переполнения, которого не случилось бы.
У сжатия схем свой край: обрезка описания параметра до одного предложения безопасна для валидности аргументов, но может удалить ту фразу, которая говорила модели, когда применять инструмент. Оно меняет поведение выбора, не меняя ни одной схемы, которую проверяет валидатор, и потому проявляется как чуть худший выбор инструмента, а не как ошибка. Измеряйте его как A/B, а не включайте потому, что оно экономит токены.
И весь приём не даёт ничего, если задача действительно велика для модели. Бюджетирование превращает жёсткий потолок в мягкий; оно не создаёт места, которого нет.
Как применить
Карточка — это данные. Склонируйте репозиторий и импортируйте её по пути: всё, что приходит по сети, считается заражённым и удерживается до одобрения — это и есть желаемое поведение, и поэтому здесь нет установщика в одну строку.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-budget-the-context/SKILL.mdЦелостность
SHA-256 файла в опубликованном виде. Импортёр может проверить, что полученное совпадает с показанным на этой странице.
63f202117c1ffb79dcc016edf37d12760ef2edd00274900bf5177dc1ee6b33f2