LLM 속도 제한: 분당 토큰, 분당 요청 및 한도에 도달하면 어떤 일이 발생하는지

언어 모델 API는 트래픽을 동시에 두 가지 방식으로 제한합니다. 즉, 분당 전송하는 요청 수(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을 계산합니다. 그래서 사용 메트릭이 할당량보다 훨씬 낮게 표시되는 경우에도 429를 얻을 수 있습니다.

각 공급자에 대해 429의 의미

기다린다고 해서 모든 429가 사라지는 것은 아닙니다.

Provider 대기 및 다시 시도 멈추고 다른 사람에게 알리세요.
OpenAI 요청 또는 토큰에 대해 429, 429 slow_down(한도 내에서도 트래픽이 너무 빠르게 증가함) 및 503 server_is_overloaded. Retry-After이(가) 있는 경우 기다립니다. 429 with credit_balance_exhausted, organization_spend_limit_exceeded, project_spend_limit_exceeded 또는 organization_usage_limit_exceeded in error.code에서. 다시 시도해도 액세스 권한이 복원되지 않습니다.
Azure OpenAI 배포의 TPM 또는 RPM, 시스템 용량 또는 속도 제한의 일시적 감소로 인해 429가 발생합니다. retry-after-ms을 기다립니다. 승인된 할당량 이하인데도 프로덕션 환경에서 429 오류가 지속적으로 발생합니다. 배포의 TPM 할당을 확인한 다음 지원 요청을 엽니다.
Anthropic 사용량이 급격히 증가한 후 적용되는 가속 제한을 포함한 retry-after 헤더와 함께 429 rate_limit_error 응답 및 529 overloaded_error. 월간 지출 한도의 경우 429 retry-after 헤더가 없으며, error.details.error_code는 enforced_spend_limit_reached이고 액세스가 다시 시작될 때까지 계속 실패합니다.

LLM 속도 제한을 처리하는 방법

  1. 어떤 429가 발생했는지 확인하십시오. 청구, 지출 및 할당량 오류에는 재시도가 아닌 사람이 필요합니다.
  2. API가 요청하는 만큼 기다리세요. OpenAI와 Anthropic은 몇 초 안에 retry-after를 전송합니다. Azure OpenAI는 밀리초 내에 retry-after-ms를 보냅니다. 힌트가 없으면 임의 지터로 대기 시간을 지수적으로 늘리고 시도 횟수와 총 시간을 모두 제한합니다.
  3. SDK가 이미 수행하는 작업을 파악합니다. OpenAI 및 Anthropic Python SDK는 연결 오류와 408, 409, 429, 및 5xx 응답에 대해 기본적으로 2번 다시 시도합니다. 자체 재시도 루프를 추가하는 경우 Python에서는 와 같이 SDK의 재시도를 끄세요. max_retries=0이며, 그렇지 않으면 시도 횟수가 늘어납니다.
  4. 중요한 항목만 축소하세요. OpenAI 및 Azure OpenAI에서 max_tokens를 예상한 응답 크기에 가깝게 설정합니다. Anthropic에서는 시스템 지침과 같은 반복된 콘텐츠를 캐시합니다.
  5. 점진적으로 늘리세요. 트래픽이 급격히 증가하면 제한 내에서도 OpenAI의 slow_down 및 Anthropic의 가속 제한이 트리거됩니다. OpenAI는 분당 100만 개의 입력 토큰에 도달하면 15분마다 50개 이하의% 증가한다고 제안합니다.
  6. 이미 읽은 스트림을 재생하지 마세요. 스트림이 시작된 후 오류가 스트림 이벤트로 도착할 수 있으며, OpenAI는 권고합니다 출력을 소비한 후에는 요청을 자동으로 재생하지 말 것을.
  7. 스피너를 표시하는 대신 요청이 429 오류로 멈추면 사용자에게 알리세요.

앱이 LLM 속도 제한을 처리하는지 테스트하는 방법

Approach 찾은 내용 당신이 놓친 것
테스트에서 SDK 클라이언트를 모의하거나 코딩 에이전트가 모의 개체를 작성하도록 허용하세요. 오류 분기 실행 여부 공급자의 실제 상태 코드, 오류 코드 및 헤더, 그리고 SDK 자체의 재시도. 또한 모의 환경에 도달하려면 앱에 테스트 전용 스위치가 필요합니다.
제한이 걸릴 때까지 실제 API를 호출하세요 실제 동작 모든 토큰에 대해 비용을 지불하며, slow_down, 오버로드 또는 지출 한도를 원할 때 트리거할 수 없습니다.
앱의 실제 트래픽을 가로채 공급자의 오류를 반환하거나 앱에서 사용하는 토큰을 기준으로 속도를 제한합니다. 원하는 한도를 설정하여 실제 URL, SDK의 재시도 정책 및 공급자의 오류 본문## 독립된 상태의 코드입니다. 그건 단위 테스트로 처리하세요.

앱에서 시도해 보기

Dev Proxy는 앱이 실제 URL을 계속 호출하는 동안 언어 모델 API에 대한 요청을 가로채고 공급자 자체 오류를 반환합니다. OpenAI의 경우 사전 설정을 다운로드한 다음 Dev Proxy를 시작하세요.

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

openai-throttling 사전 설정은 rate_limit_exceeded에 대한 요청의 90%에서 TPM 또는 RPM의 경우 slow_down, credit_balance_exhausted, server_is_overloaded 또는 503 https://api.openai.com/*와 같은 임의의 오류로 실패합니다. anthropic-throttling 사전 설정은 RPM, 입력 토큰, 출력 토큰, 가속 429 및 529 https://api.anthropic.com/*에 대해 overloaded_error에도 동일하게 적용됩니다. 두 사전 설정 모두 RetryAfterPlugin을 포함하며, 이는 앱이 429의 대기 시간이 끝나기 전에 API를 다시 호출할 retry-after 때를 알려줍니다. 503 및 529 응답을 확인하지 않습니다.

앱에서 실제로 사용하는 토큰을 제한하려면 LanguageModelRateLimitingPlugin을 사용하세요. 각 응답이 보고하는 프롬프트 및 완료 토큰을 계산하고 앱이 설정한 제한을 초과할 때 429와 함께 retry-after를 반환합니다. Azure OpenAI 및 로컬 모델을 포함하여 OpenAI 호환 API와 함께 작동합니다.

{
  "$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 설정을 참조하세요.

다음 단계

또한, 다음을 참조하세요.