Anthropic API の Message Batches API を試す
tl;dr
Anthropic API でもバッチ処理できるようになったよ(コスト 50% 減)
最大一万件まで一括処理でき、遅くとも 24 時間以内に完了するよ
実際に使ってみたので試してみて
Batches API とは
リクエストをバッチ処理できるもの。ベータ版。OpenAI API や Vertex AI にも同様の機能があります。Anthropic の Alex 氏が丁寧にまとめていらしたのでこちらを日本語訳します。せっかくなので Claude 3.5 Sonnet をベースに手直し、意訳。
Message Batches API の紹介 - Anthropic API で大量のクエリを非同期処理する方法
1 バッチあたり最大 10,000 件までのクエリを送信でき、24 時間以内に処理が完了します。さらに標準的な API コールと比べて 50%のコスト削減が可能です。
仕組み
バッチ処理を使用するには、クエリのリスト(プロンプトのリスト)を辞書形式で与え、Batches API の requests パラメータに渡すだけ。
この辞書には、あらゆるタイプのクエリを追加できます。たとえば、シンプルなものはもちろん、マルチターンのものやシステムプロンプト、画像入力など。
バッチ処理を行なっている間、Anthropic コンソールからステータスを確認できる。
私の意見(Alex 氏)では、リアルタイムで処理する必要のないタスクはすべて Batches API を通して送信されるべきです。
コスト削減だけでなく、多数の並列クエリの実行や、レート制限への対処などの複雑さも全て解消されます。
コストについて
バッチ処理の価格設定は以下の通り。この投稿で明示的には記載がないですが、対応モデルは図の通り Claude 3.5 Sonnet、Claude 3 Haiku、Claude 3 Opus の三つ。
標準 API の入力および出力コストを 50%カットしました。
その他の注意点
バッチは 24 時間以内には処理されますが、ほとんどの場合で 24 時間もかからず完了します
バッチ処理は標準の Messages API のレートリミットに影響しません(レートリミットを考えずに使える)
一度開始したバッチは更新できないので、そのような場合には一旦キャンセルして再度リクエストを投げるする必要があります
詳細は公式ドキュメントをご覧ください。
また、実際に動作するコード例については、クックブックをご確認ください。
翻訳は以上。せっかくなので公式ドキュメントも読んでみる。基本的には先ほど Alex 氏のまとめで十分なので説明は割愛しますが、コードの部分を中心に以後取り扱います。
curl で叩くものが手軽に試せるのでこちらをもとに進める。まずは Anthropic API Key を発行しましょう。下記が直リンク。
API Key を環境変数に指定しましょう。
export ANTHROPIC_API_KEY=sk-xxxxxxxxxx
では早速バッチの作成といきましょうか。
curl https://api.anthropic.com/v1/messages/batches \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: message-batches-2024-09-24" \
--header "content-type: application/json" \
--data '{
"requests": [
{
"custom_id": "request-1",
"params": {
"model": "claude-3-5-sonnet-20240620",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "フランスの首都は何ですか?"}
]
}
},
{
"custom_id": "request-2",
"params": {
"model": "claude-3-5-sonnet-20240620",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "太陽系で最大の惑星は何ですか?"}
]
}
}
]
}'
レスポンスを整形したものが下記の通り。
{
"id": "msgbatch_01Q2NnYAxVFPegPdnUhWSS1d",
"type": "message_batch",
"processing_status": "in_progress",
"request_counts": {
"processing": 2,
"succeeded": 0,
"errored": 0,
"canceled": 0,
"expired": 0
},
"ended_at": null,
"created_at": "2024-10-08T17:34:40.030936+00:00",
"expires_at": "2024-10-09T17:34:40.030936+00:00",
"cancel_initiated_at": null,
"results_url": null
}
"フランスの首都は何ですか?" と "太陽系で最大の惑星は何ですか?" のふたつのプロンプトを指定したため、proceeding の数は 2 つとなっている。また、id はこの後何回か使うため、環境変数に入れておきましょうか。
export MESSAGE_BATCH_ID=msgbatch_01Q2NnYAxVFPegPdnUhWSS1d
ご自身のレスポンスの id の value の値を MESSAGE_BATCH_ID に指定してください。
ではバッチの状態を確認しましょう。
curl https://api.anthropic.com/v1/messages/batches/$MESSAGE_BATCH_ID \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: message-batches-2024-09-24"
レスポンスを整形したものが下記の通り。
{
"id": "msgbatch_01Q2NnYAxVFPegPdnUhWSS1d",
"type": "message_batch",
"processing_status": "ended",
"request_counts": {
"processing": 0,
"succeeded": 2,
"errored": 0,
"canceled": 0,
"expired": 0
},
"ended_at": "2024-10-08T17:35:08.213381+00:00",
"created_at": "2024-10-08T17:34:40.030936+00:00",
"expires_at": "2024-10-09T17:34:40.030936+00:00",
"cancel_initiated_at": null,
"results_url": "https://api.anthropic.com/v1/messages/batches/msgbatch_01Q2NnYAxVFPegPdnUhWSS1d/results"
}
先ほど processing が 2 になっていたのですが、今回は succeeded となり、完了したことがわかりますね。ちなみに 10 分も立たないうちに完了しました。24 時間以内とありますが、少数の利用であれば想像以上にすぐに完了するようですね。
では結果を確認してみましょう。公式ドキュメントでは .sh ファイルを作成し、丁寧に記載されていますが、検証用ということでワンライナーで実行します。
curl "https://api.anthropic.com/v1/messages/batches/$MESSAGE_BATCH_ID" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: message-batches-2024-09-24" \
| grep -o '"results_url":[[:space:]]*"[^"]*"' \
| cut -d'"' -f4 \
| xargs curl \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: message-batches-2024-09-24" \
| jq '.result.type as $type | if $type == "succeeded" then .result.message.content[0].text else $type end'
curl "https://api.anthropic.com/v1/messages/batches/$MESSAGE_BATCH_ID" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: message-batches-2024-09-24" \
| grep -o '"results_url":[[:space:]]*"[^"]*"' \
| cut -d'"' -f4 \
| xargs curl \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: message-batches-2024-09-24"
レスポンスは JSONL で返却されます。みやすいようにふたつのデータをそれぞれ出力します。
{
"custom_id": "request-1",
"result": {
"type": "succeeded",
"message": {
"id": "msg_01QgGUFFtizqCoHzPrN8Kbzx",
"type": "message",
"role": "assistant",
"model": "claude-3-5-sonnet-20240620",
"content": [
{
"type": "text",
"text": "フランスの首都はパリ(Paris)です。\n\nパリに関するいくつかの重要な情報:\n\n1. フランス最大の都市であり、人口は約220万人です(都市圏人口は約1200万人)。\n\n2. セーヌ川沿いに位置しています。\n\n3. 世界有数の観光地で、エッフェル塔、ルーヴル美術館、ノートルダム大聖堂などの有名な観光スポットがあります。\n\n4. 芸術、ファッション、料理の中心地として知られています。\n\n5. フランスの政治、経済、文化の中心地です。\n\n6. 多くの国際機関(UNESCO, OECDなど)の本部が置かれています。\n\n7. 歴史的に重要な都市で、古代ローマ時代から存在しています。\n\nパリは、その豊かな歴史、文化、芸術により、世界中から多くの観光客を魅了し続けています。"
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": { "input_tokens": 19, "output_tokens": 293 }
}
}
}
{
"custom_id": "request-2",
"result": {
"type": "succeeded",
"message": {
"id": "msg_011TQSdLR4abpFbTk9joSZv4",
"type": "message",
"role": "assistant",
"model": "claude-3-5-sonnet-20240620",
"content": [
{
"type": "text",
"text": "太陽系で最大の惑星は木星(Jupiter)です。\n\n木星に関するいくつかの重要な事実:\n\n1. 直径: 約142,984 km(地球の約11倍)\n\n2. 質量: 太陽系の他のすべての惑星を合わせた質量の2.5倍以上\n\n3. 構成: 主に水素とヘリウムからなるガス惑星\n\n4. 特徴: 大赤斑と呼ばれる巨大な嵐が数百年続いている\n\n5. 衛星: 79個以上の衛星(ガリレオ衛星と呼ばれる4つの大きな衛星を含む)\n\n6. 環: 薄い環系を持つ\n\n7. 太陽からの距離: 平均で約7.8億km(地球の約5.2倍)\n\n木星は太陽系の中で非常に重要な役割を果たしており、その強力な重力は多くの小惑星や彗星の軌道に影響を与えています。"
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": { "input_tokens": 25, "output_tokens": 310 }
}
}
}
result.message.content.text がプロンプトに対する回答です。わかりやすいですね。
Cookbook もわかりやすいのでよろしければ。基本的には同じような処理をしているだけなので本記事では割愛します。