AI Batch API完全ガイド:OpenAI・Claude・Geminiの大量処理術

1万件のプロンプトを半額以下で処理できる——Batch APIは大量データ処理の救世主です。OpenAI・Claude・Geminiの3社を比較しながら使い方を解説します。

AI初心者

AIを知りたい

大量のデータを一度にAIで処理したいんですが、一つずつAPI呼び出しするしかないですか?

AIエンジニア

AIエンジニア

大量処理ならBatch APIを使いましょう!OpenAI、Claude、Geminiの各社がバッチ処理用のAPIを提供しています。コストも大幅に安くなります。

AI初心者

AIを知りたい

バッチ処理ってどういうことですか?

AIエンジニア

AIエンジニア

複数のリクエストをまとめて送信し、非同期で一括処理する方法です。リアルタイム性は不要だけど大量処理が必要な場合に最適です。

Batch APIとは

Batch APIとは、複数のAPIリクエストをまとめて非同期で処理するサービスです。通常のAPI呼び出しと比べて50%のコスト削減が可能で、データ分析、コンテンツ生成、評価タスクなど大量処理に適しています。

各社のBatch API比較

AI初心者

AIを知りたい

各社のバッチAPIってどう違うんですか?

AIエンジニア

AIエンジニア

比較してみましょう。

項目 OpenAI Batch Claude Batch Gemini Batch
コスト削減 50% 50% 50%
処理時間 最大24時間 最大24時間 数分〜数時間
入力形式 JSONL JSON配列 BigQuery/GCS
最大リクエスト数 50,000件 10,000件 制限なし(クォータ依存)
結果取得 ファイルダウンロード API取得 BigQuery/GCS出力

OpenAI Batch APIの使い方

AI初心者

AIを知りたい

まずOpenAIのバッチAPIの使い方を教えてください!

AIエンジニア

AIエンジニア

JSONLファイルを作成して送信する流れです。

import openai
import json

# 1. バッチ入力ファイルの作成
requests = []
for i, text in enumerate(texts_to_process):
    requests.append({
        "custom_id": f"request-{i}",
        "method": "POST",
        "url": "/v1/chat/completions",
        "body": {
            "model": "gpt-4o",
            "messages": [
                {"role": "system", "content": "テキストを要約してください"},
                {"role": "user", "content": text}
            ]
        }
    })

# JSONLファイルとして保存
with open("batch_input.jsonl", "w") as f:
    for req in requests:
        f.write(json.dumps(req) + "n")

# 2. ファイルをアップロード
client = openai.OpenAI()
batch_file = client.files.create(
    file=open("batch_input.jsonl", "rb"),
    purpose="batch"
)

# 3. バッチジョブの開始
batch = client.batches.create(
    input_file_id=batch_file.id,
    endpoint="/v1/chat/completions",
    completion_window="24h"
)

print(f"バッチID: {batch.id}")

Claude Message Batches APIの使い方

AI初心者

AIを知りたい

ClaudeのバッチAPIも教えてください!

AIエンジニア

AIエンジニア

Claude APIでもバッチ処理が可能です。

import anthropic

client = anthropic.Anthropic()

# バッチリクエストの作成
batch = client.messages.batches.create(
    requests=[
        {
            "custom_id": f"item-{i}",
            "params": {
                "model": "claude-sonnet-4-20250514",
                "max_tokens": 1024,
                "messages": [
                    {"role": "user", "content": text}
                ]
            }
        }
        for i, text in enumerate(texts_to_process)
    ]
)

# ステータス確認
result = client.messages.batches.retrieve(batch.id)
print(f"ステータス: {result.processing_status}")

# 結果の取得
for result in client.messages.batches.results(batch.id):
    print(f"{result.custom_id}: {result.result.message.content}")

バッチ処理の活用シーン

AI初心者

AIを知りたい

どんな場面でバッチAPIを使うべきですか?

AIエンジニア

AIエンジニア

リアルタイム性が不要な大量処理全般に向いています。

