Конвейер

Почему агент забывает контекст и как устроено контекстное окно

Опубликовано 31 июл. 2026 г.15 мин чтенияСредний уровень
Что вы получите
  • Отличать четыре разные причины, по которым агент теряет нить
  • Читать разбивку занятого окна и видеть, что съело бюджет до вашего первого промпта
  • Понимать, почему заявленный миллион токенов не равен доступному
  • Считать, во сколько токенов обходится русский текст против английского
  • Подбирать приём под конкретную поломку
Применить за 15 мин
Средний уровень
53просмотров

«Агент ушёл не туда», «жрёт контекст», «счёт за токены втрое выше ожидаемого» - за этими жалобами стоят разные механизмы. Разберём механику, а потом соберём диагностику по симптомам, чтобы за пару минут понимать, с чем именно вы имеете дело.

Что занимает контекстное окно?

Первое, что ломает интуицию: контекстное окно - это не «сколько я написал». Документация Anthropic перечисляет содержимое поимённо:

Всё в запросе считается в контекстное окно: системный промпт, каждое сообщение в messages (включая результаты инструментов, изображения и документы) и определения ваших инструментов. Ответ, который Claude генерирует за ход, вместе с его развёрнутым рассуждением, считается тоже.

- Anthropic, Документация, Context windows (перевод с английского)

У агента окно расходуется быстрее, чем у чата, даже при одинаковых репликах. Каждый вызов инструмента возвращает результат, и результат остаётся в истории целиком. Прочитали файл на 800 строк - он в окне. Прочитали его второй раз после правки - он в окне дважды.

Размеры окон различаются по поколениям моделей. На конец июля 2026 года они такие (документация Anthropic):

МоделиОкно, токенов
Opus 5, Opus 4.6-4.8, Sonnet 5, Sonnet 4.6, Fable 51 000 000
Sonnet 4.5, Haiku 4.5 и старше200 000

Ответ за один запрос у миллионных моделей ограничен 128 тысячами токенов.

Почему «агент забыл» - это четыре разные поломки?

МеханизмКак выглядитДанные в окнеЧто помогает
Вход не влез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). Практики относятся к такому обмену заметно хуже вендоров:

Многие любят говорить, что компактификация снимает вопрос, но объём деталей, который теряется при компактификации, безумно велик для большинства моих задач.

- tekacs, Hacker News (перевод с английского)

Четвёртый механизм отличается от третьего принципиально, и путают их постоянно. На Hacker News это чётко формулирует irskep: компактификация сводит стенограмму к её пересказу, и качество падает потому, что агент буквально теряет информацию. При деградации внимания информация остаётся на месте - модель просто до неё не дотягивается.

Окно занято ещё до вашего первого промпта

Документация Claude Code даёт ориентиры для сессии на 200 тысяч токенов: системный промпт около 4200 токенов, файл памяти агента около 680, информация об окружении около 280, имена MCP-инструментов около 120 (полные схемы подгружаются по требованию).

Реальная картина бывает тяжелее. В issue #24458 пользователь приводит вывод команды /context при 55 тысячах занятых токенов из 200 тысяч:

Что занимаетТокеновДоля окна
Схемы системных инструментов25 20012,6 %
Вся переписка с пользователем19 4009,7 %
MCP-инструменты5 4002,7 %
Системный промпт3 7001,8 %
Пользовательские агенты3 5001,7 %
Память проекта1 3000,6 %

Полезный диалог здесь занимает меньше десятой части окна. Всё остальное приезжает до того, как вы напечатали первое слово. Отключение лишних MCP-серверов и пользовательских агентов освобождает в этой конфигурации 8,9 тысячи токенов - почти половину того, что заняла вся переписка.

Правда ли, что в окно на миллион влезает миллион?

Три разных числа для одной модели - обычная ситуация:

  1. Что заявлено на странице модели. У GPT-5.6 Sol контекстное окно на 1 050 000 токенов, ответ до 128 000 (документация OpenAI).
  2. Что даёт инструмент. В issue openai/codex#32806 автор показывает, как консоль урезала окно до 272 000, а с коэффициентом полезного использования 95 % осталось 258 400.
  3. Где начинается другая цена. На странице модели сказано прямо: промпты длиннее 272 000 входных токенов тарифицируются по двойной цене за вход и полуторной за выход для всего запроса.

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

У Anthropic ценового порога нет: запрос на 900 тысяч токенов тарифицируется по той же ставке за токен, что и запрос на 9 тысяч. Зато есть другая ловушка - смена поколения токенизатора. У моделей Claude 4.7 и новее новый токенизатор, который на том же тексте даёт примерно на 30 % больше токенов (документация по подсчёту токенов). Старые оценки бюджета после миграции не масштабируются, их нужно пересчитывать.

Почему модель хуже соображает на длинном контексте?

