Ограничения скорости LLM: токены в минуту, запросы в минуту и то, что происходит, когда вы достигаете этих ограничений

API-интерфейсы языковой модели ограничивают трафик одновременно 2 способами: сколько запросов отправляется в минуту (RPM) и сколько токенов используется в минуту (TPM). Вы можете оставаться значительно ниже лимита запросов и всё равно столкнуться с троттлингом, так как несколько длинных промптов израсходовали ваш бюджет токенов. Когда вы достигнете любого ограничения, API отвечает сообщением 429 Too Many Requests, и приложение должно ждать.

Как OpenAI, Azure OpenAI и Anthropic подсчитывают

Provider Что ограничено Что нужно знать
OpenAI RPM, запросы в день, TPM, токены в день и многое другое, для каждой организации и проекта, для каждой модели Вы достигнете того лимита, который закончится первым. Для лимита токенов запрос считается по большему из двух значений: max_tokens или оценки на основе его символов. Число неудачных запросов тоже.
Azure OpenAI TPM, назначенный каждому развертыванию, а также ограничение RPM, заданное в пропорции к нему RPM проверяется в окнах длительностью 1 или 10 секунд, поэтому всплеск получает 429, даже если общий показатель за минуту в норме. Оценка токена включает в себя max_tokens.
Anthropic RPM, входные токены в минуту (ITPM) и выходные токены в минуту (OTPM) для каждой модели Лимит постоянно пополняется, а 60 RPM может применяться как 1 запрос в секунду. Для большинства моделей кэшированные токены входных данных не учитываются в ITPM, и max_tokens не учитывается в OTPM.

Если установить max_tokens на 4 000 и получаете 200 токенов обратно, OpenAI и Azure OpenAI по-прежнему подсчитывают 4 000 по отношению к вашему ограничению. Вот как можно получить 429s, при том что метрики использования кажутся значительно ниже вашего лимита.

Что означает 429 для каждого поставщика

Не каждая ошибка 429 исчезает, если подождать.

Provider Подождите и повторите попытку Остановитесь и сообщите кому-нибудь
OpenAI 429 для запросов или токенов, 429 slow_down (ваш трафик вырос слишком быстро, даже в пределах ограничений), и 503 server_is_overloaded. Подождите Retry-After, пока он не появится. 429 с credit_balance_exhausted, organization_spend_limit_exceededproject_spend_limit_exceededили organization_usage_limit_exceeded в error.code. Повторная попытка не восстановит доступ.
Azure OpenAI 429 для TPM или RPM развертывания, из-за ограничений пропускной способности системы или для временного уменьшения лимита запросов. Подождите retry-after-ms. Постоянные ошибки 429 в производственной среде, хотя вы не превышаете одобренную квоту. Проверьте выделение TPM для развертывания, а затем откройте обращение в службу поддержки.
Anthropic 429 rate_limit_error с заголовком retry-after, включая ограничения скорости после резкого роста использования, и 529 overloaded_error. 429 за ежемесячный лимит расходов. Он не retry-after имеет заголовка, enforced_spend_limit_reached — error.details.error_code, и он продолжает завершаться ошибкой до возобновления доступа.

Как работать с лимитами запросов LLM

  1. Проверьте, какой 429 вы получили. Ошибки выставления счетов, расходов и квот требуют вмешательства человека, а не повторных попыток.
  2. Подождите столько, сколько требует API. OpenAI и Anthropic отправляют retry-after за секунды. Azure OpenAI отправляет retry-after-ms за миллисекунды. При отсутствии указаний используйте экспоненциальное увеличение интервала со случайным джиттером и ограничьте и число попыток, и общее время.
  3. Узнайте, что уже делает ваш пакет SDK. Python SDK OpenAI и Anthropic по умолчанию повторяют попытку 2 раза при ошибках подключения и ответах 429, 408, 409 и 5xx. Если вы добавите собственный цикл повторных попыток, отключите повторные попытки пакета SDK, например в max_retries=0 Python, как рекомендует Azure OpenAI, иначе число попыток увеличится.
  4. Сократите самое важное. В OpenAI и Azure OpenAI установите значение max_tokens близко к ожидаемому размеру ответа. В Anthropic кэшируйте повторяющееся содержимое, например системные инструкции.
  5. Постепенно увеличивайте. Резкий скачок трафика приводит к срабатыванию лимитов частоты запросов OpenAI slow_down и Anthropic даже в пределах ваших ограничений. OpenAI предполагает, что после достижения 1 миллиона входных токенов в минуту вы растете не более чем на 50% каждые 15 минут.
  6. Не воспроизводите поток, который вы уже обработали. Ошибка после запуска потока может поступать в качестве события потока, и OpenAI не советует автоматически повторять запрос после использования выходных данных.
  7. Сообщите пользователю, когда запрос застопорится на 429, вместо показа спиннера.

