Управление контекстом
Почему стоимость длительных сессий растёт нелинейно и какие подходы позволяют ограничивать размер истории.
API не хранит состояние. На каждом шаге повторно отправляется весь диалог, поэтому число входных токенов растёт вместе с историей — и вместе с ним растёт стоимость каждого последующего вызова.
Суть проблемы
Диалог из N шагов, каждый из которых добавляет примерно T токенов, суммарно требует порядка N²T/2 входных токенов вместо NT. Удвоение длины сеанса примерно вчетверо увеличивает расходы на входные токены. Поэтому агент, который казался дешёвым в течение десяти минут, через час начинает вызывать тревогу.
Четыре работающих подхода
| Подход | Как работает | Компромисс |
|---|---|---|
| Скользящее окно | Сохраняйте последние K шагов, удаляйте остальные | Полностью теряет ранний контекст |
| Обновляемая сводка | Периодически заменяйте старые шаги кратким изложением, созданным моделью | Требует одного дополнительного вызова; сохраняет суть |
| Новый сеанс для каждой задачи | Начинайте с чистого листа при смене темы | Бесплатно и обычно уместно |
| Внешнее хранение | Храните состояние в файлах или базе данных, загружайте только то, что нужно на текущем шаге | Больше всего работы, лучший результат |
Краткое изложение предыдущих шагов
def compact(history, keep=6):
class="s">""class="s">"Replace everything but the last `keep` turns with one summary turn."class="s">""
if len(history) <= keep:
return history
old, recent = history[:-keep], history[-keep:]
summary = summarise(old) class=class="s">"c"># one cheap Haiku call
return [{class="s">"role": class="s">"user", class="s">"content": fclass="s">"Summary of earlier discussion: {summary}"}] + recent
Поручите создание сводки недорогой модели. Это задача сжатия, а не рассуждения.
Обычно причина — результаты инструментов
- Если инструмент возвращает 500 строк, в каждый последующий запрос попадает 500 строк. Ограничьте число строк или возвращайте сводку вместе с идентификатором для получения подробностей по запросу.
- Полное содержимое файлов, прочитанных агентом, остаётся в контексте. Читайте нужный раздел, а не весь файл.
- Скриншоты и изображения отправляются повторно, как и любое другое содержимое — удаляйте их после того, как они описаны.
- Журналы сборки и трассировки стека: сохраняйте первые и последние 50 строк, а середину удаляйте.
В агентных инструментах начало новой сессии при переходе между несвязанными задачами — самый дешёвый способ оптимизации. В Claude Code для этого используется
/clear.