모델 속도 제한 처리하는 방법

모델 속도 제한 처리하는 방법

대규모 평가 작업을 실행할 때 흔한 문제는 보통 모델 제공자로부터 발생하는 타사 API 속도 제한에 부딪히는 것이에요. 속도 제한을 처리하는 몇 가지 방법이 있습니다.

출처: 문서

본문

langchain RateLimiter 사용하기 (Python 전용)

애플리케이션이나 평가기에서 langchain Python 채팅 모델을 사용한다면, 모델에 속도 제한기를 추가할 수 있어요. 이는 모델 제공자 API에 요청이 전송되는 빈도를 클라이언트 측에서 제어해 속도 제한 오류를 피할 수 있게 해줍니다.

from langchain.chat_models import init_chat_model
from langchain.rate_limiters import InMemoryRateLimiter

rate_limiter = InMemoryRateLimiter(
    requests_per_second=0.1,  # <-- Super slow! We can only make a request once every 10 seconds!!
    check_every_n_seconds=0.1,  # Wake up every 100 ms to check whether allowed to make a request,
    max_bucket_size=10,  # Controls the maximum burst size.
)

model = init_chat_model("gpt-5.5", rate_limiter=rate_limiter)

def app(inputs: dict) -> dict:
    response = model.invoke(...)
    ...

def evaluator(inputs: dict, outputs: dict, reference_outputs: dict) -> dict:
    response = model.invoke(...)
    ...

속도 제한기 구성에 대한 자세한 내용은 langchain 문서를 참고하세요.

지수 백오프로 재시도하기 (Retrying with exponential backoff)

속도 제한 오류를 처리하는 매우 일반적인 방법은 지수 백오프로 재시도하는 것입니다. 지수 백오프로 재시도한다는 것은 각 재시도 사이의 대기 시간을 지수적으로 증가시키며 실패한 요청을 반복적으로 재시도하는 것을 의미합니다. 이는 요청이 성공하거나 최대 요청 횟수에 도달할 때까지 계속됩니다.

langchain 사용 시

langchain 구성 요소를 사용한다면 .with_retry(...) / .withRetry() 메서드로 모든 모델 호출에 재시도를 추가할 수 있습니다:

from langchain import init_chat_model

model_with_retry = init_chat_model("gpt-5.4-mini").with_retry(stop_after_attempt=6)
import { initChatModel } from "langchain";

const model = await initChatModel("gpt-5.5", {
    modelProvider: "openai",
});

const modelWithRetry = model.withRetry({ stopAfterAttept: 2 });

자세한 내용은 langchain PythonJS API 참조를 확인하세요.

langchain 미사용 시

langchain을 사용하지 않는다면 tenacity(Python) 또는 backoff(Python) 같은 다른 라이브러리를 사용해 지수 백오프로 재시도를 구현하거나, 처음부터 직접 구현할 수 있습니다. 이 방법의 몇 가지 예시는 OpenAI 문서에서 확인할 수 있습니다.

max_concurrency 제한하기 (Limiting max_concurrency)

애플리케이션과 평가기에 보내는 동시 호출 수를 제한하는 것도 모델 호출 빈도를 줄여 속도 제한 오류를 피하는 또 다른 방법입니다. max_concurrencyevaluate() / aevaluate() 함수에 직접 설정할 수 있습니다. 이는 데이터셋을 스레드로 분할해 평가를 병렬화합니다.

from langsmith import aevaluate

results = await aevaluate(
    ...
    max_concurrency=4,
)
import { evaluate } from "langsmith/evaluation";

await evaluate(..., {
  ...,
  maxConcurrency: 4,
});

더 알아보기 (Learn more)