Как у человека с ограниченной рабочей памятью, у языковых моделей есть «бюджет внимания», который они расходуют, разбирая большие объёмы контекста. [...] Контекст следует рассматривать как ограниченный ресурс с убывающей предельной отдачей.

- Anthropic Engineering, Effective context engineering for AI agents (перевод с английского)

Термин context rot Anthropic использует прямо в документации: по мере роста числа токенов точность и полнота извлечения падают. Инженерный блог там же оговаривает, что падение идёт градиентом без резкого обрыва: модели остаются работоспособными на длинном контексте, но теряют точность извлечения.

Насколько ощутимо - видно из System Card Claude Sonnet 4.6. Бенчмарк GraphWalks заполняет окно графом и просит обойти его в ширину (значения из столбца с бюджетом рассуждения 64 тысячи токенов):

Модель256K токенов1M токеновПотеря
Claude Sonnet 4.672,868,46 %
Claude Opus 4.661,541,233 %
Claude Sonnet 4.544,925,643 %

Это цифры самого производителя про собственные модели. У 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 %.

- PeterStuer, Hacker News (перевод с английского)

Сколько токенов стоит русский текст?

Замер воспроизводимый: библиотека tiktoken 0.13.0, два текста одного смысла, две кодировки.

ОбразецСимволовТокенов (o200k_base)Символов на токен
Английская проза6701335,04
Русская проза, тот же смысл6851743,94
Код с английскими именами9192104,38
Код с русскими комментариями9622384,04

Проверить на своём тексте можно за минуту:

python
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. Оценка «один токен примерно четыре символа» выведена для английского и на русском заметно врёт.

Как понять, какая именно поломка у вас?

  1. Посмотрите код ответа

    HTTP 400 с текстом про слишком длинный промпт означает, что вход не влез целиком. Ответ, оборвавшийся со stop_reason: model_context_window_exceeded, означает другое: вход прошёл, места не хватило генерации.

  2. Проверьте разбивку окна

    В консольных агентах есть команда показа занятого контекста. Если на схемы инструментов уходит больше, чем на переписку, дальше оптимизировать формулировки бессмысленно - отключайте лишние серверы и агентов.

  3. Найдите следы сжатия истории

    Сообщение о компактификации, внезапно короткая история, агент переспрашивает о том, что обсуждали - это потеря данных, а не деградация внимания. В issue #24179 описан крайний случай: 211 компактификаций за одну сессию без движения по задаче.

  4. Оцените, сколько логических переходов нужно для ответа

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

Последний шаг - главный тест. Если в чистой сессии ответ верный, дело в объёме контекста, а не в сложности задачи.

Что делать, когда окно кончается?

  1. Перезапускайте сессию осознанно. Приём, который описывает Steve Klabnik: попросить агента подготовить промпт для продолжения работы, прочитать этот промпт глазами, поправить и начать чистую сессию с ним. Сводку пишет тот, кто знает контекст, а проверяете её вы.
  2. Не грузите всё сразу. Практик под ником posnet описывает разницу так: подать много документов в одно окно даёт худшие ответы, чем сначала получить их резюме, задать вопрос по резюме, а полный текст нужного документа подать по запросу. Это же логика RAG: доставать по требованию вместо того, чтобы держать всё в окне.
  3. Режьте задачу, а не только контекст. Многошаговые задачи деградируют раньше остальных, поэтому три независимых прогона с чистым контекстом дают более предсказуемый результат, чем один длинный.
  4. Держите запас. Практики называют рабочим потолком 30-40 % заявленного окна. Это личный опыт, а не измерение, но он сходится с цифрами GraphWalks и MRCR.
Когда контекст отравлен, чинить его дороже, чем начать заново

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

Пять ошибок, которые повторяются чаще всего

АнтипаттернЧто происходитЧто делать вместо
Весь репозиторий в промптокно забито, качество ответов падаетрезюме плюс подача файлов по запросу
Одна сессия на весь деньнакопленный мусор в истории, циклыперезапуск с проверенной сводкой
Спорить с запутавшимся агентомспор тоже занимает окночистая сессия
Заявленное окно как рабочеедеградация начинается заметно раньше лимитапотолок 30-40 % от заявленного
Автосжатие как основной приёмпотеря деталей в непредсказуемый моментконтрольные точки до подхода к лимиту

Контекст дешевле считать расходным ресурсом с убывающей отдачей: место в окне есть, а вот отдача от каждой следующей тысячи токенов - уже нет.

Частые вопросы

Что дальше

Разберите одну свою сессию по шагам из раздела диагностики: посмотрите разбивку окна, найдите, что занимает больше всего, и повторите тот же запрос в чистой сессии. Разница в ответах покажет, с какой из четырёх поломок вы имеете дело. Термины из статьи разобраны в глоссарии: контекстное окно, токен, AI-агент, RAG.

Источники

Статья оказалась полезной?
Автор
Илья Лапшов
Автор

Связанные термины