Вопрос, который приходит в поддержку чаще прочих: «у модели окно на сто тысяч токенов, я отправил документ на десять тысяч, а ответ оборвался на середине предложения — почему?»
#Короткий ответ
Потому что окно контекста и длина ответа — разные ограничения. Оборвался ответ, а не контекст: модель упёрлась в потолок генерации, который задаётся отдельным параметром и по умолчанию бывает небольшим. Окно при этом было израсходовано на несколько процентов.
Ограничений на самом деле три, и все три дают разные симптомы:
- окно контекста — сколько всего помещается в один вызов, вход и выход вместе;
- максимум входа — сколько принимается за один запрос;
- максимум вывода — сколько модель сгенерирует, прежде чем остановится.
#Как это устроено
Окно — это общий объём, в котором должен уместиться весь вызов. Вход и выход делят его между собой: чем больше отправили, тем меньше места остаётся под ответ. Именно поэтому «окно на миллион токенов» не означает «ответ на миллион токенов» — определение окна разобрано в справке про то, что такое контекстное окно.
Максимум входа у части провайдеров совпадает с окном, у части задан отдельно и меньше. Он отсекает запрос целиком: ответа не будет вовсе, придёт ошибка.
Максимум вывода — это параметр запроса. У большинства провайдеров у него есть значение по умолчанию, и оно обычно скромное. Клиент, который его не задаёт, получает это умолчание, и длинные ответы обрываются.
Отдельная ловушка — модели с рассуждением: их внутренние размышления расходуют тот же бюджет вывода, что и сам ответ. Модель может «продумать» задачу и упереться в потолок до того, как напишет хоть строчку видимого текста.
#Таблица: три лимита и их симптомы
| Лимит | Что ограничивает | Симптом превышения |
|---|---|---|
| Окно контекста | вход и выход суммарно | ошибка о превышении длины либо обрезка истории |
| Максимум входа | размер одного запроса | ошибка до генерации, ответа нет вовсе |
| Максимум вывода | длину ответа | ответ обрывается на середине фразы |
Различить их можно за одну проверку: если текст пришёл и оборвался — это вывод; если не пришёл ничего и вернулась ошибка — это вход или окно. Ошибка о слишком большом запросе, кстати, не имеет отношения к превышению частоты обращений: у той свои признаки, разобранные в статье про ошибку 429 и лимиты запросов.
#Как считать бюджет промпта
Бюджет считается от окна назад. Числа условные, подставьте свои из документации провайдера.
окно контекста 32 000
− резерв под ответ − 1 500
= 30 500 доступно на вход
из них:
системная инструкция 700
история диалога 2 000
────────────────────────────────────────
остаётся на документы и память 27 800
Три правила, которые следуют из этого расчёта:
- Резерв под ответ выделяется первым, а не остатком. Иначе длинный вход съедает место, и модель обрывается, хотя формально в окно всё поместилось.
- Системная инструкция и история — постоянные расходы. Они отправляются с каждым вызовом, и их размер стоит держать под контролем.
- Подмешиваемая память — переменная часть, и она растёт сама. Ограничение на число фрагментов нужно задать заранее, иначе через полгода оно упрётся в окно без вашего участия.
Тот же расчёт напрямую определяет ваш счёт: каждый входной токен оплачивается. Метод перевода токенов в деньги — в материале про расчёт стоимости запросов к модели.
#Что из этого следует на практике
Всегда задавайте максимум вывода явно. Умолчание провайдера вам не подходит по определению: он не знает, какой длины ответы вам нужны.
Не заполняйте окно до краёв. Кроме риска обрыва есть эффект качества: работа с материалом в середине длинного контекста обычно хуже, чем с началом и концом. Насколько заявленное окно соответствует реально удерживаемому, разобрано в материале про реальный и заявленный контекст модели.
Считайте бюджет до отправки, а не после ошибки. Приложение, которое обрезает историю самостоятельно, ведёт себя предсказуемее того, что падает на границе.
Проверяйте лимиты при смене модели. Они относятся к модели, а не к провайдеру: у соседней позиции того же каталога окно может быть в несколько раз меньше.
#Где интуиция подводит
«Ответ оборвался — значит, кончился контекст». Почти всегда наоборот: кончился бюджет вывода, а окно осталось почти пустым.
«Большое окно бесплатно, я его просто не буду заполнять». Верно. Ошибка появляется на шаг позже: когда приложение начинает заполнять окно автоматически, подмешивая всё, что нашло.
«Максимум вывода можно поставить максимальным на всякий случай». Можно, но это снимает предохранитель от многословных ответов и от разросшихся размышлений у моделей с рассуждением. Значение стоит выбирать по реальной длине нужных ответов.
«Окно у модели одно и известно». Провайдер может предоставлять модель с урезанным окном относительно заявленного вендором. Смотреть нужно документацию той площадки, где вы работаете, а не описание модели вообще.
#Частые вопросы
#Почему один и тот же документ проходит у одного провайдера и не проходит у другого?
Потому что у них разный максимум входа для одной и той же модели, а иногда и разное окно. Хостинг вправе ограничить размер запроса ниже теоретического предела модели — проверяйте документацию конкретной площадки.
#Как узнать, сколько токенов в моём запросе, до отправки?
У большинства провайдеров есть счётчик токенов в документации или отдельный метод API, а в кабинете виден фактический расход по каждому запросу. Для русского текста количество токенов заметно выше, чем для английского того же смысла.
#Что делать, если документ не помещается в окно?
Разбивать на части и обрабатывать по частям, а затем сводить результаты. Это не обходной манёвр, а нормальный приём: он работает даже там, где документ помещается, потому что качество на коротком фрагменте обычно выше.
#Считается ли ответ модели частью контекста в следующем вопросе?
Да, если приложение отправляет историю диалога — а оно почти всегда её отправляет. Поэтому длинный разговор дорожает и приближается к границе окна сам по себе, даже если каждое отдельное сообщение короткое.
#Что ограничивает сильнее — окно или деньги?
Обычно деньги: упереться в окно на бытовых задачах трудно, а платить за избыточный контекст начинаешь с первого дня. Общий обзор провайдеров и их ограничений — в статье о том, где взять ключ к языковой модели.