Context Window
context window — сколько токенов модель удерживает за один запрос
Контекстное окно (context window) — максимальное количество токенов, которое языковая модель может удержать в одном запросе. Туда входят системный промпт, история диалога, прикреплённые документы и финальный вопрос. Размер окна определяет, поместится ли в один заход книга, длинный код или весь разговор. Современные модели: GPT-4o — 128K, Claude 3.5 Sonnet — 200K, Gemini 1.5 Pro — до 2M токенов.
Коротко
Коротко. Context window — это ограничение «памяти» LLM на один запрос. Всё, что вы передаёте — инструкции, документы, история чата, ваш вопрос, — должно поместиться в это окно. Если суммарно больше лимита, модель не получит запрос целиком, и часть будет отброшена. Окно измеряется в токенах: 4K в старых моделях, 128K–200K в современных, 2M в Gemini 1.5 Pro.
Что это такое
Декабрь 2023-го. Аналитик пытается отдать ChatGPT финансовый отчёт компании за квартал — 80 страниц PDF. Модель отвечает: «контекст слишком длинный, попробуйте загрузить меньший фрагмент». 80 страниц английского текста — это примерно 30 000 токенов, а GPT-4 Turbo на тот момент держал 128K, но к промпту автоматически добавлялась система, история, метаданные — и где-то на сложении нескольких документов окно переполнилось.
Это и есть момент, когда «контекст» из абстракции превращается в конкретное ограничение. У каждой LLM есть лимит на длину запроса в токенах. Всё, что в этот лимит не помещается, либо обрезается, либо вызывает ошибку.
Контекстное окно — это рабочая память модели на один inference-запрос. Всё, что внутри окна, модель «видит» одинаково хорошо (с оговорками — см. ниже). Всё, что снаружи, — для модели не существует.
Особенность LLM: нет долговременной памяти. Между запросами модель ничего не помнит. Каждый новый чат — пустое окно. Чтобы продолжать диалог, приложение (ChatGPT, Claude) подсовывает в контекст всю предыдущую переписку. Через сотню сообщений старые реплики начинают вытесняться.
Как это работает
Архитектурно контекст устроен так. У трансформера есть позиционные кодирования — числа, которые сообщают модели, где в последовательности стоит каждый токен. При обучении модель видит только последовательности до определённой длины (например, 4096 токенов). Эта длина и становится размером окна.
Расширить окно потом сложно. Прямолинейный подход (просто разрешить более длинный input) не работает: модель не училась на длинных текстах и сразу теряет качество. Современные трюки расширения:
- RoPE (Rotary Position Embeddings) — позиционные кодирования, которые экстраполируются на длины, не виденные при обучении.
- ALiBi (Attention with Linear Biases) — линейный bias к attention, не требующий явных позиций.
- Sliding Window Attention — каждый токен видит только N ближайших, что уменьшает квадратичный рост стоимости.
- Sparse Attention — токен видит лишь часть остальных по специальному паттерну.
- YaRN / NTK-aware scaling — приёмы fine-tuning на длинных текстах поверх готовой модели.
Что входит в контекстное окно при обычном запросе через API:
- System prompt — инструкции (от десятков до тысяч токенов).
- Few-shot примеры (если есть) — образцы ожидаемого ответа.
- История диалога — все предыдущие сообщения пользователя и ответы модели.
- Прикреплённые документы / RAG-результаты — куски текста из найденных файлов.
- Текущий вопрос пользователя.
- Зарезервированное место под ответ — обычно output вычитается из общего бюджета.
Например, у GPT-4o с окном 128K: если ответ ограничен max_tokens=4096, то для всего остального остаётся ~124K токенов.
| Модель | Контекст (токенов) | Эквивалент в EN-словах | Эквивалент в RU-словах |
|---|---|---|---|
| GPT-3 (2020) | 2 048 | ~1 500 | ~800 |
| GPT-3.5 Turbo (старая) | 4 096 | ~3 000 | ~1 600 |
| GPT-4 (March 2023) | 8 192 | ~6 000 | ~3 200 |
| Claude 2.1 | 200 000 | ~150 000 | ~80 000 |
| GPT-4 Turbo | 128 000 | ~96 000 | ~50 000 |
| GPT-4o | 128 000 | ~96 000 | ~50 000 |
| Claude 3.5 Sonnet | 200 000 | ~150 000 | ~80 000 |
| Gemini 1.5 Pro | 2 000 000 | ~1 500 000 | ~800 000 |
| Llama 3.1 405B | 128 000 | ~96 000 | ~50 000 |
Пример на практике
Видеомонтажёр собирает чат-бота для своей видеомастерской. Цель: бот отвечает на вопросы клиентов про услуги, цены, портфолио.
Контекст одного запроса:
- System prompt (русский, 300 слов с описанием стиля общения, услуг, тарифов): ~700 токенов.
- RAG-результаты — 5 фрагментов из базы знаний (описания услуг и кейсов, в среднем по 200 русских слов каждый): ~5 × 450 = 2250 токенов.
- История диалога — последние 6 сообщений (по 30 слов): ~6 × 70 = 420 токенов.
- Текущий вопрос клиента: ~80 токенов.
Итого вход: ~3450 токенов. Зарезервированный output: 500 токенов.
Бот работает на Claude 3.5 Sonnet (200K окно) — запас огромный. Можно подсовывать длинные документы, портфолио, гайды. Если бы стек был на старом GPT-3.5 Turbo с 4K — RAG-фрагменты пришлось бы агрессивно сжимать.
Если этот же бот работает на локальной Llama 3 8B (доступна на RTX 3060 12 GB через ComfyUI или LM Studio): окно у модели 128K, но VRAM держит ~16K при разумном расходе. На 8K контексте Llama 3 хорошо отвечает; ближе к лимиту качество падает быстрее, чем у фронтирных моделей.
Что происходит на пределе:
- Если суммарный input + output > окна → API возвращает ошибку.
- В чат-интерфейсах (ChatGPT, Claude.ai) при переполнении старые сообщения автоматически отбрасываются. Модель «забывает», что обсуждалось 20 минут назад.
- Скорость inference на длинном контексте падает: на каждом новом токене модель пересчитывает attention по всему окну (хотя KV-кэш помогает).
С чем часто путают
- Контекст и память модели — модель сама ничего не помнит между запросами. «Память» в ChatGPT и Claude — это надстройка: специальный сервис, который перед каждым запросом достаёт из базы знаний пользователя нужные факты и подсовывает их в контекст.
- Контекст и параметры — параметры это веса модели (миллиарды чисел, не меняются). Контекст — это данные, которые подаются на каждый запрос. Параметры — это «способности», контекст — это «задача».
- Контекст модели и контекст программы — у программы (Claude Code, Cursor) свой «контекст», который включает открытые файлы, недавние команды. Этот контекст потом переводится в input для LLM.
- Контекст и chat-history — chat-history это лишь одна часть контекста. В контексте также system prompt, RAG, tool definitions, файлы.
- «Длинный контекст» и «хороший reasoning» — модель может работать с 1M токенов на входе и при этом плохо рассуждать. Размер окна — это про объём, а не про качество.
Частые ошибки и заблуждения
- «Гигантский контекст = бесконечная память». Нет. Окно ограничено всегда. Большое окно (200K, 2M) просто увеличивает порог, после которого старые данные начинают вытесняться.
- Можно подсунуть весь интернет. Нельзя — самый большой современный лимит (2M токенов у Gemini) это около 1.5 миллиона английских слов или 3–4 тома «Войны и мира». Корпус Common Crawl на 100 миллиардов токенов туда не влезет.
- Модель работает одинаково по всему окну. Не совсем. На длинном контексте есть деградация в середине (lost in the middle). Ключевые инструкции лучше ставить в начало или конец.
- Чем больше окно, тем лучше. Больше окно — больше памяти, больше затрат и часто медленнее inference. Если задача укладывается в 4K — используйте модель с 4K и платите меньше. Большое окно нужно только когда реально длинные документы.
- System prompt вечен. Он передаётся при каждом запросе в API. Если у вас длинный system prompt и сотня сообщений в день — это сотня прохождений system'а через токенизатор.
Связанные термины
- Token — единица, которой измеряется окно.
- KV-cache — оптимизация в трансформерах, позволяющая не пересчитывать ключи и значения для прошлых токенов.
- RAG — техника подсовывания внешних документов в контекст вместо обучения.
- System prompt — инструкция, которая всегда лежит в начале контекста.
- Few-shot prompting — образцы в контексте для in-context learning.
- Attention — механизм трансформера, который связывает токены внутри окна.
- Lost in the middle — феномен деградации модели в середине длинного контекста.
Частые вопросы
Что произойдёт, если запрос превышает контекст? В API — ошибка «context length exceeded». В чат-интерфейсах — старые сообщения автоматически отбрасываются. В RAG-системах — слишком длинные фрагменты должны быть сжаты или разбиты заранее.
Как узнать, сколько контекста у модели?
В документации API провайдера (OpenAI, Anthropic, Google). Для open-source моделей — в model card на Hugging Face или в config.json модели (max_position_embeddings).
Что такое «эффективный контекст»? Реальная длина, на которой модель сохраняет качество. Может быть меньше заявленной. Тест: загрузить документ на 100K, спрятать факт в середине, спросить о нём. Если модель отвечает уверенно — эффективный контекст ≥ 100K. Если ошибается — реальный предел ниже.
Чем больше окно — медленнее ли работает inference? Да, по двум причинам: больше токенов нужно прочитать (linear cost) и attention растёт квадратично от длины (хотя оптимизации типа Flash Attention сглаживают). На 100K контексте GPT-4o работает заметно медленнее, чем на 4K.
Можно ли расширить контекст готовой модели? Есть техники (YaRN, LongLoRA, position interpolation), которые позволяют дообучить модель на более длинных текстах. Llama 3.1 переходила с 8K на 128K именно так. Но это требует данных и compute; обычный пользователь применить это не сможет.
Главное
Контекстное окно — это «оперативная память» LLM на один запрос. Размер измеряется в токенах; от него зависит, поместится ли в запрос длинный документ или history. Большое окно не значит «модель помнит вечно» — она помнит ровно до конца текущего запроса. И не означает автоматически качество: внутри длинного окна модели часто хуже отвечают на «серединные» вопросы. Понимая ограничения окна, проще проектировать промпты, выбирать модели под задачу и не упираться в неожиданные лимиты.