«Агент ушёл не туда», «жрёт контекст», «счёт за токены втрое выше ожидаемого» - за этими жалобами стоят разные механизмы. Разберём механику, а потом соберём диагностику по симптомам, чтобы за пару минут понимать, с чем именно вы имеете дело.
Что занимает контекстное окно?
Первое, что ломает интуицию: контекстное окно - это не «сколько я написал». Документация Anthropic перечисляет содержимое поимённо:
Всё в запросе считается в контекстное окно: системный промпт, каждое сообщение в messages (включая результаты инструментов, изображения и документы) и определения ваших инструментов. Ответ, который Claude генерирует за ход, вместе с его развёрнутым рассуждением, считается тоже.
У агента окно расходуется быстрее, чем у чата, даже при одинаковых репликах. Каждый вызов инструмента возвращает результат, и результат остаётся в истории целиком. Прочитали файл на 800 строк - он в окне. Прочитали его второй раз после правки - он в окне дважды.
Размеры окон различаются по поколениям моделей. На конец июля 2026 года они такие (документация Anthropic):
| Модели | Окно, токенов |
|---|---|
| Opus 5, Opus 4.6-4.8, Sonnet 5, Sonnet 4.6, Fable 5 | 1 000 000 |
| Sonnet 4.5, Haiku 4.5 и старше | 200 000 |
Ответ за один запрос у миллионных моделей ограничен 128 тысячами токенов.
Кэшированный префикс промпта продолжает занимать окно. Anthropic формулирует так: кэширование меняет то, сколько вы платите за эти токены, а не то, считаются ли они. Дешевле - да. Свободнее в окне - нет.
Почему «агент забыл» - это четыре разные поломки?
| Механизм | Как выглядит | Данные в окне | Что помогает |
|---|---|---|---|
| Вход не влез | HTTP 400, invalid_request_error, «prompt is too long» | нет, запрос отклонён целиком | резать вход до отправки |
| Генерация уперлась в лимит | ответ обрывается, stop_reason: model_context_window_exceeded | часть ответа потеряна | уменьшить max_tokens или входную часть |
| Обвязка сжала историю | сессия продолжается, детали пропали | физически нет, остался пересказ | контрольные точки, ручной перезапуск |
| Деградация внимания | ответ уверенный и неверный | данные есть, модель их не берёт | сократить контекст, разбить задачу |
Первые два случая описаны в документации Anthropic буквально: если один только вход превышает окно, API возвращает 400 на любой модели; на моделях 4.5 и новее запрос со слишком большим max_tokens принимается, а генерация останавливается со stop_reason: model_context_window_exceeded.
Третий случай самый обидный, потому что выглядит как продолжение работы. Обвязка вроде Claude Code или Codex при подходе к лимиту заменяет историю структурированным пересказом. Часть контекста при этом перезагружается автоматически - системный промпт, память, описания инструментов, - а вызванные навыки возвращаются с ограничением по объёму (документация Claude Code). Практики относятся к такому обмену заметно хуже вендоров:
Многие любят говорить, что компактификация снимает вопрос, но объём деталей, который теряется при компактификации, безумно велик для большинства моих задач.
Четвёртый механизм отличается от третьего принципиально, и путают их постоянно. На Hacker News это чётко формулирует irskep: компактификация сводит стенограмму к её пересказу, и качество падает потому, что агент буквально теряет информацию. При деградации внимания информация остаётся на месте - модель просто до неё не дотягивается.
Окно занято ещё до вашего первого промпта
Документация Claude Code даёт ориентиры для сессии на 200 тысяч токенов: системный промпт около 4200 токенов, файл памяти агента около 680, информация об окружении около 280, имена MCP-инструментов около 120 (полные схемы подгружаются по требованию).
Реальная картина бывает тяжелее. В issue #24458 пользователь приводит вывод команды /context при 55 тысячах занятых токенов из 200 тысяч:
| Что занимает | Токенов | Доля окна |
|---|---|---|
| Схемы системных инструментов | 25 200 | 12,6 % |
| Вся переписка с пользователем | 19 400 | 9,7 % |
| MCP-инструменты | 5 400 | 2,7 % |
| Системный промпт | 3 700 | 1,8 % |
| Пользовательские агенты | 3 500 | 1,7 % |
| Память проекта | 1 300 | 0,6 % |
Полезный диалог здесь занимает меньше десятой части окна. Всё остальное приезжает до того, как вы напечатали первое слово. Отключение лишних MCP-серверов и пользовательских агентов освобождает в этой конфигурации 8,9 тысячи токенов - почти половину того, что заняла вся переписка.
Правда ли, что в окно на миллион влезает миллион?
Три разных числа для одной модели - обычная ситуация:
- Что заявлено на странице модели. У GPT-5.6 Sol контекстное окно на 1 050 000 токенов, ответ до 128 000 (документация OpenAI).
- Что даёт инструмент. В issue openai/codex#32806 автор показывает, как консоль урезала окно до 272 000, а с коэффициентом полезного использования 95 % осталось 258 400.
- Где начинается другая цена. На странице модели сказано прямо: промпты длиннее 272 000 входных токенов тарифицируются по двойной цене за вход и полуторной за выход для всего запроса.
Последний пункт и есть механика «счёт оказался вдвое выше ожидаемого». Один тяжёлый запрос, перешагнувший порог, дорожает целиком, включая ту часть, которая была бы дешёвой сама по себе.
У Anthropic ценового порога нет: запрос на 900 тысяч токенов тарифицируется по той же ставке за токен, что и запрос на 9 тысяч. Зато есть другая ловушка - смена поколения токенизатора. У моделей Claude 4.7 и новее новый токенизатор, который на том же тексте даёт примерно на 30 % больше токенов (документация по подсчёту токенов). Старые оценки бюджета после миграции не масштабируются, их нужно пересчитывать.
Почему модель хуже соображает на длинном контексте?
Как у человека с ограниченной рабочей памятью, у языковых моделей есть «бюджет внимания», который они расходуют, разбирая большие объёмы контекста. [...] Контекст следует рассматривать как ограниченный ресурс с убывающей предельной отдачей.
Термин context rot Anthropic использует прямо в документации: по мере роста числа токенов точность и полнота извлечения падают. Инженерный блог там же оговаривает, что падение идёт градиентом без резкого обрыва: модели остаются работоспособными на длинном контексте, но теряют точность извлечения.
Насколько ощутимо - видно из System Card Claude Sonnet 4.6. Бенчмарк GraphWalks заполняет окно графом и просит обойти его в ширину (значения из столбца с бюджетом рассуждения 64 тысячи токенов):
| Модель | 256K токенов | 1M токенов | Потеря |
|---|---|---|---|
| Claude Sonnet 4.6 | 72,8 | 68,4 | 6 % |
| Claude Opus 4.6 | 61,5 | 41,2 | 33 % |
| Claude Sonnet 4.5 | 44,9 | 25,6 | 43 % |
Это цифры самого производителя про собственные модели. У Google похожая картина: в карточке Gemini 3.1 Pro на MRCR v2 заявлено 84,9 % на 128 тысячах токенов по усреднённой метрике против 26,3 % на миллионе по pointwise - метрики разные, но направление одинаковое.
Независимые замеры говорят то же самое. Работа NoLiMa (ICML 2025) убрала из теста дословные совпадения между вопросом и искомым фрагментом, оставив только смысловую связь. Результат: на 32 тысячах токенов 11 из 13 моделей упали ниже половины своих же показателей на коротком контексте, а GPT-4o - с 99,3 % до 69,7 %. Бенчмарк RULER (COLM 2024) на 17 моделях показал, что при заявленных 32 тысячах токенов приемлемое качество на этой длине держит лишь половина. Ещё раньше работа Lost in the Middle описала U-образную кривую: факт находится хорошо, если он в начале или в конце окна, и заметно хуже - если в середине.
Почему у одних всё работает, а у других разваливается?
Документация Google описывает это без обиняков: на одном искомом фрагменте точность около 99 %, а когда фрагментов несколько, модель работает уже не так точно.
Наблюдения практиков ложатся сюда же. Одни говорят, что модель на длинном контексте просто медленнее и дороже, другие - что она заметно глупеет. Правы обе стороны: первые чаще ищут в контексте, вторые чаще просят многошаговый вывод. Отсюда рабочее правило: чем больше логических переходов нужно для ответа, тем раньше стоит резать контекст.
В Claude Code с «миллионными» моделями я не рискую заходить дальше 30 %.
Сколько токенов стоит русский текст?
Замер воспроизводимый: библиотека tiktoken 0.13.0, два текста одного смысла, две кодировки.
| Образец | Символов | Токенов (o200k_base) | Символов на токен |
|---|---|---|---|
| Английская проза | 670 | 133 | 5,04 |
| Русская проза, тот же смысл | 685 | 174 | 3,94 |
| Код с английскими именами | 919 | 210 | 4,38 |
| Код с русскими комментариями | 962 | 238 | 4,04 |
Проверить на своём тексте можно за минуту:
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
text = open("spec.md", encoding="utf-8").read()
print(len(enc.encode(text)), "токенов на", len(text), "символов")Ориентиры для планирования бюджета: стандартная страница в 1800 знаков по-русски занимает около 457 токенов, по-английски около 357. Техническое задание на десять страниц - примерно 4600 токенов. Файл кода на 500 строк по 60 символов - около 6850. В окно на 200 тысяч токенов влезет 29 таких файлов, и больше ничего: ни системного промпта, ни схем инструментов, ни истории диалога.
У Anthropic есть бесплатный эндпоинт подсчёта токенов, у OpenAI - открытый токенизатор tiktoken. Оценка «один токен примерно четыре символа» выведена для английского и на русском заметно врёт.
Как понять, какая именно поломка у вас?
Посмотрите код ответа
HTTP 400 с текстом про слишком длинный промпт означает, что вход не влез целиком. Ответ, оборвавшийся со
stop_reason: model_context_window_exceeded, означает другое: вход прошёл, места не хватило генерации.Проверьте разбивку окна
В консольных агентах есть команда показа занятого контекста. Если на схемы инструментов уходит больше, чем на переписку, дальше оптимизировать формулировки бессмысленно - отключайте лишние серверы и агентов.
Найдите следы сжатия истории
Сообщение о компактификации, внезапно короткая история, агент переспрашивает о том, что обсуждали - это потеря данных, а не деградация внимания. В issue #24179 описан крайний случай: 211 компактификаций за одну сессию без движения по задаче.
Оцените, сколько логических переходов нужно для ответа
Если задача требует связать три-четыре разбросанных факта, а окно заполнено больше чем наполовину, вероятнее всего вы упёрлись в деградацию внимания. Проверка простая: тот же вопрос в чистой сессии с минимальным контекстом.
Последний шаг - главный тест. Если в чистой сессии ответ верный, дело в объёме контекста, а не в сложности задачи.
Что делать, когда окно кончается?
- Перезапускайте сессию осознанно. Приём, который описывает Steve Klabnik: попросить агента подготовить промпт для продолжения работы, прочитать этот промпт глазами, поправить и начать чистую сессию с ним. Сводку пишет тот, кто знает контекст, а проверяете её вы.
- Не грузите всё сразу. Практик под ником posnet описывает разницу так: подать много документов в одно окно даёт худшие ответы, чем сначала получить их резюме, задать вопрос по резюме, а полный текст нужного документа подать по запросу. Это же логика RAG: доставать по требованию вместо того, чтобы держать всё в окне.
- Режьте задачу, а не только контекст. Многошаговые задачи деградируют раньше остальных, поэтому три независимых прогона с чистым контекстом дают более предсказуемый результат, чем один длинный.
- Держите запас. Практики называют рабочим потолком 30-40 % заявленного окна. Это личный опыт, а не измерение, но он сходится с цифрами GraphWalks и MRCR.
Если агент начал спорить с собственными прошлыми ошибками и ходить кругами, добавление уточнений обычно усугубляет ситуацию: спорные реплики тоже остаются в окне. Дешевле собрать сводку и стартовать с чистого листа.
Пять ошибок, которые повторяются чаще всего
| Антипаттерн | Что происходит | Что делать вместо |
|---|---|---|
| Весь репозиторий в промпт | окно забито, качество ответов падает | резюме плюс подача файлов по запросу |
| Одна сессия на весь день | накопленный мусор в истории, циклы | перезапуск с проверенной сводкой |
| Спорить с запутавшимся агентом | спор тоже занимает окно | чистая сессия |
| Заявленное окно как рабочее | деградация начинается заметно раньше лимита | потолок 30-40 % от заявленного |
| Автосжатие как основной приём | потеря деталей в непредсказуемый момент | контрольные точки до подхода к лимиту |
Контекст дешевле считать расходным ресурсом с убывающей отдачей: место в окне есть, а вот отдача от каждой следующей тысячи токенов - уже нет.
Частые вопросы
Частично. Больше места снимает отказы по переполнению, но не отменяет деградацию внимания: цифры GraphWalks и MRCR показывают падение именно при переходе к максимальным длинам.
Нет. Кэш меняет цену токенов, а не их наличие в окне: кэшированный префикс занимает место так же, как обычный.
Чаще всего это сжатие истории обвязкой или срабатывание её собственного лимита раньше модельного. Стоит посмотреть логи обвязки и разбивку занятого контекста, а также проверить хуки: один многословный линтер в хуке способен выесть окно незаметно.
Нет. На современных токенизаторах разница около 30 %, на поколении cl100k_base доходила до 2,2 раза. Оценка «в три-четыре раза» встречается часто, но воспроизводимым замером не подтверждается.
Что дальше
Разберите одну свою сессию по шагам из раздела диагностики: посмотрите разбивку окна, найдите, что занимает больше всего, и повторите тот же запрос в чистой сессии. Разница в ответах покажет, с какой из четырёх поломок вы имеете дело. Термины из статьи разобраны в глоссарии: контекстное окно, токен, AI-агент, RAG.
Источники
- Context windows - документация Anthropic - состав окна, размеры, поведение при переполнении, термин context rot.
- Token counting - документация Anthropic - подсчёт токенов и смена токенизатора у Claude 4.7+.
- Effective context engineering for AI agents - инженерный блог Anthropic - бюджет внимания, квадратичный рост связей.
- Claude Sonnet 4.6 System Card (PDF) - результаты GraphWalks на 256K и 1M.
- Explore the context window - документация Claude Code - разбивка стартового наполнения окна и механика компактификации.
- GPT-5.6 Sol - документация OpenAI - размер окна и ценовой порог 272K.
- Gemini 3.1 Pro Model Card - Google DeepMind - MRCR v2 на 128k и 1M.
- Long context - документация Gemini API - разница между поиском одного и нескольких фрагментов.
- NoLiMa: Long-Context Evaluation Beyond Literal Matching, ICML 2025 - падение ниже половины базового уровня на 32K.
- RULER: What's the Real Context Size of Your Long-Context Language Models?, COLM 2024 - половина моделей не держит заявленную длину.
- Lost in the Middle, Liu et al., TACL 2024 - U-образная кривая внимания по позиции.
- Context Rot - технический отчёт Chroma - 18 моделей, неравномерное использование контекста.
- Cache strategies - документация HuggingFace Transformers - почему длинный контекст дорог по памяти.
- Обсуждения практиков: тред про Context Rot и тред про урезание окна в Codex на Hacker News; issues claude-code#24179, claude-code#24458, openai/codex#32806.