LLM API и интеграция

Что такое контекстное окно и что в него входит

Что такое контекстное окно и что в него входит

Контекстное окно — это предельный объём, который модель обрабатывает за один запрос, и в него одновременно укладываются пять вещей: системный промпт, вся история диалога, вложенные документы, описания подключённых инструментов и место под будущий ответ. Вопрос на одну строку — это обычно меньше процента отправленного, остальные 99 % занимают слагаемые, которых вы руками не писали.

Термин попадается в первый же день работы с API и почти всегда понимается как «сколько текста можно вставить в поле». Из-за этого возникают два типовых сюрприза: счёт за запрос оказывается втрое выше ожидаемого, а модель «забывает» то, о чём договорились десять сообщений назад. Ниже — что такое окно, из чего оно складывается, как посчитать свой реальный расход и что происходит, когда места не хватило.

Что такое контекстное окно

Это предел объёма, который модель обрабатывает за один вызов. Считается в токенах, а не в символах и не в страницах: для русского текста один токен — примерно два-три символа, страница обычного текста занимает около тысячи токенов. Механика счёта разобрана отдельно в статье как считать токены.

Свойство, которое обычно понимают неправильно: модель не читает материал последовательно, как человек листает книгу. Она получает весь объём разом и работает с ним как с одной картиной. Ничего «прочитанного раньше» у неё нет — есть только то, что уехало в этот конкретный запрос.

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

Что укладывается в окно, кроме вашего вопроса

Пять слагаемых. Четыре из них попадают в запрос без вашего участия в момент отправки.

Системный промпт. Инструкция о роли, тоне, формате и запретах. Пишется один раз, отправляется в каждом запросе. Развёрнутая инструкция на две страницы — это около двух тысяч токенов в каждом обращении, включая самое короткое.

История диалога. Все предыдущие пары «вопрос — ответ», которые вы хотите сохранить. Самая незаметная статья расхода, потому что растёт сама.

Вложенные документы. Договор, выгрузка, переписка, кусок кода. Здесь объём набирается быстрее всего: PDF на двадцать страниц — это порядка двадцати тысяч токенов, и они оплачиваются при каждом обращении к этому документу. Про извлечение текста из файлов есть отдельный разбор: как обработать PDF через API.

Описания инструментов. Если модель вызывает функции, их схемы едут в запросе целиком — названия, параметры, типы, пояснения. Четыре инструмента со сносным описанием дают около тысячи токенов. Что именно уходит на провод, разобрано в материале про вызов функций.

Место под ответ. Заявленное окно охватывает вход и выход вместе. Если вы упёрли вход под самый потолок, генерировать ответ будет некуда.

К этим пяти добавляется служебный контекст маршрута — то, что дописывает инфраструктура поверх вашего запроса. Его объём измерим и заметен: подробности в статье про то, почему prompt_tokens больше, чем вы отправили.

Почему история диалога дорожает с каждым сообщением

API не хранит состояние между вызовами. Модель не помнит прошлый запрос — иллюзию памяти создаёт ваш код, который перед отправкой склеивает всю переписку заново.

Из этого следует неприятная арифметика. Первый вопрос в диалоге стоит как один вопрос. Десятый стоит как весь предшествующий разговор плюс десятый вопрос. К тридцатому сообщению вы платите за один и тот же системный промпт тридцать раз, а за первый ответ — двадцать девять.

Именно здесь чаще всего и кончается окно у тех, кто уверен, что отправляет «две строчки».

Как посчитать, сколько у вас уходит на самом деле

Ответ короткий: не прикидывать, а смотреть в usage в ответе API. Там лежат prompt_tokens (весь вход, со всеми слагаемыми) и completion_tokens (ответ). Это единственное честное число.

Порядок на пять минут:

  1. Отправьте типичный для себя запрос — с обычным системным промптом, обычным файлом, обычной длины историей.
  2. Запишите prompt_tokens из ответа.
  3. Отправьте тот же запрос без вложенного документа. Разница — цена документа.
  4. Повторите без истории диалога. Разница — цена памяти.
  5. Повторите с пустым системным промптом. Остаток и есть служебная часть плюс ваш вопрос.

