Технологии

Лимиты контекста и вывода у провайдеров

Окно контекста, максимум входа и максимум ответа — три разных ограничения, которые новички считают одним. Разбираем симптомы каждого и учимся считать бюджет промпта.

Вопрос, который приходит в поддержку чаще прочих: «у модели окно на сто тысяч токенов, я отправил документ на десять тысяч, а ответ оборвался на середине предложения — почему?»

#Короткий ответ

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

Ограничений на самом деле три, и все три дают разные симптомы:

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

#Как это устроено

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

Максимум входа у части провайдеров совпадает с окном, у части задан отдельно и меньше. Он отсекает запрос целиком: ответа не будет вовсе, придёт ошибка.

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

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

#Таблица: три лимита и их симптомы

Лимит Что ограничивает Симптом превышения
Окно контекста вход и выход суммарно ошибка о превышении длины либо обрезка истории
Максимум входа размер одного запроса ошибка до генерации, ответа нет вовсе
Максимум вывода длину ответа ответ обрывается на середине фразы

Различить их можно за одну проверку: если текст пришёл и оборвался — это вывод; если не пришёл ничего и вернулась ошибка — это вход или окно. Ошибка о слишком большом запросе, кстати, не имеет отношения к превышению частоты обращений: у той свои признаки, разобранные в статье про ошибку 429 и лимиты запросов.

#Как считать бюджет промпта

Бюджет считается от окна назад. Числа условные, подставьте свои из документации провайдера.

окно контекста                       32 000
− резерв под ответ                  −  1 500
                                   = 30 500  доступно на вход

из них:
  системная инструкция                  700
  история диалога                     2 000
  ────────────────────────────────────────
  остаётся на документы и память     27 800

Три правила, которые следуют из этого расчёта:

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

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

#Что из этого следует на практике

Всегда задавайте максимум вывода явно. Умолчание провайдера вам не подходит по определению: он не знает, какой длины ответы вам нужны.

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

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

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

#Где интуиция подводит

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

«Большое окно бесплатно, я его просто не буду заполнять». Верно. Ошибка появляется на шаг позже: когда приложение начинает заполнять окно автоматически, подмешивая всё, что нашло.

«Максимум вывода можно поставить максимальным на всякий случай». Можно, но это снимает предохранитель от многословных ответов и от разросшихся размышлений у моделей с рассуждением. Значение стоит выбирать по реальной длине нужных ответов.

«Окно у модели одно и известно». Провайдер может предоставлять модель с урезанным окном относительно заявленного вендором. Смотреть нужно документацию той площадки, где вы работаете, а не описание модели вообще.

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

#Почему один и тот же документ проходит у одного провайдера и не проходит у другого?

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

#Как узнать, сколько токенов в моём запросе, до отправки?

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

#Что делать, если документ не помещается в окно?

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

#Считается ли ответ модели частью контекста в следующем вопросе?

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

#Что ограничивает сильнее — окно или деньги?

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

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт