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은 여전히 발생하지만 재시도 로직으로 대부분 해결된다.