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

Осенью 2024 года Google DeepMind заявила, что Gemini 1.5 Pro держит контекстное окно в 1 миллион токенов, а в экспериментальном режиме — до 2 миллионов. Anthropic держит 200 тысяч токенов у Claude, а для части корпоративных клиентов Claude 3.5 Sonnet открывала окно на 500 тысяч. OpenAI у GPT-4o и семейства GPT-4.1 заявляет 128 тысяч и до 1 миллиона соответственно. Цифры выглядят так, будто целый репозиторий на несколько сотен файлов можно загрузить в один запрос и попросить модель отрефакторить его целиком. На практике всё сложнее: точность работы с фактами внутри окна падает задолго до формального лимита, и это ломает именно сценарии с большим кодом.
Что такое контекстное окно и почему миллион токенов не равен миллиону
Контекстное окно1 — это объём текста, который модель одновременно держит в поле внимания: и ваш запрос, и приложенные файлы, и весь предыдущий диалог. Всё, что за пределами окна, для модели не существует. Один токен — это примерно 3–4 символа для английского и часто меньше для кода из-за пунктуации, отступов и имён переменных. Файл на 300 строк Python — это грубо 3–5 тысяч токенов.
Формальный лимит окна и практическая надёжность — разные вещи. Модель может вместить миллион токенов, но это не значит, что она одинаково хорошо помнит начало, середину и конец. Исследователи называют это эффектом «потерянного в середине» (lost in the middle): факт, помещённый в центр длинного контекста, извлекается заметно хуже, чем тот же факт в начале или в конце.
Большое окно решает проблему «влезет ли». Оно не решает проблему «вспомнит ли модель нужную строку из середины пятидесятого файла».
Как это проявляется на коде
Код — худший случай для длинного контекста по нескольким причинам сразу:
- Зависимости разбросаны. Функция определена в одном файле, вызывается в другом, тип приходит из третьего. Чтобы корректно отредактировать одну строку, модель должна одновременно удерживать связи между удалёнными участками окна — а именно на дальних связях точность и проседает.
- Плотность значимых токенов выше. В прозе можно потерять слово без вреда для смысла. В коде потерянная скобка, неверное имя переменной или пропущенный импорт ломают всё.
- Повторяющиеся паттерны путают. Десятки похожих функций, одинаковые обёртки, шаблонный boilerplate — модель начинает смешивать их между собой.
Как измеряют деградацию
Базовый тест на длинный контекст — «иголка в стоге сена» (needle in a haystack): в длинный текст прячут одну фразу-факт и просят модель её найти. Многие модели проходят его почти идеально, и это создаёт ложное впечатление, что длинное окно работает надёжно.
Проблема в том, что «одна иголка» — слишком простая задача. Как только иголок становится несколько, или между ними нужно установить связь, или факт нужно не найти, а использовать в рассуждении, результаты падают. Отдельно для длинного контекста существует бенчмарк RULER от NVIDIA, который проверяет не только поиск, но и многошаговое использование фактов на разной длине. По его логике многие модели, заявляющие 128 тысяч и больше, устойчиво держат заметно меньше, чем формальный лимит. Конкретные числа зависят от версии модели и постоянно меняются, поэтому проверяйте актуальную таблицу бенчмарка, а не устаревшие цифры из статей.
Сравнение подходов к большому коду
Загрузка всего репозитория в окно — не единственный путь. Вот как соотносятся основные стратегии.
| Подход | Что делает | Плюсы | Ограничения |
|---|---|---|---|
| Всё в окно | Кладёте весь код в один запрос | Модель видит все связи сразу, ничего не теряется на этапе отбора | Дорого по токенам, деградация точности на дальних связях, упор в лимит окна |
| RAG по коду | Ищете релевантные фрагменты и подаёте только их | Дёшево, масштабируется на огромные репозитории | Качество зависит от поиска: не нашли нужный файл — модель о нём не знает |
| Агент с инструментами | Модель сама читает файлы, ищет по grep, открывает нужное | Работает с проектами любого размера, держит в окне только актуальное | Медленнее, больше шагов, цена растёт с числом обращений |
| Разбиение на подзадачи | Дробите работу на модуль/файл | Каждый запрос короткий и точный | Теряются межмодульные связи, нужна ручная сборка результата |
RAG2 и агентный подход сегодня лежат в основе большинства инструментов для кода — Cursor, Claude Code, GitHub Copilot Workspace и подобных. Они почти никогда не грузят весь проект в окно целиком, а подтягивают релевантные куски и позволяют модели дочитывать нужное по ходу.
Кому это пригодится и кому нет
Большое окно и работа с крупным кодом полезны не всем одинаково.
- Подойдёт: разбор незнакомого проекта, где нужно быстро понять устройство пары модулей; ревью одного крупного pull request целиком; миграция файла с одного фреймворка на другой, когда все зависимости помещаются в 20–40 тысяч токенов и лежат близко.
- Подойдёт с оговорками: рефакторинг, затрагивающий несколько связанных файлов. Работает, если вы сами отбираете нужные файлы и держите их в начале и конце запроса, а не сваливаете весь репозиторий в середину.
- Не подойдёт: «перепиши мне весь репозиторий на 500 файлов одним запросом». Даже если формально всё влезло, вы почти гарантированно получите пропущенные связи, перепутанные похожие функции и тихие ошибки, которые дороже искать, чем писать код руками.
Что делать на практике
- Не грузите всё подряд. Отберите файлы, которые реально связаны с задачей — обычно это единицы, а не десятки.
- Ставьте самое важное в начало и конец запроса. Середина длинного контекста — зона риска.
- Дробите крупные задачи. Один модуль или одна фича за запрос надёжнее, чем весь проект сразу.
- Давайте модели карту. Короткое описание структуры проекта и того, что где лежит, помогает больше, чем ещё сто тысяч токенов сырого кода.
- Проверяйте результат тестами, а не на глаз. Тихие ошибки от потерянных связей — главный риск длинного контекста.
1 Контекстное окно — максимальный объём текста в токенах, который модель обрабатывает за один запрос; всё за его пределами модель не учитывает.
2 RAG (retrieval-augmented generation) — подход, при котором перед ответом система ищет релевантные фрагменты в базе или репозитории и подаёт модели только их, а не весь массив данных целиком.
Prompt-инженер: Идеальные запросы для Midjourney, ChatGPT и других моделей.
Спросить за 15 ₽Источники: RULER: What's the Real Context Size of Your Long-Context Language Models? (NVIDIA), Anthropic — Models overview (context windows)
Частые вопросы
Если у модели окно на миллион токенов, значит ли это, что она надёжно помнит весь загруженный код?
Почему модель ошибается именно на большом коде, а на длинных текстах справляется лучше?
Что такое эффект «lost in the middle»?
Стоит ли грузить весь репозиторий в один запрос, если он влезает в окно?
Как инструменты вроде Cursor или Claude Code обходят это ограничение?
Какие цифры контекстного окна у моделей актуальны сейчас?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.