Как проверить, что ваше приложение обрабатывает ограничения скорости LLM

Approach Что вы найдете То, что вы пропустили
Замокайте клиент SDK в тестах или позвольте агенту для написания кода написать мок Выполняется ли ветка обработки ошибок Реальные коды состояния, коды ошибок и заголовки поставщика, а также собственные повторные запросы SDK. Приложению также требуется переключатель только для тестирования, чтобы получить доступ к mock-серверу.
Вызывайте реальный API до тех пор, пока он не начнет ограничивать ваши запросы Реальное поведение Вы платите за каждый токен, и вы не можете по своему усмотрению активировать slow_down, перегрузку или ограничение расходов
Перехватывайте реальный трафик приложения и возвращайте ошибки поставщика или ограничивайте по токенам, которые использует приложение. Реальные URL-адреса, политика повторных попыток пакета SDK и тела ошибок поставщика с выбранным вами ограничением Ваш код в изоляции. Оставьте для этого модульные тесты.

Попробуйте в вашем приложении

Dev Proxy перехватывает запросы приложения к API языковой модели и возвращает собственные ошибки поставщика, а ваше приложение продолжает вызывать реальный URL-адрес. Для OpenAI скачайте preset и запустите прокси-сервер разработки с ним:

devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"

Предустановка https://api.openai.com/* приводит к сбою 90% запросов к rate_limit_exceeded со случайной ошибкой: slow_down для TPM или RPM, credit_balance_exhausted, server_is_overloaded или 503 openai-throttling. Предустановка anthropic-throttling выполняет то же самое для https://api.anthropic.com/* с RPM, входным токеном, выходным токеном, а также ошибками ускорения 429s и 529 overloaded_error. Обе предустановки включают RetryAfterPlugin, который сообщает, что приложение повторно вызывает API до истечения времени ожидания для ответа 429 retry-after. Он не проверяет ответы 503 и 529.

Для регулирования токенов, фактически используемых приложением, используйте LanguageModelRateLimitingPlugin. Он подсчитывает токены запроса и завершения, о которых сообщает каждый ответ, и возвращает 429 с retry-after, когда приложение превышает установленные вами лимиты. Он работает с API, совместимыми с OpenAI, включая Azure OpenAI и локальные модели:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/rc.schema.json",
  "plugins": [
    {
      "name": "LanguageModelRateLimitingPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "languageModelRateLimitingPlugin"
    }
  ],
  "urlsToWatch": [
    "https://api.openai.com/*",
    "https://*.openai.azure.com/openai/deployments/*/chat/completions*"
  ],
  "languageModelRateLimitingPlugin": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.3.1/languagemodelratelimitingplugin.schema.json",
    "promptTokenLimit": 1000,
    "completionTokenLimit": 500,
    "resetTimeWindowSeconds": 60
  }
}

Плагин не воспроизводит max_tokens оценку. Тело ответа 429 по умолчанию использует код insufficient_quota. Чтобы вернуть текст ошибки, который приложение ожидает при ограничении скорости, задайте whenLimitExceeded значение Custom и укажите в customResponseFile собственный ответ. Чтобы установить Dev Proxy, см. Настройка Dev Proxy.

Дальнейшие действия

См. также