k
korAI
고급 전체
🔥 고급2026-07-206~8분

Batch API로 LLM 비용 50% 절감: 평가 파이프라인 실전 설계

Anthropic Message Batches API를 활용해 대규모 평가·라벨링 워크로드를 비동기로 처리하고, 운영 비용을 절반으로 줄이는 구체적 설계 패턴을 다룬다.

batch-apicost-optimizationevaluation

왜 Batch API인가: 비용과 처리량 트레이드오프

Anthropic Message Batches API는 동일한 모델 호출을 최대 50% 저렴하게 처리하는 대신, 결과 반환에 최대 24시간이 소요된다. 실시간 응답이 불필요한 워크로드—오프라인 평가, 데이터 라벨링, 야간 리포트 생성—에서 최적이다.

핵심 제약: 배치 1개당 최대 10,000개 요청, 배치당 합산 입력 토큰 32M 토큰 상한. 이를 초과하면 배치가 거부되므로, 파이프라인 앞단에서 요청 수와 토큰을 사전 집계해야 한다.

실패 모드: 개별 요청 단위로 성공/실패가 분리된다. 배치 전체가 실패하는 경우는 드물지만, 일부 요청이 errored 상태로 반환될 수 있다. 이를 처리하지 않으면 평가 데이터가 조용히 누락된다.

실전 코드: 평가 배치 제출 및 결과 수집

import anthropic
import json
from pathlib import Path

client = anthropic.Anthropic()

# 1. 평가 데이터셋 로드 (예: 500개 샘플)
samples = json.loads(Path("eval_dataset.json").read_text())

# 2. 배치 요청 구성 (토큰 상한 고려해 분할 필요 시 chunking)
requests = [
    {
        "custom_id": f"eval-{i}",
        "params": {
            "model": "claude-opus-4-5",
            "max_tokens": 256,
            "messages": [
                {"role": "user", "content": sample["prompt"]}
            ]
        }
    }
    for i, sample in enumerate(samples)
]

# 3. 배치 제출
batch = client.messages.batches.create(requests=requests)
print(f"Batch ID: {batch.id} | 상태: {batch.processing_status}")

# 4. 폴링으로 완료 감지 (운영 환경에서는 웹훅 또는 스케줄러 권장)
import time
while True:
    batch = client.messages.batches.retrieve(batch.id)
    if batch.processing_status == "ended":
        break
    time.sleep(60)  # 1분 간격 폴링

# 5. 결과 수집 및 실패 분리
results, errors = [], []
for result in client.messages.batches.results(batch.id):
    if result.result.type == "succeeded":
        results.append({
            "id": result.custom_id,
            "output": result.result.message.content[0].text
        })
    else:
        errors.append(result.custom_id)  # 재시도 대상

print(f"성공: {len(results)} | 실패: {len(errors)}")
Path("failed_ids.json").write_text(json.dumps(errors))

운영 체크리스트

제출 전

  • [ ] 배치 내 총 요청 수 ≤ 10,000, 예상 입력 토큰 ≤ 32M 검증
  • [ ] custom_id를 멱등 키로 설계 (재제출 시 중복 집계 방지)
  • [ ] 모델별 가격 차이 확인: Haiku는 배치 할인 적용 시 추론 비용이 극히 낮음

실행 중

  • [ ] 폴링 간격은 최소 30초 이상 (과도한 폴링은 rate limit 소비)
  • [ ] 배치 만료 기한(24시간) 내 결과 수집 스케줄 보장

결과 처리

  • [ ] errored 항목을 별도 파일에 저장 후 소규모 재시도 배치로 처리
  • [ ] 성공률 < 98%이면 알림 발송 (데이터 품질 임계값)
  • [ ] 비용 로그: batch.request_counts로 실제 처리 수 기록, 월별 예산 대비 추적