Limiti di frequenza LLM: token al minuto, richieste al minuto e cosa accade quando vengono raggiunti

Le API del modello linguistico limitano il traffico in due modi contemporaneamente: il numero di richieste inviate al minuto (RPM) e il numero di token usati al minuto (TPM). È possibile rimanere ben al di sotto del limite di richieste ed essere comunque soggetto a throttling perché alcuni prompt lunghi hanno usato il budget dei token. Quando si raggiunge uno dei due limiti, l'API risponde con 429 Too Many Requests e l'app deve attendere.

Come OpenAI, Azure OpenAI e Anthropic conteggiano

Provider Cosa è limitato Cosa sapere
OpenAI RPM, richieste al giorno, TPM, token al giorno e altro, per organizzazione e progetto, per modello Si raggiunge il limite che viene raggiunto per primo. Per il limite di token, una richiesta viene conteggiata come il valore maggiore tra max_tokens e una stima in base ai relativi caratteri. Anche il numero di richieste non riuscite.
Azure OpenAI TPM che assegni a ogni deployment, oltre a un limite RPM impostato in proporzione ad esso RPM viene controllato su finestre di 1 o 10 secondi, quindi un burst ottiene un 429 anche quando il totale al minuto è corretto. La stima del token include max_tokens.
Anthropic RPM, token di input al minuto (ITPM) e token di output al minuto (OTPM), per modello La capacità si ricarica continuamente e 60 RPM potrebbero essere applicati come 1 richiesta al secondo. Per la maggior parte dei modelli, i token di input memorizzati nella cache non vengono conteggiati ai fini di ITPM e max_tokens i token di output memorizzati nella cache non vengono conteggiati ai fini di OTPM.

Se si imposta max_tokens su 4.000 e si ottengono 200 token, OpenAI e Azure OpenAI conteggiano comunque i 4.000 rispetto al limite. Questo è il modo in cui è possibile ottenere errori 429 mentre le metriche di utilizzo sembrano ben al di sotto della quota.

Cosa significa un errore 429 per ciascun provider

Non ogni 429 va via se aspetti.

Provider Attendere e riprovare Fermati e dillo a qualcuno
OpenAI 429 per le richieste o i token, 429 slow_down (il traffico è cresciuto troppo velocemente, anche se eri entro i tuoi limiti) e 503 server_is_overloaded. Attendi Retry-After quando è presente. 429 con credit_balance_exhausted, organization_spend_limit_exceeded, project_spend_limit_exceededo organization_usage_limit_exceeded in error.code. I tentativi non ripristinano l'accesso.
Azure OpenAI 429 per il TPM o RPM della distribuzione, per la capacità di sistema o per una riduzione temporanea del limite di velocità. Attendere retry-after-ms. Sono stati sostenuti 429s nell'ambiente di produzione, mentre si è al di sotto della quota approvata. Controllare l'allocazione TPM dell'implementazione, quindi aprire una richiesta di supporto.
Anthropic 429 rate_limit_error con un'intestazione retry-after , inclusi i limiti di accelerazione dopo un forte aumento dell'utilizzo e 529 overloaded_error. 429 per il limite di spesa mensile. Non dispone di error.details.error_code intestazione, enforced_spend_limit_reached è retry-after, e continua a non riuscire finché l'accesso non riprende.

Come gestire i limiti di frequenza LLM

  1. Controlla quale 429 hai ottenuto. Gli errori di fatturazione, spesa e quota richiedono una persona, non un nuovo tentativo.
  2. Attendere finché l'API richiede. OpenAI e Anthropic inviano retry-after in secondi. Azure OpenAI invia retry-after-ms in millisecondi. Senza un suggerimento, tornare in modo esponenziale con instabilità casuale e limitare sia il numero di tentativi che il tempo totale.
  3. Sapere cosa fa già l'SDK. Gli SDK Python di OpenAI e Anthropic ritentano per impostazione predefinita 2 volte gli errori di connessione e le risposte 408, 409, 429 e 5xx. Se si aggiunge un ciclo di ripetizione dei tentativi personalizzato, disattivare i tentativi dell'SDK, ad esempio con max_retries=0 in Python, come raccomanda Azure OpenAI, o i tentativi si moltiplicano.
  4. Riduci ciò che conta. In OpenAI e Azure OpenAI impostare max_tokens vicino alle dimensioni della risposta previste. In Anthropic memorizzare nella cache il contenuto ripetuto, ad esempio le istruzioni di sistema.
  5. Aumenta progressivamente. Un forte salto nel traffico attiva i limiti di accelerazione di slow_down OpenAI e Anthropic, anche entro i limiti. OpenAI suggerisce che una volta raggiunto 1 milione di token di input al minuto, si aumenta di non più di 50% ogni 15 minuti.
  6. Non riprodurre un flusso già letto. Un errore dopo l'avvio di un flusso può arrivare come evento di flusso e OpenAI sconsiglia di riprodurre automaticamente una richiesta dopo l'utilizzo dell'output.
  7. Indicare all'utente quando una richiesta si blocca su un controllo 429, anziché visualizzare una selezione.

Come testare che l'app gestisca i limiti di frequenza LLM

Avvicinarsi Cosa trovi Quello che ti manca
Simula il client SDK nei test oppure lascia che l'agente di coding scriva il mock Se il ramo di errore viene eseguito Codici di stato, codici di errore e intestazioni reali del provider e i tentativi automatici del tuo SDK. L'app richiede anche uno switch solo di test per raggiungere il mock.
Chiamare l'API reale fino a quando non ti limita la frequenza delle richieste Comportamento reale Si paga per ogni token e non è possibile attivare slow_down, un overload o un limite di spesa a comando
Intercettare il traffico reale dell'app e restituire gli errori del provider o applicare il throttling in base ai token usati dall'app URL reali, politica di retry dell'SDK e corpi degli errori del provider, con un limite scelto Il tuo codice, isolatamente. Tieni i tuoi unit test per quello.

Provalo nella tua app

Dev Proxy intercetta le richieste dell'app all'API del modello linguistico e restituisce gli errori del provider, mentre l'app continua a chiamare l'URL reale. Per OpenAI, scaricare il set di impostazioni e avviare Dev Proxy con esso:

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

Il set di impostazioni openai-throttling non riesce nel 90% delle richieste a https://api.openai.com/* con un errore casuale: rate_limit_exceeded per TPM o RPM, slow_down, , credit_balance_exhaustedo 503 server_is_overloaded. Il anthropic-throttling set di impostazioni esegue la stessa operazione per https://api.anthropic.com/* con RPM, token di input, token di output ed errori 429 di accelerazione e 529 overloaded_error. Entrambi i set di impostazioni includono RetryAfterPlugin, che indica quando l'app chiama nuovamente l'API prima che scada il tempo retry-after di un errore 429. Non controlla le risposte 503 e 529.

Per applicare il rate limiting in base ai token effettivamente usati dall'app, usa LanguageModelRateLimitingPlugin. Conta i token del prompt e di completamento che ogni risposta segnala e restituisce 429 con retry-after quando l'app supera i limiti impostati. Funziona con le API compatibili con OpenAI, inclusi Azure OpenAI e i modelli locali:

{
  "$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
  }
}

Il plug-in non riproduce la max_tokens stima. Il corpo predefinito 429 usa il insufficient_quota codice . Per restituire il corpo dell'errore previsto dall'app per un limite di frequenza, imposta whenLimitExceeded su Custom e fai puntare customResponseFile alla risposta personalizzata della tua app. Per installare Dev Proxy, vedere Configurare Dev Proxy.

Passaggi successivi

Vedere anche