Контекстное окно: память модели в токенах
У модели нет памяти между запросами — есть только контекстное окно. Разберём, что это, почему оно ограничено и как им распоряжаться.
Контекстное окно — максимальное число токенов, которое модель способна одновременно держать «в виду»: вход и ответ вместе.
Окно — это вся «память» модели
Важно осознать: LLM не запоминает прошлые разговоры. Всё, на что она опирается прямо сейчас, — это токены в текущем контекстном окне. Системный промпт, история диалога, ваш вопрос — всё подаётся как одна последовательность токенов. То, что не поместилось в окно, для модели попросту не существует. «Память» чат-бота между сообщениями обеспечивается тем, что приложение каждый раз заново подставляет всю историю в окно.
Окно — это бюджет, общий на вход и ответ
Размер окна (например, 8192 токена) делится между входом и выходом. Чем длиннее промпт и история, тем меньше места остаётся под ответ. Посчитаем такой бюджет.
# Контекстное окно — это бюджет в ТОКЕНАХ на вход + выход вместе.
context_window = 8192 # размер окна модели (в токенах)
system_prompt = 350 # системная инструкция
chat_history = 5200 # накопленная переписка
user_question = 120 # новый вопрос
used = system_prompt + chat_history + user_question
left_for_answer = context_window - used
print(f"Окно модели: {context_window} токенов")
print(f"Системный промпт: {system_prompt}")
print(f"История диалога: {chat_history}")
print(f"Вопрос пользователя:{user_question}")
print(f"Занято всего: {used}")
print(f"Осталось на ответ: {left_for_answer} токенов")
print()
if left_for_answer < 1000:
print("Места на ответ мало -> старые сообщения придётся обрезать или сжимать.")
print("Правило: вход + выход <= окно. Длинная история 'съедает' место для ответа.")
Вывод:
Окно модели: 8192 токенов Системный промпт: 350 История диалога: 5200 Вопрос пользователя:120 Занято всего: 5670 Осталось на ответ: 2522 токенов Правило: вход + выход <= окно. Длинная история 'съедает' место для ответа.
Правило простое: вход + выход ≤ размер окна. Если история диалога разрастается, она «съедает» место под ответ, и его придётся либо укорачивать, либо обрезать старые сообщения.
Почему окно нельзя сделать бесконечным
Главная причина — стоимость внимания. В обычном self-attention каждый токен смотрит на каждый, поэтому объём вычислений растёт квадратично от длины: удвоили окно — вычислений вчетверо больше. Плюс память на хранение ключей и значений тоже растёт. Поэтому окно — это всегда инженерный компромисс между «помнить больше» и «считать дольше и дороже».
Что происходит при переполнении
Когда диалог не помещается в окно, приложения применяют разные стратегии:
| Стратегия | Что делает |
| Обрезание (truncation) | выбрасывает самые старые сообщения |
| Суммаризация | сжимает старую часть диалога в краткое резюме |
| Извлечение (RAG) | подтягивает в окно только релевантные куски из внешней базы |
Отсюда знакомый эффект: в очень длинном диалоге модель «забывает» то, что обсуждалось в начале — эти токены уже вытеснены из окна.
Окна растут, но не бесплатно
Современные модели имеют окна в десятки и сотни тысяч токенов — это огромный скачок. Но и за большим окном тянутся издержки: дороже инференс, и есть феномен «потери середины» — модель хуже использует информацию из центра очень длинного контекста, чем из начала и конца. Большое окно — мощный инструмент, но не панацея.
Итог
- Контекстное окно — единственная «память» модели: что не в окне, того для неё нет.
- Окно — общий бюджет на вход и выход: длинная история уменьшает место под ответ.
- Окно ограничено, потому что стоимость внимания растёт квадратично от длины.
- При переполнении историю обрезают, суммируют или подтягивают через RAG.