홈 / 블로그 / 개발 노트

AI가 응답하지 않을 때, 타임아웃 · 재시도 · 대체 모델로 서비스를 지켜요

개발 노트SOL LABS AI읽는 데 6분

AI 기능을 붙인 서비스는 평소에는 잘 돌아가다가도, 어느 날 갑자기 답이 늦어지거나 오류 화면이 뜰 수 있어요. 모델 API도 결국 외부 서비스라서, 사용량이 몰리거나 우리 쪽 요청이 한도를 넘으면 응답이 실패해요.

이 글은 그런 순간에 사용자가 빈 화면을 보지 않게 만드는 방법을 다뤄요. 오류를 종류별로 나누고, 다시 시도할지 · 기다릴지 · 다른 길로 돌릴지를 정하는 순서예요.

먼저 오류를 세 묶음으로 나눠요

모든 오류에 똑같이 '다시 시도'를 걸면 오히려 상황이 나빠질 수 있어요. 공식 문서에 나온 오류 코드를 기준으로 크게 세 묶음으로 나눠 두면 대응이 단순해져요.

묶음대표 코드대응
잠깐 기다리면 풀리는 오류429(요청 한도), 500, 504(시간 초과), 529(과부하)간격을 늘려 가며 다시 시도
요청을 고쳐야 하는 오류400(요청 형식), 413(요청 크기)다시 시도하지 않고 기록 · 수정
설정을 확인해야 하는 오류401(키), 402(결제), 403(권한)바로 알림, 관리자 확인

Anthropic 문서는 529를 API가 일시적으로 과부하된 상태로, 429를 요청 한도에 걸린 상태로 설명해요. 다만 같은 429라도 월 사용 한도(spend cap)에 걸린 경우는 다시 시도 시각(retry-after)이 오지 않고, 다시 보내도 계속 실패한다고 안내해요. 이럴 땐 재시도를 멈추고 관리자에게 알려야 해요.

다시 시도는 '간격을 늘려 가며, 횟수를 정해서'

잠깐 기다리면 풀리는 오류라면 다시 시도가 답이에요. 다만 바로 연달아 보내면 안 돼요. OpenAI 공식 문서는 실패한 요청도 분당 한도에 함께 계산된다고 설명해요. 쉬지 않고 보내면 한도에서 더 늦게 빠져나와요.

그래서 두 가지 원칙을 지켜요.

  • 지수 백오프(점점 길게 기다리기): 1초, 2초, 4초처럼 실패할 때마다 기다리는 시간을 늘려요. 여기에 작은 무작위 시간(지터)을 더해 여러 요청이 한꺼번에 몰리지 않게 해요.
  • retry-after 우선: 응답에 다시 시도 시각이 오면 그 값을 최소 대기 시간으로 써요.

횟수와 전체 대기 시간에는 꼭 상한을 둬요. Anthropic 공식 SDK(개발 도구 묶음)는 연결 오류 · 요청 한도 · 서버 오류를 기본 2번 다시 시도해 준다고 안내해요. SDK 없이 직접 호출한다면 같은 규칙을 우리 코드에 넣어야 해요.

타임아웃은 '사용자가 기다릴 수 있는 시간'으로 정해요

타임아웃(응답을 기다리는 최대 시간)은 기술 숫자이기 전에 화면 경험의 숫자예요. 채팅처럼 사용자가 화면 앞에서 기다리는 기능과, 밤사이 문서를 정리하는 기능은 기준이 달라야 해요.

  • 화면 앞 기능: 스트리밍(답을 글자 단위로 흘려보내기)을 쓰면 첫 글자가 빨리 보여서 체감 대기가 줄어요. Anthropic 문서도 긴 요청, 특히 10분이 넘을 수 있는 요청에는 스트리밍이나 배치 처리를 권해요.
  • 뒤에서 도는 기능: 결과를 기다리게 하지 말고 작업 목록에 넣은 뒤, 끝나면 알림으로 알려 줘요.
타임아웃 숫자를 정할 때는 "이 화면에서 사용자가 몇 초까지 기다려 줄까?"를 먼저 물어보세요.
우리 회사 자료로 직접 확인해 보고 싶다면AI 도입 진단 · 자료를 보고 적용 후보와 순서를 정리해 드려요상담 신청

다시 시도로도 안 되면, 다른 길을 열어 둬요

재시도 상한을 넘었다면 사용자에게 빈 화면 대신 다른 길을 보여 줘요. 서비스 성격에 따라 아래 순서로 준비해요.

  1. 대체 모델(fallback): 같은 일을 할 수 있는 다른 모델이나 다른 회사 API로 한 번 더 보내요. 답의 말투나 형식이 달라질 수 있으니, 평가 세트로 미리 확인해 두는 게 좋아요.
  2. 저장된 답: 자주 묻는 질문은 최근에 확인한 답을 보여 줘요. 기준 시각을 함께 적어요.
  3. '잠시 후 다시' 화면: 무엇이 안 됐는지, 입력한 내용은 저장됐는지, 언제 다시 시도하면 되는지를 짧게 알려 줘요.
  • 오류 코드를 세 묶음으로 나눠 기록하나요?
  • 재시도 횟수와 전체 대기 시간에 상한이 있나요?
  • 실패한 뒤에도 사용자가 입력한 내용이 남아 있나요?
  • 대체 모델로 바뀌었을 때 화면 형식이 깨지지 않나요?

정리

LLM 장애 대응은 오류를 나누고, 간격을 늘려 가며 다시 시도하고, 그래도 안 되면 대체 모델 · 저장된 답 · 안내 화면으로 이어 주는 순서예요. 모델 API의 상태는 우리가 정할 수 없어도, 실패했을 때 사용자가 보는 화면은 우리가 정할 수 있어요.

참고

  • Anthropic, Errors: https://platform.claude.com/docs/en/api/errors
  • OpenAI, Rate limits: https://developers.openai.com/api/docs/guides/rate-limits
매주 무료 AI 업무팁, 인스타에서 먼저 받아 보세요카드뉴스 · 짧은 영상으로 정리해요 · @sol_ai_kr팔로우
비슷한 시스템을 만들고 싶다면

기존 시스템과 데이터를 보고 옮기는 순서와 범위를 먼저 정리해 드려요.

개발 상담먼저 3분 AI 도입 자가진단으로 적용처를 찾아보세요 →
SOL LABS AI

웹 · 앱 · 업무 시스템을 만들고 그 위에 필요한 AI를 붙여 운영하는 팀이에요. 회의록 · 계약서 · 기업 분석 AI를 직접 만들어 운영해요.

만든 프로젝트 보기
다음 글도 받아 볼까요?

함께 보면 좋은 글