活用シーン 処理内容 メリット
データ分類 大量テキストのカテゴリ分け 50%コスト削減
コンテンツ生成 商品説明文の一括作成 並列処理不要
翻訳 多言語一括翻訳 API制限回避
品質評価 AIモデルのベンチマーク 大規模評価が安価
データクレンジング 不正データの検出・修正 自動化による効率化

AI初心者

AIを知りたい

コスト半分はかなり大きいですね!

AIエンジニア

AIエンジニア

大量処理でバッチAPIを使わないのは、お金を捨てているようなものです。急がない処理はすべてバッチに回すのが、プロダクション環境での鉄則ですよ!

関連記事

OpenAI Batch APIで大量リクエストを一括処理する:JONLファイル作成からステータス確認まで

Batch APIを使い、数百〜数千件のリクエストを一括で送信してコストを50%削減する方法を実装します。JONLファイルの作成、バッチジョブの投入、完了確認、結果取得までの全工程を確認しましょう。


from openai import OpenAI
import json
import time

client = OpenAI()

# ステップ1: バッチリクエスト用のJSONLファイルを作成
requests_data = [
    {
        "custom_id": f"req-{i}",
        "method": "POST",
        "url": "/v1/chat/completions",
        "body": {
            "model": "gpt-4o-mini",
            "messages": [
                {"role": "system", "content": "技術用語を小学生にもわかるように1文で説明してください。"},
                {"role": "user", "content": term}
            ],
            "max_tokens": 200
        }
    }
    for i, term in enumerate([
        "ニューラルネットワーク", "勾配降下法", "過学習",
        "正則化", "バッチ正規化", "ドロップアウト",
        "転移学習", "ファインチューニング", "蒸留",
        "アテンション機構"
    ])
]

jsonl_path = "batch_requests.jsonl"
with open(jsonl_path, "w", encoding="utf-8") as f:
    for req in requests_data:
        f.write(json.dumps(req, ensure_ascii=False) + "\n")
print(f"JONLファイル作成完了: {len(requests_data)}件")

# ステップ2: ファイルをアップロード
batch_file = client.files.create(
    file=open(jsonl_path, "rb"),
    purpose="batch"
)
print(f"ファイルアップロード完了: {batch_file.id}")

# ステップ3: バッチジョブを作成
batch_job = client.batches.create(
    input_file_id=batch_file.id,
    endpoint="/v1/chat/completions",
    completion_window="24h",
    metadata={"description": "AI用語の簡単説明を一括生成"}
)
print(f"バッチジョブ作成: {batch_job.id} (status={batch_job.status})")

# ステップ4: 完了をポーリングで待機
while batch_job.status in ["validating", "in_progress", "finalizing"]:
    time.sleep(30)
    batch_job = client.batches.retrieve(batch_job.id)
    completed = batch_job.request_counts.completed
    total = batch_job.request_counts.total
    print(f"  status={batch_job.status}  ({completed}/{total})")

# ステップ5: 結果を取得
if batch_job.status == "completed":
    result_file = client.files.content(batch_job.output_file_id)
    results = result_file.text.strip().split("\n")
    for line in results:
        res = json.loads(line)
        custom_id = res["custom_id"]
        content = res["response"]["body"]["choices"][0]["message"]["content"]
        print(f"  {custom_id}: {content}")
    print(f"\n合計 {len(results)} 件の結果を取得")
elif batch_job.status == "failed":
    print(f"バッチ失敗: {batch_job.errors}")
    # エラーファイルがある場合
    if batch_job.error_file_id:
        errors = client.files.content(batch_job.error_file_id)
        print(errors.text)

Batch APIの最大のメリットはコスト削減です。通常のAPI呼び出しと比べて50%安い料金で同じモデル・同じ品質の結果が得られます。ただし、完了まで最大24時間かかるため、リアルタイム性が不要な用途に限定されます。典型的なユースケースは、大量テキストの分類・翻訳、データセットへのラベル付け、コンテンツの一括生成です。JONLファイルの各行が独立したリクエストのため、1件のエラーが他に影響しない点も堅牢性の面で優れています。