
【APIコスト削減&時間短縮!】OpenAIの BatchAPIで賢くデータ処理
OpenAIのAPIを使っている人、必見です。
大量データをAPIでガンガン処理しているなら、ぜひ、BatchAPIも使ってみてください。
効率的かつお安く処理できますよ。
この記事では、BatchAPIの概要やメリット、具体的な利用手順についてご紹介していきます。
Batch APIとは?
Batch APIは、OpenAIが提供する非同期型のAPIサービスで、大量のリクエストを一括して効率的に処理することができます。
通常、APIと言えば同期型で、リクエストを一つずつ送信してレスポンスを待つ必要があります。
「すぐに結果が欲しい!」ということであれば通常のAPIが向いていますが、「データ量が多く、後から結果することでも構わない」のであれば、BatchAPIの利用をお勧めします。
Batch APIであれば、まとめて大量のリクエストを送信し、24時間以内に結果を取得することができるのです。
公式ドキュメントはこちら↓
https://platform.openai.com/docs/guides/batch?lang=python
Batch APIのメリット
Batch APIのメリットについて、通常のAPIと比較しながら見てみましょう。
❶APIコストが安い
Batch APIは、通常の同期型APIと比較してAPIコストが半額になります。
大規模なデータ処理を扱う場合、運用コストの大幅な削減につながります。例えば、数百万のテキストデータを処理するとなると、この価格差は非常に大きな節約となりますよね。
通常のAPIでは支払えないような量のデータ処理も、Batch APIを使用することで現実的なコストで実現可能になります。
❷レート制限を気にしなくていい
通常のAPIの場合、ユーザが一定期間に API に送信できるリクエストに制限(=レート制限)がありますが、Batch APIなら、これを気にする必要がありません。
Batch APIは、通常のAPIとは別個のレート制限プールを持っていて、通常のAPIでは処理しきれない規模のタスクにも対応できます。
地味に嬉しいメリットだと思います。
❸24時間以内の処理完了保証
Batch APIは、送信されたすべてのリクエストが24時間以内に処理されることを保証しています。
実際の処理時間はもっと短くなりますが、この明確な時間枠により、プロジェクトの計画が立てやすくなります。
自分の感覚では、通常のAPIを使うより、かなり高速な感じです。
Googleコラボで通常の同期型APIを使って回していると、90分でセッション切れしてしまいますが、非同期型のBatchAPIなら処理をOpenAIに任せてしまうので、セッション切れの心配もありません。
地味にこれは大きいと思います。
Batch APIの利用手順
Batch APIの利用手順は比較的シンプルです。
ここでは、Batch APIを使用するための基本的なワークフローについて、Pythonコードを交えて説明します。
💡Googleコラボでの実装になります。
準備
OpenAIのインストール
!pip install --upgrade openai
"Your API Key"にOpenAIのAPIキーをセットします。
import os
os.environ['OPENAI_API_KEY'] = "Your API Key"
ここまでうまくいっているかをテスト。問題なければ何か返ってきます。。
from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="o3-mini",
messages=[
{"role": "developer", "content": "You are a helpful assistant."},
{"role": "user", "content": "こんにちは!"}
]
)
print(completion.choices[0].message.content)
バッチファイルの作成
最初のステップでは、処理したいリクエストをまとめた.jsonl形式のファイルを作成します。
各リクエストには、ユニークなID(custom_id)を割り当て、モデル名やプロンプトの内容などの必要な情報を含めます。
ファイル形式は1行に1つのJSONオブジェクトを含む形式になります。
jsonlファイルの構造⇨このようなファイルを作成する

