OpenAI API 응답 스트리밍 처리 중 연결 끊김 문제 해결
문제 상황
채팅 기능에서 OpenAI API의 스트리밍 응답을 사용 중이었는데, 프로덕션 환경에서 간헐적으로 응답이 중간에 끊기는 현상이 발생했다. 특히 긴 응답을 생성할 때 문제가 자주 발생했다.
원인 분석
로그를 확인해보니 네트워크 타임아웃과 관련된 에러였다. 기본 타임아웃 설정(60초)으로는 긴 응답 생성 시 충분하지 않았고, 중간에 연결이 끊어지면 사용자에게 불완전한 응답이 전달되었다.
해결 방법
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
timeout: 120000, // 2분으로 증가
maxRetries: 3,
});
async function streamChatCompletion(messages: any[]) {
try {
const stream = await openai.chat.completions.create({
model: 'gpt-4o',
messages,
stream: true,
});
let fullContent = '';
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || '';
fullContent += content;
// 클라이언트로 전송
}
return fullContent;
} catch (error) {
if (error instanceof OpenAI.APIError) {
console.error('API Error:', error.status, error.message);
// 재시도 또는 fallback 처리
}
throw error;
}
}
추가로 클라이언트 측에서도 연결 끊김을 감지하고 재시도하는 로직을 추가했다.
const MAX_RETRIES = 2;
async function fetchWithRetry(messages: any[], retries = 0) {
try {
return await streamChatCompletion(messages);
} catch (error) {
if (retries < MAX_RETRIES) {
await new Promise(resolve => setTimeout(resolve, 1000 * (retries + 1)));
return fetchWithRetry(messages, retries + 1);
}
throw error;
}
}
결과
타임아웃 설정 조정과 재시도 로직 추가 후 연결 끊김 문제가 거의 사라졌다. 모니터링 결과 에러율이 3.2%에서 0.4%로 감소했다. 긴 응답 생성 시에도 안정적으로 동작하는 것을 확인했다.