Посчитать это можно на любом ключе, где видно поле usage. В KeyDealer один ключ открывает весь каталог — 57 позиций в живой выдаче, 44 из них доступны, — и число входных токенов возвращается в каждом ответе. Поэтому разобрать состав своего окна получается на той самой модели, на которой вы потом работаете, без отдельного стенда и без повторной интеграции.

Пример разбора: куда делись 23 тысячи токенов

Условный, но типичный расклад: юрист просит модель сверить пункт договора с внутренним регламентом, десятое сообщение в диалоге.

Что лежит в окнеТокеновКто это положил
Системный промпт900вы, один раз в коде
История диалога, 9 сообщений6 400накопилось само
Вложенный договор, 12 страниц13 000вы, файлом
Описания четырёх инструментов1 200ваша обвязка
Служебный контекст маршрута2 000инфраструктура
Ваш вопрос40вы
Итого на входе23 540

Вопрос пользователя — 40 токенов из 23 540, то есть 0,17 %. Всё остальное оплачивается вместе с ним при каждом нажатии «отправить».

Что происходит при переполнении окна

Три разных сценария, и путать их дорого.

Прямая работа с API. Сервер возвращает ошибку о превышении длины запроса, ответа нет, запрос не тарифицируется как успешный. Это самый честный вариант: вы сразу видите проблему. Разбор типовых кодов ошибок — в статье ошибки API нейросетей.

Готовый чат-интерфейс. Вместо ошибки обычно срабатывает обрезка: из истории выбрасывается начало, диалог продолжается. Модель при этом теряет ранние договорённости и начинает противоречить себе — а вы не получаете никакого сигнала о том, что это произошло.

Обвязка со сжатием. Часть сборок при переполнении сворачивают историю в сводку и продолжают с ней. Приём рабочий, но у него есть собственный класс проблем: сводка — это текст, сгенерированный моделью, и относиться к нему как к доверенной инструкции нельзя. Подробно: сводка сжатия — это недоверенный ввод.

Отдельный случай — когда вход поместился, а ответ нет. Генерация обрывается на середине предложения. Выглядит как сбой модели, а на деле под выход просто не осталось места.

Почему «контекст 1 млн токенов» не значит «кладите миллион»

Заявленное окно говорит ровно одно: при каком объёме запрос будет отклонён. Оно ничего не обещает про качество по дороге к этому пределу.

Практически это значит, что большое окно стоит считать запасом прочности, а не приглашением. Ответы становятся поверхностными задолго до предела, и происходит это по причинам, которые разобраны в отдельной статье — почему модель тупеет на больших документах.

Вопрос «а сколько тогда реально нужно» — тоже отдельный, с ориентирами по типам задач: сколько контекста нужно на деле.

Чем окно отличается от памяти

Окно живёт ровно один запрос. Память — это то, что вы храните у себя между запросами и подставляете в окно по необходимости.

Разница практическая. База знаний компании в окно не влезет никогда и влезать не должна: из неё достают три-пять нужных фрагментов и кладут только их. Это отдельная конструкция со своим устройством — поиск по своей базе.

Если документ не влезает целиком, его делят на части, и делают это не произвольно: как разбить документ на части.

Сколько это стоит

Само окно не тарифицируется — вы платите за фактически отправленные токены. Поэтому цена «одного вопроса» зависит не от вопроса, а от того, сколько вокруг него уехало.

Тот же пример на 23 540 входных токенов: на модели за 1 ₽ за миллион это доли копейки, на модели за 30 ₽ — уже заметная сумма при сотнях обращений в день. Разрыв между нижней и верхней полкой каталога — десятки раз, и на длинном контексте он умножается на объём.

