Batch API — 업계 표준이 된 50% 할인
주요 제공자(provider)는 모두 50% 할인과 약 24시간 반환 시간(turnaround)을 보장하는 비동기(asynchronous) 배치 API(Batch API)를 제공합니다. OpenAI, Anthropic, Google은 물론 대부분의 추론 플랫폼(inference platform; Fireworks의 배치 티어, Together의 배치)이 모두 같은 패턴을 구현합니다. 배치에 프롬프트 캐싱(prompt caching)을 함께 쌓으면, 야간 파이프라인(overnight pipeline) 비용은 동기·미캐시(synchronous-uncached) 비용의 약 10%까지 내려갑니다. 규칙은 잔인할 만큼 단순합니다. 대화형(interactive)이 아닌 작업이라면 배치로 보내야 합니다. 콘텐츠 생성 파이프라인, 문서 분류, 데이터 추출, 보고서 생성, 대규모 라벨링, 카탈로그 태깅처럼 24시간 지연(latency)을 견딜 수 있는 작업은 배치로 옮기기 전까지 계속 돈을 흘리고 있는 셈입니다. 2026년 운영(production) 표준 패턴은 새로 추가되는 모든 LLM 작업(workload)을 세 가지 차선(lane)으로 분류(triage)하는 것입니다. 대화형(캐싱을 곁들인 동기 호출), 준대화형(semi-interactive; 폴백을 가진 비동기 큐), 배치(야간 실행에 캐시 입력을 함께 쌓음)로 구분합니다. 실제로는 몇 분의 지연을 견딜 수 있으면서도 대화형인 척하는 작업이 가장 큰 비용을 낭비합니다.
유형: Learn
언어: Python (표준 라이브러리 기반, 배치 대 동기 비용을 비교하는 간단한 시뮬레이터)
선수 지식: Phase 17 · 14 (Prompt & Semantic Caching)
예상 시간: 약 45분
학습 목표
- 세 가지 제공자 배치 API(OpenAI, Anthropic, Google)의 이름과 공통 보장 사항인 50% 할인과 24시간 반환 시간을 말할 수 있습니다.
- 야간 분류 작업에서 배치와 캐시 입력(cached-input)을 함께 적용했을 때의 비용을 계산하고, 동기·미캐시 기준선(baseline)과 비교할 수 있습니다.
- 한 작업을 대화형 / 준대화형 / 배치 중 어느 차선에 두어야 하는지 판단하고 그 근거를 설명할 수 있습니다.
- 두 가지 함정인 부분 대화성(partial interactivity; 사용자가 24시간보다 빠른 응답을 기대함)과 출력 스키마 드리프트(output-schema drift; 제공자마다 배치 파일 형식이 다름)를 설명할 수 있습니다.
문제
팀이 야간 보고서 생성 파이프라인을 배포했다고 가정해봅니다. 문서 50,000개를 각각 요약하고, 요약을 군집화(cluster)하고, 임원 요약문(executive brief)을 초안으로 작성합니다. 동기(synchronous) 방식으로 실행하면 4시간이 걸리고 밤마다 약 $2,000가 듭니다. 그러던 중 배치 API가 있다는 이야기를 듣게 됩니다.
배치를 쓰면 50% 할인을 받습니다. 여기에 시스템 프롬프트(system prompt; 5만 번의 호출 전체에서 공유됨)에 프롬프트 캐싱까지 켭니다. 두 가지를 함께 쌓으면 청구서는 하룻밤에 약 $180까지 내려갑니다. 기준선의 약 9% 수준입니다. 같은 파이프라인에서 설정 세 가지만 바꾼 결과입니다.
배치는 LLM 비용 관리 도구 중에서 가장 저렴하지만 아무도 잘 당기지 않는 레버(lever)입니다. 이유는 대부분 조직적입니다. 실제 서비스 수준 약속(Service Level Agreement; SLA)이 "아침까지"인데도 팀은 그것을 "실시간(real-time)"이라고 생각합니다. 이 강의는 청구서의 90%를 그대로 흘려보내지 않기 위한 방법을 다룹니다.
개념
세 가지 배치 API
OpenAI Batch API: 요청(request) 목록이 담긴 JSONL 파일을 업로드합니다. 24시간 반환 시간을 약속합니다(실제로는 보통 약 2~8시간). 입력 토큰과 출력 토큰 모두에 50% 할인이 적용됩니다. 엔드포인트는 /v1/batches입니다. 캐시 가능한(cache-eligible) 입력은 그 위에 캐시 입력 가격(cached-input pricing)이 추가로 적용됩니다.
Anthropic Message Batches: JSONL 업로드 방식을 씁니다. 24시간 반환 시간과 50% 할인을 제공합니다. cache_control을 지원하며, 캐시 쓰기(cache write)는 명시적으로 표시하고, 배치 안에서 읽기(read)는 자동으로 일어납니다.
Google Vertex AI Batch Prediction: BigQuery 또는 GCS(Google Cloud Storage) 입력을 사용합니다. Gemini에 대해 유사한 50% 할인을 제공합니다. Vertex 파이프라인과 통합됩니다.
의미: 비동기일 뿐 느린 것이 아니다
배치는 "24시간 안에 결과를 돌려주겠다고 약속한다"는 뜻이지 "실제로 24시간이 걸린다"는 뜻이 아닙니다. 일반적인 P50(중앙값)은 2~6시간입니다. 제공자는 GPU 재고(GPU inventory)가 덜 사용되는 비피크(off-peak) 시간대에 여러분의 배치를 일정에 올립니다(schedule).
캐싱과 함께 쌓기
같은 4K-토큰 시스템 프롬프트를 쓰는 5만 문서 요약 작업을 생각해봅니다.
- 동기·미캐시: 5만 × ($input × 4000 + $output × 200)을 정상가로 지불합니다.
- 동기·캐시: 첫 쓰기 이후에는 시스템 프롬프트가 캐시에 올라갑니다. 나머지 49,999건은 입력 비용이 약 10배 저렴해집니다.
- 배치·캐시: 위의 모든 절감에 더해 읽기와 쓰기 모두에 50% 할인이 적용됩니다.
조합은 배치 + 캐시입니다. 결과는 동기·미캐시 청구서의 약 10% 수준입니다. 야간에 돌고 공유 시스템 프롬프트가 있는 작업이라면 반드시 이 조합을 사용해야 합니다.
작업 분류
대화형(Interactive) — 사용자가 응답을 기다립니다. 첫 토큰까지의 시간(Time To First Token; TTFT)이 중요합니다. 프롬프트 캐싱을 곁들인 동기 호출을 사용합니다. 배치로 보낼 수 없습니다.
준대화형(Semi-interactive) — 사용자가 작업을 제출하고 몇 분 뒤에 다시 확인합니다. 배치가 사용 불가일 때 동기로 대체(fallback)되는 비동기 큐(async queue)를 사용합니다. 중간 규모의 RAG 색인 작업이 여기에 가깝습니다.
배치(Batch) — 사용자가 "아침까지" 또는 "다음 시간 안에" 결과를 기대합니다. 콘텐츠 파이프라인, 대규모 분류, 오프라인 분석이 여기에 속합니다. 항상 배치로 보내고, 항상 캐싱을 함께 쌓습니다.
흔한 실수는 파이프라인이 운영 환경(production)에 있다는 이유만으로 모든 것을 대화형으로 분류하는 것입니다. 운영 환경이라는 사실 자체는 지연 사양이 아닙니다. 지연 사양은 SLA가 결정합니다.
부분 대화성 함정
어떤 기능은 대화형처럼 보이지만 5~10분의 지연은 견딜 수 있습니다. 예를 들어 "새로 고침(refresh)" 버튼이 있는 야간 고객 상태 보고서를 생각해봅니다. 사용자가 새로 고침을 누르고 10분을 기다려도 괜찮습니다. 그런데 팀은 그것을 동기 방식으로 배포합니다. 동시에 50건의 새로 고침이 들어오면, 배치로 처리해 이메일로 전달하는 방식보다 약 10배 더 비싸집니다.
물어야 할 질문은 이것입니다. "이 사용자에게 24시간이라는 시간은 어떤 의미인가?" 답이 "아마 알아차리지 못할 것이다"라면 배치로 보내야 합니다.
출력 스키마 함정
배치 파일 형식은 제공자마다 다릅니다.
- OpenAI: JSONL, 한 줄에 요청 하나.
- Anthropic: JSONL, 한 줄에 메시지(message) 하나. 응답 형식(response format)은 그 안에 포함됩니다.
- Vertex: TFRecord가 들어 있는 BigQuery 테이블 또는 GCS 접두사(prefix).
여러 제공자를 한꺼번에 지원하는 "단일 배치 클라이언트(one batch client)"를 만들려면 제공자마다 어댑터 코드가 필요합니다. 다중 제공자 배치를 광고하는 게이트웨이(gateway; Portkey, LiteLLM의 일부 티어)도 결국 원본 형식을 얇게 감싸는 수준에 그칩니다.
기억해야 할 숫자
- 제공자 전반의 배치 할인: 입력과 출력 모두에 일괄 50%.
- 반환 시간 SLA: 24시간 보장, 일반적인 P50은 2~6시간.
- 배치 + 캐시 입력을 함께 쌓을 때: 동기·미캐시 비용의 약 10%.
- 작업 분류 규칙: 24시간 지연이 허용된다면 항상 배치를 사용합니다.
사용해보기
code/main.py는 5만 문서 작업에 대해 동기, 동기+캐시, 배치, 배치+캐시 네 가지 구성의 비용을 계산합니다. 절감액을 달러(dollar) 금액과 백분율(percent)로 보고합니다.
산출물 만들기
이 강의는 outputs/skill-batch-triager.md를 만듭니다. 작업의 특성이 주어지면 대화형 / 준대화형 / 배치 중 하나로 분류하고, 예상 절감액을 계산하는 스킬입니다.
연습문제
- 쉬움:
code/main.py를 실행합니다. 10만 문서 파이프라인, 3K-토큰 시스템 프롬프트, 500-토큰 출력에 대해 전체 조합(배치 + 캐시)이 동기 기준선 대비 얼마나 절감되는지 계산합니다.
- 쉬움: 실제로 알고 있는 제품 기능 세 가지를 고릅니다. 각각을 대화형 / 준대화형 / 배치 중 하나로 분류합니다.
- 중간: 사용자가 보고서 생성에 3시간이 걸렸다고 불평합니다. 이것은 배치 분류 오류였습니까, 아니면 정당한 대화형 작업이었습니까? 판단 기준을 작성합니다.
- 중간: 배치 API의 반환 SLA는 24시간이지만 P99(99분위)는 20시간입니다. 이것을 사용자에게 어떻게 전달해야 합니까? 경계 사례(edge case)에서 하위 시스템(downstream system)이 어떻게 동작해야 합니까?
- 어려움: 공유 접두사(shared-prefix)의 길이가 얼마일 때 배치 + 캐시가 직접 예약한 GPU에서 야간으로 실행하는 것보다 저렴해지는지 손익분기점(break-even)을 계산합니다.
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 배치 API(Batch API) | "비동기 할인" | 24시간 반환 시간을 조건으로 50% 할인되는 API |
| JSONL | "배치 형식" | 한 줄에 JSON 요청 하나를 두는 형식. OpenAI/Anthropic의 표준 |
| Message Batches | "Anthropic 배치" | Anthropic 배치 API의 제품명 |
| Batch Prediction | "Vertex 배치" | Vertex AI 배치 API의 제품명 |
| 반환 시간 SLA(Turnaround SLA) | "24시간 약속" | 보장값이지 일반값이 아니다. 일반값은 2~6시간이다 |
| 작업 분류(Workload triage) | "대화성 결정" | 대화형 / 준대화형 / 배치 중 어디에 둘지 결정하는 라우팅 판단 |
| 출력 스키마(Output schema) | "응답 형식" | 제공자별 JSONL 레이아웃이며 이식 가능하지(portable) 않다 |
| 적층 할인(Stacked discount) | "배치 + 캐시" | 둘 다 적용될 때 동기·미캐시 청구서의 약 10%까지 내려가는 구조 |
더 읽을거리