🔥 고급2026-05-266~8분
Batch API 비용 절감 50%: 처리량·지연 트레이드오프 실전 설계
Anthropic Batch API는 동기 호출 대비 최대 50% 비용 절감을 제공하지만, 잘못된 배치 크기와 폴링 전략은 오히려 운영 복잡도를 높인다. 수치 기반으로 최적 배치 구성과 실패 처리 패턴을 정리한다.
batch-apicost-optimizationreliability
왜 Batch API인가: 수치로 보는 트레이드오프
Batch API는 비동기 처리로 요청당 비용 50% 절감을 제공하지만 결과 반환까지 최대 24시간이 소요된다. 실시간 응답이 불필요한 워크로드, 예를 들어 대규모 문서 분류, 오프라인 임베딩 생성, 야간 보고서 요약에 적합하다.
핵심 제약:
- 배치당 최대 10,000 요청 또는 32MB
- 결과는
.jsonl형식으로 일괄 반환 - 부분 실패 시 성공 요청 결과는 그대로 사용 가능
동기 API 대비 지연 허용 기준: SLA가 1분 이상인 파이프라인에서만 적용을 권장한다. 그 이하면 스트리밍 동기 호출이 총 비용 관점에서 유리할 수 있다.
실전 배치 구성 코드
import anthropic
import json
from pathlib import Path
client = anthropic.Anthropic()
# 요청 목록 구성 (custom_id는 후속 매핑에 필수)
requests = [
{
"custom_id": f"doc-{i}",
"params": {
"model": "claude-opus-4-5",
"max_tokens": 256,
"messages": [{"role": "user", "content": f"Classify sentiment: {text}"}]
}
}
for i, text in enumerate(documents) # documents: List[str]
]
# 배치 제출
batch = client.messages.batches.create(requests=requests)
print(f"Batch ID: {batch.id}, Status: {batch.processing_status}")
# 지수 백오프 폴링 (초기 30초, 최대 5분 간격)
import time
delay = 30
while True:
result = client.messages.batches.retrieve(batch.id)
if result.processing_status == "ended":
break
time.sleep(min(delay, 300))
delay *= 1.5
# 결과 파싱 및 실패 분리
successes, failures = {}, []
for item in client.messages.batches.results(batch.id):
if item.result.type == "succeeded":
successes[item.custom_id] = item.result.message.content[0].text
else:
failures.append({"id": item.custom_id, "error": item.result.error})
print(f"성공: {len(successes)}, 실패: {len(failures)}")
실패 모드와 운영 체크리스트
주요 실패 모드:
- custom_id 중복: 배치 내 중복 ID는 전체 배치 거부로 이어진다. 제출 전
len(set(ids)) == len(ids)검증 필수. - 32MB 초과: 대형 문서는 청크 분할 후 여러 배치로 나눠야 한다. 목표 배치 크기는 20MB 이하 권장.
- 24시간 타임아웃: expired 상태가 되면 재제출 필요. 크리티컬 파이프라인은 12시간 시점에 상태 알람 설정.
- 부분 실패 미처리: 실패 항목을 별도 큐에 저장해 동기 API로 재처리하는 fallback 경로 필수.
운영 체크리스트:
- [ ] custom_id를 원본 데이터 DB PK와 1:1 매핑, 결과 저장 시 트랜잭션 처리
- [ ] 배치 제출 후 ID를 영속 저장소(Redis/DB)에 기록 — 프로세스 재시작 대비
- [ ] 실패율 > 5% 시 알람, > 20% 시 자동 동기 fallback 전환
- [ ] 월간 비용 리포트에 Batch vs 동기 비율 추적 (목표: 비실시간 워크로드의 70% 이상 배치화)