Контекстное окно AI-агента — почему Claude Code тупеет на 50% заполнения и 7 способов это исправить
Контекстное окно AI-агента: почему Claude Code тупеет на 50% заполнения и 7 способов это исправить
Миллион токенов контекста звучит как бесконечность. На практике Claude Code начинает терять хватку задолго до лимита: забывает решения, принятые в начале сессии, путает имена файлов и уверенно предлагает подход, который вы отвергли двадцать сообщений назад.
TL;DR: Качество ответов Claude Code деградирует с ростом контекста. По исследованию Chroma, точность извлечения информации падает при каждом увеличении контекста, а эффект «потерянного в середине» снижает точность на 30%+ для информации в центре диалога. Ниже 7 конкретных приёмов, которые держат контекст чистым и агента в тонусе.
Куда уходят токены
Прежде чем оптимизировать, нужно понять, на что тратится контекст. Часть окна занята ещё до вашего первого сообщения:
- Системный overhead: ~33K токенов на внутренности Claude Code
- MCP-серверы: каждый подключённый сервер (Playwright, postgres-client) загружает определения инструментов при каждом запросе
- CLAUDE.md: инструкции проекта включаются в каждое сообщение
- Файлы памяти: auto-memory и кастомные заметки
- История диалога: каждое сообщение, включая блоки кода и вывод команд
За 4 часа работы легко потратить 40-50% окна, даже если кажется, что вы ничего тяжёлого не делали. Один grep по большой кодовой базе, cat файла на 500 строк, упавший тест с длинным стек-трейсом. Всё это накапливается.
Context rot: что говорят исследования
Термин «context rot» ввела инженерная команда Anthropic: контекст это «конечный ресурс с убывающей отдачей». Вот конкретные цифры.
По бенчмаркам MRCR v2, Claude Opus 4.6 извлекает правильный ответ в 93% случаев при 256K токенов. При полном миллионе эта цифра падает до 78.3%. Звучит неплохо, пока не посчитаешь задачи, где модели нужно одновременно помнить несколько фактов. Три связанных факта при 78.3% точности каждого дают 48% общего успеха (0.783³). Пять фактов, что типично для кросс-файлового рефакторинга, это уже 29.4%.
Исследование JetBrains на 250-ходовых траекториях агентов (SWE-bench Verified) показало кое-что контринтуитивное: простое маскирование старых результатов инструментов (замена содержимого placeholder-ами) работает не хуже LLM-суммаризации и обходится на 52% дешевле. LLM-суммаризация неявно удлиняла траектории агента на 13-15%, потому что стирала сигналы естественной остановки.
Практическое наблюдение из анализа 25+ реальных сессий Claude Code:
- 0-20% заполнения: надёжная работа, модель честно говорит о неуверенности
- 20-40%: начинается деградация, пробует неправильные подходы до проверки документации, но исправляется сама
- 40-60%: ненадёжно. Уверенные ошибочные выводы, фабрикует объяснения, перестаёт самокорректироваться
- 60-80%: ранние факты становятся недоступны, модель генерирует правдоподобные замены
- 80-100%: безвозвратно. Повторяющиеся действия, неспособна интегрировать корректировки
Четыре последовательных агента, которым поручили аудитировать работу предыдущего, каждый правильно диагностировал чужие ошибки. И через 15 минут демонстрировал те же самые.
Скрытая обрезка: то, о чём Anthropic молчит
Если бы context rot был единственной проблемой, его можно было бы решить дисциплиной. Но есть нюанс: Claude Code тихо обрезает контекст, даже когда вы далеко от лимита.
После утечки исходников Claude Code в конце марта 2026 сообщество обнаружило как минимум три скрытых механизма в src/services/compact/:
Microcompact (microCompact.ts). Если пауза между сообщениями превышает порог (задаётся через серверный GrowthBook), старые результаты инструментов заменяются на [Old tool result content cleared]. Без уведомления, без срабатывания хуков.
Tool result budget (applyToolResultBudget()). Агрегатный лимит ~200K токенов на все результаты инструментов плюс per-tool caps: Grep ограничен 20K, Bash 30K, глобальный 50K на отдельный результат. По данным пользователя @ArkNill, в одной сессии было зафиксировано 261 событие обрезки бюджета: результаты чтения файлов сокращались с тысяч символов до 1-41 символа.
Session memory compact (sessionMemoryCompact.ts). Запускается перед автокомпактизацией, оставляет только ~40K токенов недавних сообщений.
Ключевая проблема: DISABLE_AUTO_COMPACT=true отключает только автокомпактизацию. Microcompact и tool result budget работают на каждом API-вызове вне зависимости от настроек. Параметры контролируются серверными GrowthBook-флагами, которые Anthropic может менять без обновления CLI.
Один из пользователей на Reddit описал экстремальный workaround: export CLAUDE_CODE_DISABLE_1M_CONTEXT=1, то есть отключить миллионное окно и вернуться к 200K. По его словам и по отзывам в комментариях, Claude после этого стал заметно адекватнее. Гипотеза: при меньшем окне модель плотнее «держит внимание» на том, что есть.
7 стратегий управления контекстом
1. Мониторьте контекст через /context
Команда /context показывает разбивку по компонентам:
system overhead: 33K MCP servers: 12K (Playwright, postgres-client) CLAUDE.md: 18K memory files: 8K conversation history: 142K free space: 787K total usage: 213K (21% of 1M window)
Запускайте каждые 30 минут в длинных сессиях. Когда usage переваливает за 50%, пора действовать. По рекомендации spacecake.ai, 60% это красная зона, после которой качество заметно падает.
2. Используйте .claudeignore агрессивно
.claudeignore работает как .gitignore, исключает файлы из поиска и запрещает чтение. По оценке spacecake.ai, хорошо настроенный ignore-файл снижает контекст на 40-70% на каждое сообщение.
node_modules/ dist/ build/ .git/ .next/ venv/ __pycache__/ *.log *.tmp coverage/
Начните с очевидного и добавляйте исключения, только если Claude реально нуждается в каком-то файле.
3. /compact с фокусом, не дожидаясь автокомпактизации
/compact сжимает историю диалога, сохраняя ключевые решения. Но по умолчанию Claude сам решает, что важно, а что нет. Это ненадёжно: по отзывам на Reddit, один пользователь сменил подход к задаче на полпути, после автокомпактизации Claude откатил всё обратно к старому подходу.
Используйте /compact с явным фокусом:
/compact "Keep the API design decisions and the database schema, summarize the debugging session"
Запускайте на естественных точках останова: фича готова, баг починен, модуль закончен. Не ждите предупреждения о заполнении.
4. /clear между задачами: не потеря, а перезагрузка
/clear обнуляет историю полностью. Файлы, код, коммиты всё на месте, стирается только диалог.
Эвристика: если следующая задача не зависит от последних 20 сообщений, жмите /clear. Перед этим зафиксируйте результат: git commit, обновите CLAUDE.md или напишите краткое summary в первом сообщении новой сессии.
По рекомендации MindStudio, разбивка длинного проекта на короткие сессии один из самых надёжных способов поддерживать качество.
5. Держите CLAUDE.md под 300-500 строк
CLAUDE.md загружается в каждое сообщение. Раздутый файл на 2000 строк это постоянный налог на контекст.
Что оставить:
- Конвенции: язык, фреймворк, именование
- Ограничения: что нельзя ломать
- Ссылки на документацию (не саму документацию)
Специализированные инструкции переносите в skills: они загружаются только при вызове.
У memory-файлов тоже есть жёсткий лимит: по данным BSWEN, после 200 строк MEMORY.md содержимое не читается. Если ваш файл длиннее, последние строки невидимы для Claude.
6. Субагенты: отдельный контекст для каждой задачи
Субагенты (spawn через Agent tool) получают собственное контекстное окно. Результат возвращается в основную сессию как компактное резюме, а не полная история.
Вместо одной длинной сессии, которая одновременно читает файлы, пишет тесты и рефакторит:
- Один субагент пишет тесты
- Другой ищет паттерны в кодовой базе
- Третий рефакторит реализацию
Основной агент оркестрирует и мёржит результаты. По словам пользователя xAdakis на Reddit, оркестраторный подход с Sonnet для главного агента и Haiku для подзадач решает проблему потери контекста при компактизации.
Минус: субагенты дороже по токенам. Используйте для независимых, параллельных задач, не для мелочей, где overhead не окупается.
7. Указывайте точные файлы вместо «поищи в проекте»
Разница огромна:
- Дорого: «Найди, где мы обрабатываем аутентификацию». Claude грепнет несколько файлов, каждый целиком попадёт в контекст
- Дёшево: «Проверь
src/auth/middleware.ts, функциюvalidateToken». Один точечный read
То же с логами ошибок: не вставляйте 300 строк вывода. Обрежьте до стек-трейса и пары строк вокруг ошибки.
Если просите Claude писать тесты в существующем файле, попросите написать только test-кейсы без setup/teardown бойлерплейта. Если стайл-гайд не требует inline-комментариев, попросите не писать их. Каждый комментарий это токены.
Подводные камни
/compact с фокусом иногда теряет контекст решений. Вы пишете "keep API decisions", а Claude интерпретирует это по-своему. По отзывам на Reddit, пользователь сменил подход к задаче, а после компактизации Claude тихо вернулся к старому. Решение: фиксировать ключевые решения в файлы (CLAUDE.md, git commit message), а не полагаться на контекст.
Microcompact работает даже при DISABLE_AUTO_COMPACT=true. По данным из GitHub Issue #42542, tool result budget (агрегатный лимит 200K на результаты инструментов) обрезает содержимое на каждом API-вызове. Счётчик токенов может показывать 80K при миллионном окне, но это не «80K использовано», это «остальное тихо удалено». На апрель 2026 нет env-переменной, которая отключает этот механизм.
--continue и --resume наследуют раздутый контекст. Если предыдущая сессия была длинной, --continue подхватит весь накопленный контекст. Иногда эффективнее стартануть свежую сессию с коротким summary в первом сообщении, чем тянуть за собой хвост из 500K токенов.
.claudeignore не работает ретроактивно. Файлы, уже прочитанные в текущей сессии, остаются в контексте. Добавление файла в .claudeignore в середине сессии не удалит его из контекста, только предотвратит повторное чтение.
1M контекст может быть хуже 200K. По обсуждению на Reddit, несколько пользователей заметили улучшение качества после CLAUDE_CODE_DISABLE_1M_CONTEXT=1. Но это недокументированная переменная, и её поведение может измениться.
Вердикт
Из всех стратегий три дают максимальный эффект при минимальных усилиях: .claudeignore (разовая настройка, экономия 40-70% на каждое сообщение), /clear между несвязанными задачами (бесплатная перезагрузка) и мониторинг через /context (30 секунд, чтобы понять, пора ли сжиматься). Субагенты мощный инструмент, но с overhead по токенам, их стоит включать на больших задачах. Скрытые механизмы обрезки контекста (microcompact, tool result budget) это текущая реальность Claude Code, с которой пока приходится жить. Следите за Issue #42542, Anthropic пока не ответил, но давление сообщества растёт.
Как попробовать
-
Создайте
.claudeignoreв корне проекта. Начните сnode_modules/,dist/,.git/,coverage/,*.log. Эффект увидите на первом же запросе. -
Запустите
/contextпрямо сейчас в текущей сессии. Посмотрите, сколько съедают MCP-серверы и CLAUDE.md. Отключите неиспользуемые серверы через/mcp. -
Попробуйте
/compact "keep only: [ваши ключевые решения]"после завершения текущей подзадачи. Сравните качество с предыдущими компактизациями без фокуса. -
Заведите привычку
/clearмежду задачами. Перед этимgit commitс описательным сообщением. Новую сессию начинайте с одного абзаца контекста: что делали, что дальше. -
Документация: Context engineering guide от Anthropic, Context rot research от Chroma, команда /context в подробном разборе.