25

스트리밍 응답과 에러 처리 구현법

Day 3: API 활용 & 토큰 이해

학습 목표

스트리밍 API의 원리와 장점을 이해한다 지수 백오프 재시도 패턴을 구현할 수 있다 제조 현장에 적합한 에러 처리 전략을 설계할 수 있다

스트리밍 응답


일반 응답 vs 스트리밍

[일반 응답]
요청 ─────────── (5초 대기) ──────────→ 전체 답변 한 번에 표시

[스트리밍]
요청 → 0.1초: "설" → 0.2초: "비" → 0.3초: " 진" → ... → 완료
                                (실시간으로 글자가 나타남)

왜 중요한가? 제조 현장에서 "설비가 멈췄는데 AI가 5초 동안 아무 반응이 없다"면 엔지니어는 답답해서 다시 매뉴얼을 뒤진다. 스트리밍이면 0.1초 만에 첫 글자가 나온다.


스트리밍 구현 코드

from openai import OpenAI

client = OpenAI()

def stream_response(messages):
    """스트리밍 응답 처리"""
    stream = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=messages,
        stream=True  # 핵심!
    )

    full_response = ""
    for chunk in stream:
        # delta.content가 None일 수 있음 (주의!)
        content = chunk.choices[0].delta.content
        if content:
            print(content, end="", flush=True)
            full_response += content

    print()  # 줄바꿈
    return full_response

에러 처리

주요 에러 유형

에러HTTP 코드원인대응
RateLimitError429요청 한도 초과재시도 (백오프)
APITimeoutError-응답 시간 초과재시도
APIConnectionError-네트워크 문제재시도
AuthenticationError401API 키 오류키 확인 (재시도 불가)
BadRequestError400잘못된 요청요청 수정 (재시도 불가)

⚠️ 비용 폭탄 방지: 한글은 영어보다 토큰을 2~3배 더 소모한다. 프로덕션 배포 전에 반드시 토큰 사용량을 모니터링하고, max_tokens를 제한하자.

지수 백오프 (Exponential Backoff)

[왜 지수 백오프인가?]

나쁜 방법: 에러 → 즉시 재시도 → 에러 → 즉시 재시도...
→ 서버에 부하만 가중

좋은 방법 (지수 백오프):
1차 실패 → 1초 대기 → 재시도
2차 실패 → 2초 대기 → 재시도
3차 실패 → 4초 대기 → 재시도
(대기 시간이 2배씩 증가)

+ 지터(Jitter): 대기 시간에 랜덤 변동 추가
  → 여러 클라이언트가 동시에 재시도하는 것 방지

재시도 구현

import time
import random
from openai import (
    OpenAI,
    RateLimitError,
    APITimeoutError,
    APIConnectionError,
    AuthenticationError
)

client = OpenAI()

def safe_api_call(messages, max_retries=3):
    """
    안전한 API 호출 (지수 백오프 + 에러 분류)
    """
    for attempt in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4o-mini",
                messages=messages,
                temperature=0.3,
                max_tokens=1000,
                timeout=30.0  # 30초 타임아웃
            )
            return response

        except AuthenticationError:
            # API 키 오류 → 재시도 불가
            print("API 키 오류! .env 파일을 확인하세요.")
            raise

        except (RateLimitError, APITimeoutError, APIConnectionError) as e:
            # 재시도 가능한 에러
            if attempt == max_retries - 1:
                print(f"최대 재시도 횟수 초과: {e}")
                raise

            # 지수 백오프 + 지터
            delay = (2 ** attempt) + random.uniform(0, 1)
            print(f"재시도 {attempt + 1}/{max_retries} "
                  f"({delay:.1f}초 후)")
            time.sleep(delay)

        except Exception as e:
            print(f"예상치 못한 에러: {e}")
            raise

제조 현장 에러 처리 전략

[전략: 폴백 체인]

1차: GPT-4o-mini 호출
  └ 실패 → 2차: GPT-4o로 재시도
            └ 실패 → 3차: 로컬 캐시에서 유사 답변 검색
                      └ 실패 → 4차: "현재 AI 서비스를 이용할 수 없습니다.
                                     매뉴얼을 참조하거나 선배에게 문의하세요."

포인트: 제조 현장에서는 "답이 없다"가 최악이다.
        무조건 뭔가를 보여줘야 한다.
AI로 학습하기 — 꿀팁
🧪제조 API 지수 백오프 패턴 심화AI 학습 팁

스트리밍 응답과 지수 백오프 재시도 패턴은 제조 현장의 24/7 가동 환경에서 특히 중요합니다. 실제 구현 전략을 구체화하세요.

제조 설비 모니터링 시스템에서 LLM API를 호출할 때 네트워크 불안정, API Rate Limit 초과, 서버 오류(5xx)가 간헐적으로 발생합니다. 이 상황에서 (1) 지수 백오프(exponential backoff) 재시도 로직 Python 구현 코드(max_retries=3, base_delay=1초, jitter 포함), (2) 스트리밍 응답 중 연결이 끊겼을 때 재개 전략, (3) 제조 현장 야간 무인 운전 환경에서 API 오류가 발생했을 때 폴백 처리(예: 사전 정의된 점검 체크리스트 반환) 방법을 순서대로 설명해주세요.
이 팁이 도움이 됐나요?