25분
스트리밍 응답과 에러 처리 구현법
Day 3: API 활용 & 토큰 이해
스트리밍 응답과 에러 처리 구현법
LLM 기초 > 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 코드 | 원인 | 대응 |
|---|---|---|---|
| RateLimitError | 429 | 요청 한도 초과 | 재시도 (백오프) |
| APITimeoutError | - | 응답 시간 초과 | 재시도 |
| APIConnectionError | - | 네트워크 문제 | 재시도 |
| AuthenticationError | 401 | API 키 오류 | 키 확인 (재시도 불가) |
| BadRequestError | 400 | 잘못된 요청 | 요청 수정 (재시도 불가) |
⚠️ 비용 폭탄 방지: 한글은 영어보다 토큰을 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 오류가 발생했을 때 폴백 처리(예: 사전 정의된 점검 체크리스트 반환) 방법을 순서대로 설명해주세요.
이 팁이 도움이 됐나요?