Контекстное окно: память модели в токенах

У модели нет памяти между запросами — есть только контекстное окно. Разберём, что это, почему оно ограничено и как им распоряжаться.

Контекстное окно — максимальное число токенов, которое модель способна одновременно держать «в виду»: вход и ответ вместе.

Окно — это вся «память» модели

Важно осознать: 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.
Проверьте себя
1. Что такое контекстное окно?
AРазмер экрана чата
BМаксимальное число токенов, которое модель держит одновременно (вход и ответ вместе)
CОбъём жёсткого диска
DЧисло параметров модели
2. Почему контекстное окно нельзя сделать бесконечным?
AИз-за ограничений словаря
BСтоимость внимания растёт квадратично от длины — дольше и дороже считать
CТак требует токенизатор
DМодель не умеет читать длинный текст
3. Почему в длинном диалоге модель «забывает» начало?
AОна специально удаляет данные
BСтарые токены вытесняются из окна, и для модели их больше нет
CСрабатывает защита от перегрева
DЭто ошибка токенизации
Поддержать проект