OpenAI API 타임아웃 처리와 재시도 로직 구현

문제 상황

사내 문서 요약 서비스에 GPT-4 API를 붙이고 나서 간헐적으로 타임아웃이 발생했다. 특히 긴 문서 처리 시 응답이 60초를 넘기는 경우가 있었고, Rate Limit(분당 요청 수 제한)에도 자주 걸렸다.

해결 방법

1. 지수 백오프 재시도

const retry = async (fn, maxRetries = 3) => {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (error.response?.status === 429 && i < maxRetries - 1) {
        const delay = Math.pow(2, i) * 1000;
        await new Promise(resolve => setTimeout(resolve, delay));
        continue;
      }
      throw error;
    }
  }
};

2. 타임아웃 설정

Axios timeout을 90초로 설정하고, 프론트엔드에는 로딩 상태를 명확히 표시했다.

const openai = axios.create({
  baseURL: 'https://api.openai.com/v1',
  timeout: 90000,
  headers: {
    'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`
  }
});

3. GPT-3.5 폴백

GPT-4가 실패하면 GPT-3.5-turbo로 자동 전환하도록 했다. 품질은 다소 떨어지지만 응답 속도가 빠르고 안정적이었다.

try {
  return await callGPT4(prompt);
} catch (error) {
  console.warn('GPT-4 failed, falling back to GPT-3.5');
  return await callGPT35(prompt);
}

결과

타임아웃 에러가 90% 이상 감소했고, 사용자 경험도 개선됐다. Rate Limit은 여전히 발생하지만 재시도 로직으로 대부분 해결된다.