Summary

  • OpenAI의 Batch API는 동기 API 대비 50% 낮은 비용과 24시간 처리 창을 내세운다. 묶음이 만료돼도 완료된 요청이 사용한 토큰에는 요금이 붙는다.
  • 처리되지 않은 요청은 취소되고 오류 파일에 batch_expired로 남는다. 입력과 결과, 오류를 고유한 custom_id로 맞춰야 실제 완료분과 다시 실행할 범위가 드러난다.

가격표에는 반값이라는 숫자가 있다. 납품 목록에는 아직 답이 없는 행이 있을 수 있다.

OpenAI Batch API는 여러 요청을 JSONL 파일에 넣어 비동기로 처리한다. 공식 안내는 동기 API보다 50% 저렴한 비용, 별도의 속도 제한 풀, 24시간 처리 기간을 제시한다. 대량 평가, 문서 분류, 임베딩 생성처럼 기다릴 수 있는 업무에는 매력적인 조건이다. 하지만 구매 조직이 마지막에 필요로 하는 것은 값싼 응답 몇 개가 아니라 필요한 입력 전체에 대응하는 결과일 때가 많다.

시간 안에 전부 처리되지 않으면 묶음의 상태는 expired가 된다. OpenAI는 완료된 응답을 출력 파일에 남기고, 미완료 요청을 취소해 오류 파일에 batch_expired로 기록한다. 완료 요청이 소비한 토큰은 청구된다. 대기열은 닫혔는데 프로젝트는 끝나지 않은 상태가 여기서 생긴다.

이 차이는 회계와 납품의 기준이 다르기 때문이다. 제공자는 처리한 요청과 사용한 토큰을 셀 수 있다. 구매자는 분류 대상 문서가 모두 처리됐는지, 평가 사례가 빠지지 않았는지 확인해야 한다. 중요한 기록 몇 개가 비면 높은 완료율도 최종 산출물을 대신하지 못한다. 50% 할인은 완료된 모델 작업의 단가에 적용된다. 누락된 작업이 저절로 채워지는 가격은 아니다.

정확한 대조는 입력 단계에서 시작한다. 각 요청에는 고유한 custom_id가 붙어야 한다. OpenAI는 출력 파일의 행 순서가 입력 순서와 달라질 수 있다고 명시한다. 따라서 줄 번호를 기준으로 결과를 붙이면 다른 기록에 잘못된 답을 연결할 위험이 있다. 제출한 ID 목록을 보관하고, 성공 출력의 ID와 오류 파일의 ID를 각각 대조해야 한다. 그렇게 해야 “대부분 완료”라는 말이 실제 남은 요청 목록으로 바뀐다.

Batch 조회 API는 전체 상태를 보여준다. expires_at과 expired_at, 출력 및 오류 파일 ID, 전체·완료·실패 건수를 담은 request_counts가 있다. 해당하는 묶음에는 토큰 사용량도 표시된다. 건수는 차이의 크기를 알려주지만 어떤 고객 기록이 빠졌는지는 알려주지 않는다. 그 질문에는 두 파일의 custom_id가 답한다.

만료 뒤 원래 파일을 통째로 다시 제출하면 이미 결과를 얻은 요청도 새 실행 대상이 된다. 해결되지 않은 ID만 골라 두 번째 묶음을 만들면 복구 비용을 남은 작업에 집중할 수 있다. 공개 문서에는 특정 고객의 만료 파일이나 청구서가 없다. 실제 금액을 알려면 그 고객의 출력·오류 파일, 사용량과 적용 모델의 요금이 필요하다.

반값은 명확한 가격 규칙이다. 전체 납품은 구매자의 운영 책임이다. 두 사실을 같은 승인서에 적어야 한다. 누가 만료 뒤 빈칸을 확인하고, 누가 재실행 비용을 승인할지 정하지 않으면 할인은 확정되고 완료 기준만 흐려진다.

Sources