Проверять состав окна удобнее на дешёвой позиции: 3 ₽ или 5 ₽ за миллион токенов, а пять текстовых позиций с нулевой ставкой открываются после первого платного пополнения и дальше не тарифицируются. Отдельно стоит знать про вендорские пороги: у части моделей ставка растёт после определённой длины запроса, причём пересчитывается весь запрос — механика разобрана в статье про двухуровневые тарифы.

Частые ошибки, из-за которых окно кончается раньше времени

Пересылать весь документ при каждом уточняющем вопросе. Если вопросов к договору десять, договор уехал десять раз.

Копить историю без ограничения. Диалог, который никто не подрезает, рано или поздно упрётся в потолок — и обрежется не там, где вам нужно.

Держать в системном промпте то, что нужно раз в сто запросов. Редкие инструкции дешевле добавлять по условию, чем возить всегда.

Подключать инструменты «на всякий случай». Двадцать описаний функций — это несколько тысяч токенов в каждом запросе и заодно шум для модели.

Считать по символам. Прикидка «600 тысяч знаков, значит поместится» регулярно ошибается в полтора раза, особенно на русском тексте и на коде.

Чего мы не утверждаем

Мы упрощаем. Внутреннее устройство внимания сложнее описанного; здесь дана рабочая модель понимания, достаточная для планирования расхода.

Числа в примере — иллюстрация, а не измерение. Свой расклад надо снять с usage на своих данных, он будет другим.

Скидку за кэш промптов не обещаем. В живой выдаче каталога prompt_cache.status у текстовых позиций стоит unsupported — это значит «не подтверждено», а не «точно не работает у вендора».

Что нужно, чтобы попробовать

Ключ заводится за минуту на keydealer.ru/login — почта и пароль, без документов и без зарубежной карты. Оплата российской картой в рублях, один ключ на весь каталог.

Ставки и статусы видны в GET /v1/models без ключа и без регистрации. Чтобы разобрать своё окно по слагаемым, хватит пяти запросов и пяти минут — по шагам из раздела про подсчёт.

Что держать в голове

Окно — это общий объём на один запрос, а не место под ваш текст. Ваш вопрос в нём занимает последние проценты, всё остальное заняли инструкция, история, файлы и описания инструментов.

История диалога растёт сама и дорожает с каждым сообщением, потому что API ничего не помнит и получает переписку заново. Это главный источник неожиданных счетов у новичков.

Заявленный размер окна — предел, а не режим работы. Проверять стоит не то, помещается ли материал, а то, отвечает ли модель на нём так же точно, как на коротком фрагменте.

Как мы проверяем факты и что храним из запросов — на странице о проекте и в llms.txt. Посчитать своё окно: keydealer.ru/login.

Частые вопросы

Что такое контекстное окно простыми словами?

Предельный объём текста, который модель держит перед глазами в одном запросе. Туда входит всё сразу: инструкция, история переписки, вложенные файлы, описания инструментов и место под ответ.

Входит ли ответ модели в контекстное окно?

Да. Заявленный размер охватывает и вход, и генерируемый выход. Если под ответ места не осталось, он оборвётся на середине фразы, а не переедет в следующий запрос.

Помнит ли API прошлый запрос?

Нет. Историю диалога каждый раз отправляет ваш код, целиком и заново. Поэтому десятое сообщение в переписке обходится дороже первого при том же вопросе.

Что будет, если окно переполнить?

При прямой работе с API сервер вернёт ошибку о превышении длины запроса. В готовых чат-интерфейсах вместо ошибки обычно выбрасывается начало переписки, и модель забывает ранние договорённости.

Миллион токенов — это всегда лучше?

Нет. Окно задаёт предел, а не рабочий режим. Качество ответов падает заметно раньше предела, а лишний текст в запросе мешает модели, даже когда формально помещается.

Как узнать, сколько токенов ушло на самом деле?

В ответе API есть блок usage с числом входных и выходных токенов. Это единственный точный счётчик; прикидка по символам систематически занижает результат.

Источники