LLM API и интеграция
Что такое контекстное окно и что в него входит
Контекстное окно — это предельный объём, который модель обрабатывает за один запрос, и в него одновременно укладываются пять вещей: системный промпт, вся история диалога, вложенные документы, описания подключённых инструментов и место под будущий ответ. Вопрос на одну строку — это обычно меньше процента отправленного, остальные 99 % занимают слагаемые, которых вы руками не писали.
Термин попадается в первый же день работы с API и почти всегда понимается как «сколько текста можно вставить в поле». Из-за этого возникают два типовых сюрприза: счёт за запрос оказывается втрое выше ожидаемого, а модель «забывает» то, о чём договорились десять сообщений назад. Ниже — что такое окно, из чего оно складывается, как посчитать свой реальный расход и что происходит, когда места не хватило.
Что такое контекстное окно
Это предел объёма, который модель обрабатывает за один вызов. Считается в токенах, а не в символах и не в страницах: для русского текста один токен — примерно два-три символа, страница обычного текста занимает около тысячи токенов. Механика счёта разобрана отдельно в статье как считать токены.
Свойство, которое обычно понимают неправильно: модель не читает материал последовательно, как человек листает книгу. Она получает весь объём разом и работает с ним как с одной картиной. Ничего «прочитанного раньше» у неё нет — есть только то, что уехало в этот конкретный запрос.
Отсюда следствие: окно — это не поле ввода. К моменту, когда ваш вопрос попадает в запрос, большая часть места уже занята.
Что укладывается в окно, кроме вашего вопроса
Пять слагаемых. Четыре из них попадают в запрос без вашего участия в момент отправки.
Системный промпт. Инструкция о роли, тоне, формате и запретах. Пишется один раз, отправляется в каждом запросе. Развёрнутая инструкция на две страницы — это около двух тысяч токенов в каждом обращении, включая самое короткое.
История диалога. Все предыдущие пары «вопрос — ответ», которые вы хотите сохранить. Самая незаметная статья расхода, потому что растёт сама.
Вложенные документы. Договор, выгрузка, переписка, кусок кода. Здесь объём набирается быстрее всего: PDF на двадцать страниц — это порядка двадцати тысяч токенов, и они оплачиваются при каждом обращении к этому документу. Про извлечение текста из файлов есть отдельный разбор: как обработать PDF через API.
Описания инструментов. Если модель вызывает функции, их схемы едут в запросе целиком — названия, параметры, типы, пояснения. Четыре инструмента со сносным описанием дают около тысячи токенов. Что именно уходит на провод, разобрано в материале про вызов функций.
Место под ответ. Заявленное окно охватывает вход и выход вместе. Если вы упёрли вход под самый потолок, генерировать ответ будет некуда.
К этим пяти добавляется служебный контекст маршрута — то, что дописывает инфраструктура поверх вашего запроса. Его объём измерим и заметен: подробности в статье про то, почему prompt_tokens больше, чем вы отправили.
Почему история диалога дорожает с каждым сообщением
API не хранит состояние между вызовами. Модель не помнит прошлый запрос — иллюзию памяти создаёт ваш код, который перед отправкой склеивает всю переписку заново.
Из этого следует неприятная арифметика. Первый вопрос в диалоге стоит как один вопрос. Десятый стоит как весь предшествующий разговор плюс десятый вопрос. К тридцатому сообщению вы платите за один и тот же системный промпт тридцать раз, а за первый ответ — двадцать девять.
Именно здесь чаще всего и кончается окно у тех, кто уверен, что отправляет «две строчки».
Как посчитать, сколько у вас уходит на самом деле
Ответ короткий: не прикидывать, а смотреть в usage в ответе API. Там лежат prompt_tokens (весь вход, со всеми слагаемыми) и completion_tokens (ответ). Это единственное честное число.
Порядок на пять минут:
- Отправьте типичный для себя запрос — с обычным системным промптом, обычным файлом, обычной длины историей.
- Запишите
prompt_tokensиз ответа. - Отправьте тот же запрос без вложенного документа. Разница — цена документа.
- Повторите без истории диалога. Разница — цена памяти.
- Повторите с пустым системным промптом. Остаток и есть служебная часть плюс ваш вопрос.
Посчитать это можно на любом ключе, где видно поле 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 с числом входных и выходных токенов. Это единственный точный счётчик; прикидка по символам систематически занижает результат.