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

한눈에 보기
목표: 앱이 OpenAI 속도 제한 및 오버로드 오류를 처리하는 방식을 테스트
시간: 10분
Plugins:GenericRandomErrorPlugin, RetryAfterPlugin
필수 구성 요소:개발 프록시 설정

앱은 개발에서는 작동한 다음 프로덕션에서는 429 Too Many Requests로 인해 실패합니다. OpenAI 요청 제한은 조직의 사용 계층, 모델 및 동일한 조직을 사용하는 다른 모든 사용자에 따라 달라지므로 의도적으로 안정적으로 도달할 수 없습니다. 개발자 프록시는 OpenAI API가 반환하는 것과 동일한 오류를 반환하므로 사용자가 보기 전에 앱이 수행하는 작업을 확인할 수 있습니다.

OpenAI가 반환하는 내용 파악

모든 OpenAI 오류가 항상 "다시 시도"를 의미하는 것은 아닙니다. 앱이 그것들을 구분해야 합니다.

상태 error.code 의미 앱이 수행해야 하는 사항
429 rate_limit_exceeded 분당 요청(RPM) 또는 TPM(분당 토큰) 제한에 도달했습니다. 헤더의 Retry-After 시간까지 기다린 다음 다시 시도합니다.
429 slow_down 한도 내에 있더라도 요청 빈도가 너무 빨리 증가했습니다. 기다린 후 Retry-After 요청 속도를 줄이고 점진적으로 늘리세요.
429 credit_balance_exhausted 조직에 선불 크레딧이 남아 있지 않습니다. 다시 시도하지 마세요. 다시 시도해도 액세스 권한이 복원되지 않습니다. 사용자에게 알리거나 관리자에게 알립니다.
503 server_is_overloaded 현재 모델에 충분한 처리 능력이 없습니다. Retry-After가 있으면 기다린 후, 지연 시간을 점차 늘려 다시 시도합니다.

전체 목록은 OpenAI 설명서의 오류 코드를 참조하세요.

Important

429개 행의 3개 오류는 모두 동일한 상태 코드를 사용합니다. 앱이 429 오류마다 다시 시도하는 경우 복구되지 않는 청구 오류를 계속 다시 시도합니다. error.code을 확인하여 수행할 작업을 결정합니다.

OpenAI SDK가 수행하는 작업을 알아두세요.

Python 및 JavaScript용 공식 OpenAI SDK는 지수 백오프를 사용하여 408, 409, 429 및 5xx 응답과 연결 오류에 대해 기본적으로 2회 다시 시도합니다. Python에서는 maxRetries 옵션으로, JavaScript에서는 max_retries로 이를 변경할 수 있습니다.

SDK 재시도는 짧은 순간의 급증을 처리합니다. 앱은 재시도 횟수가 소진되었을 때 어떤 일이 발생하는지와 재시도로 해결되지 않는 오류를 처리하는 방법을 결정해야 합니다. Python에서는 429는 RateLimitError를 발생시키고 503은 InternalServerError를 발생시키므로 둘 다 처리합니다.

Tip

오류 처리 코드가 정확히 무엇을 수신하는지 확인하려면 테스트하는 동안 max_retries=0 (Python) 또는 maxRetries: 0 (JavaScript)을 설정하세요. 그 후에 SDK 재시도를 다시 켭니다.

OpenAI 요청 제한 시뮬레이션

개발 프록시에는 표에 있는 OpenAI 오류용 사전 설정이 있습니다. 이를 다운로드:

devproxy config get openai-throttling

사전 설정으로 Dev Proxy를 시작하세요:

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

미리 설정은 https://api.openai.com/*에 대한 요청의 90%를 테이블에서 임의로 선택된 오류와 함께 실패시킵니다. 속도 제한 응답의 경우 Retry-After 헤더를 설정하고 RetryAfterPlugin을 사용하여 앱이 API를 다시 호출하기 전에 그 시간만큼 대기하는지 확인합니다.

앱이 개발자 프록시를 통해 요청을 보내고 개발자 프록시 인증서를 신뢰하는지 확인합니다. Node.js의 경우 Node.js 애플리케이션에서 개발 프록시 사용을 참조하세요. 다른 런타임의 경우 Dev Proxy 문제 해결을 참조하세요.

앱을 실행하고 다음을 확인합니다.

  • rate_limit_exceeded 또는 slow_down 오류 후 앱은 Retry-After 시간 동안 기다립니다. API를 너무 일찍 호출하는 경우 개발자 프록시는 이를 보고하고 요청을 제한합니다.
  • credit_balance_exhausted 오류가 발생하면 앱은 API 호출을 중지하고 명확한 메시지를 표시합니다.
  • server_is_overloaded 오류가 발생한 후 앱은 지연 후 다시 시도하며, 재시도 횟수를 모두 소진하면 스택 추적 대신 대체 동작으로 전환되거나 명확한 메시지를 표시합니다.
  • 앱은 작업을 잃지 않습니다. 예를 들어 긴 채팅 대화 또는 일괄 처리 작업은 오류 후에도 계속됩니다.

요청 실패 빈도를 변경하려면 --failure-rate 옵션을 사용합니다. 예를 들어 모든 요청을 실패하려면:

devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json" --failure-rate 100

Azure OpenAI 및 기타 공급자에 대한 토큰 제한 시뮬레이션

사전 설정은 앱에서 사용하는 토큰 수에 관계없이 임의로 오류를 반환합니다. 실제 토큰 사용에 따라 요청을 제한하려면(예: 긴 대화가 TPM 제한을 초과할 때 무슨 일이 일어나는지 확인하려면) LanguageModelRateLimitingPlugin을 사용합니다. Azure OpenAI 및 로컬 모델을 포함하여 모든 OpenAI 호환 API와 함께 작동합니다. 자세한 내용은 테스트 언어 모델 토큰 제한을 참조하세요.

다음 단계:

토큰 기반 제한을 시뮬레이션하는 방법을 알아봅니다.

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