Вайб-кодинг и ИИ-агенты
Выпуск 3··6:09

Когда сбрасывать контекст агенту: измеренная U-кривая

Тридцать шесть прогонов, шесть политик сессий и ответ, который не совпал ни с одним из двух популярных правил Полная расшифровка выпуска — ru.arsentev.ai/podcast

СКОРОСТЬ

Расшифровка

У каждой команды, которая работает с агентами для программирования, рано или поздно появляется своё правило гигиены сессий. Одни сбрасывают контекст после каждой задачи: короткий промпт — дешёвый промпт. Другие не сбрасывают его никогда: пусть модель помнит, что успела узнать о проекте. Оба правила защищают уверенно. И ни одно, насколько я знаю, никто не измерял.

Вопрос совсем не академический. В работе агента основные деньги уходят не на то, что модель пишет, а на то, что она перечитывает. Длина сессии — единственный рычаг, который меняет, сколько контекста перечитывается. И этот рычаг есть у каждого: он бесплатный и не требует доступа к модели.

Я его измерил.

Двенадцать независимых задач по программированию. Каждая сформулирована одним предложением и проверяется тестами. Задачи и их порядок одинаковые во всех прогонах.

Агент — Claude Code в неинтерактивном режиме, один вызов на задачу. Продолжить сессию — значит передать флаг продолжения, начать новую — просто его не передавать. Ровно тот механизм, которым пользуются в работе, никакой симуляции.

Шесть условий: новая сессия каждую задачу, каждые две, три, четыре, шесть и одна сессия на все двенадцать. По шесть повторов на условие. Всего 36 прогонов и 432 запуска задач. Модель одна и та же везде: вопрос про форму кривой, а не про сравнение моделей.

Стоимость я считаю по измеренным счётчикам токенов и опубликованным ценам, отдельно для входа, вывода, записи в кэш и чтения из кэша. Сравнение — точными перестановочными тестами: с шестью повторами на условие перебираются все 924 разбиения, никаких допущений о форме распределения.

И важная деталь про качество. Если дешёвая политика делает меньше работы, сравнивать стоимость бессмысленно. Поэтому каждый прогон заканчивался полным набором тестов, и это был пропускной фильтр, а не второстепенная метрика.

Стоимость не монотонна. Когда контекст сбрасывается после каждой задачи, прогон обходится в 2,68 доллара. Когда каждые три задачи — 2,14. Когда не сбрасывается вообще — снова дороже, 2,47.

То есть самая дорогая политика — та, которую многие выбирают по умолчанию: новая сессия на каждую задачу. Она дороже лучшей на 25 процентов. А «никогда не сбрасывать» дороже лучшей на 16 процентов.

Статистика говорит то же самое. Сброс каждые три задачи дешевле сброса после каждой задачи с p равным 0,0022 — это самое маленькое значение, какое вообще может дать такой дизайн. Каждый прогон в оптимуме оказался дешевле каждого прогона в худшем условии. И дешевле, чем «никогда не сбрасывать», с p равным 0,0108.

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

Качество при этом одинаковое везде: 4086 тестов, ноль провалов. Ни одно условие не купило дешевизну ценой работы.

Её складывают два эффекта, которые тянут в разные стороны.

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

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

Чтение из кэша — это произведение этих двух величин. Одна падает, другая растёт, и их произведение даёт букву U.

Но сброс тоже не бесплатен. Каждая свежая сессия заново наполняет кэш, и запись в кэш в двенадцать с половиной раз дороже чтения из него. При сбросе после каждой задачи одна только запись в кэш съедает 95 центов из 2,68 доллара.

Вот почему эту ошибку трудно заметить. Команда, которая сбрасывает контекст постоянно, видит маленький контекст и думает, что экономит, — а платит за запись в кэш. Команда, которая не сбрасывает его никогда, не видит повторных записей и тоже думает, что экономит, — а платит за перечитывание. Счёт другой стороны не видит ни та, ни другая.

Шести повторов хватает, чтобы отделить края от середины, но не хватает, чтобы расставить места внутри середины. Я не утверждаю, что три лучше четырёх.

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

И задачи в наборе в основном независимые. Если бы каждая опиралась на предыдущую, длинные сессии выиграли бы сильнее, и минимум сдвинулся бы вправо.

Длина сессии — бесплатный рычаг с разбросом в 25 процентов. И лучшая настройка — ни одна из двух, которыми пользуются. Сбрасывайте контекст, но не после каждой задачи.

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

Чтобы видеть это на своих сессиях, я выложил открытый инструмент contextburn. Он читает расшифровки, которые Claude Code и так пишет на вашей машине, и показывает, какая доля оплаченных токенов стала работой, а какая — перечитыванием. Сырые данные всех 36 прогонов открыты на Hugging Face, Kaggle и OSF, отчёт — на Zenodo с DOI. Ссылки — на arsentev.ai/research.