{"custom_id": "request-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-3.5-turbo-0125", "messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 1000}}
{"custom_id": "request-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-3.5-turbo-0125", "messages": [{"role": "system", "content": "You are an unhelpful assistant."},{"role": "user", "content": "Hello world!"}],"max_tokens": 1000}}
ファイルのアップロード
作成したバッチファイルをOpenAIのサーバーにアップロードします。
この時、Files APIが使用され、アップロード後にファイルIDが付与されます。(このファイルIDを取っておきます)
jsonlファイルはcontent直下のbatch_requests_first5.jsonlとします。
batch_input_file = client.files.create(
file=open("/content/batch_requests_first5.jsonl", "rb"),
purpose="batch"
)
batch_input_fileの中身を確認します。
FileObject(id='file-xxxxxxxxxxx',
bytes=116508,
created_at=1740807673,
filename='batch_requests_first5.jsonl',
object='file',
purpose='batch',
status='processed',
expires_at=None,
status_details=None)
バッチジョブの開始
アップロード時のfile_idを使用して、バッチジョブを開始します。
処理の開始時には、APIエンドポイントや処理目的などのメタデータも指定することができます。
# アップロード済みファイルのIDをセット
batch_input_file_id = "file-xxxxxxxxxxx"
# バッチジョブの作成
batch = client.batches.create(
input_file_id=batch_input_file_id,
endpoint="/v1/chat/completions",
completion_window="24h",
metadata={
"description": "sample eval job"
}
)
print(batch)
batchを出力すると、さまざまな情報を見ることができます。
今後のステータス確認のためにバッチジョブのidを取っておきます。
ジョブ作成後はstatusが"validating"(検証中)になります。
これが”completed(完了)"になると終了です。
Batch(id='batch_xxxxxxxxxxxxxxxx',
completion_window='24h',
created_at=1740807732,
endpoint='/v1/chat/completions',
input_file_id='file-K3PTEBwbGjZN4ZP6qNEzcu',
object='batch',
status='validating',
cancelled_at=None,
cancelling_at=None,
completed_at=None,
error_file_id=None,
errors=None,
expired_at=None,
expires_at=1740894132,
failed_at=None,
finalizing_at=None,
in_progress_at=None,
metadata={'description': 'sample eval job'},
output_file_id=None,
request_counts=BatchRequestCounts(completed=0,
failed=0,
total=0))
進捗状況の確認
バッチ処理の進行中にステータスをチェックすることができます。
batch_idを指定して、retrieve(検索)メソッドで「検証中」「実行中」「完了」などの状態が確認でき、処理の進捗を把握することができます。
batch_id = "batch_xxxxxxxxxxxxxxxx"
batch = client.batches.retrieve(batch_id)
statusがin_progress(実行中)の状態
Batch(id='batch_xxxxxxxxxxxxxxxx',
completion_window='24h',
created_at=1740807732,
endpoint='/v1/chat/completions',
input_file_id='file-K3PTEBwbGjZN4ZP6qNEzcu',
object='batch',
status='in_progress',
cancelled_at=None,
cancelling_at=None,
completed_at=None,
error_file_id=None,
errors=None,
expired_at=None,
expires_at=1740894132,
failed_at=None,
finalizing_at=None,
in_progress_at=1740807732,
metadata={'description': 'sample eval job'},
output_file_id=None,
request_counts=BatchRequestCounts(completed=0,
failed=0,
total=5))
statusがcompleted(完了)の状態
request_countsでfailedが0であることを確認
output_file_idが割り当てられますので、これを取っておきます。
Batch(id='batch_xxxxxxxxxxxxxxxx',
completion_window='24h',
created_at=1740807732,
endpoint='/v1/chat/completions',
input_file_id='file-K3PTEBwbGjZN4ZP6qNEzcu',
object='batch',
status='completed',
cancelled_at=None,
cancelling_at=None,
completed_at=1740808548,
error_file_id=None,
errors=None,
expired_at=None,
expires_at=1740894132,
failed_at=None,
finalizing_at=1740808547,
in_progress_at=1740807732,
metadata={'description': 'sample eval job'},
output_file_id='file-xxxxxxxxxxxxx',
request_counts=BatchRequestCounts(completed=5,
failed=0,
total=5))
結果の取得
処理が完了したら、output_file_idを指定して、結果をダウンロードします。
結果も.jsonl形式のファイルとして提供され、リクエスト時に指定したユニークIDによって元のリクエストと対応付けられます。
client = OpenAI()
output_file_id = file-xxxxxxxxxxxxx
file_response = client.files.content(output_file_id)
# file_response.text に格納されたデータ(JSONL形式の文字列)
data_str = file_response.text
records = []
# 各行ごとに分割して処理
for line in data_str.splitlines():
if not line.strip():
continue # 空行はスキップ
try:
data = json.loads(line)
except json.JSONDecodeError:
continue # JSONでない行はスキップ
# レスポンスから content を抽出(choice の最初の要素を使用)
try:
content = data["response"]["body"]["choices"][0]["message"]["content"]
except (KeyError, IndexError):
content = None
record = {
"id": data.get("id"),
"custom_id": data.get("custom_id"),
"content": content
}
records.append(record)
# DataFrameに変換
df = pd.DataFrame(records)
BatchAPI利用の注意点
事前に必ず少量データでテストを行い、結果に問題がなければ、正式に大量データの処理に移るようにしましょう!
いいなと思ったら応援しよう!
