アイソモカ

isomocha: 知の遊牧民の開発記録

開発記録 241026-2 しりとり辞書フィルタリング with OpenAI API: Batch

しりとりぼっと開発。
16万語の名詞リストからゲームに使ったらまずい単語を除くべく、 ChatGPT (gpt-4o, API) で単語分類をやってみた。

難しかったのは、フィルタリングの基準を設定することと、大量のデータを小分けにして投入することの2つ。
今回は2つ目、主に Batch API について。

isomocha.hatenablog.com

今回どう使ったか

  • completions
    • model: gpt-4o-2024-08-06
    • role: systemcontent に、system instructions を書く
    • role: usercontent に、評価対象データを入れる
      • csv 形式、1 completion あたり 100語
    • アウトプットも csv 形式
  • Batch API でリクエストを投げる
    • 1 batch あたり 100 completions とした
    • 16万語ちょい = 100 words * 100 completions * 17 batches

Batch API を使う手順

Batch - OpenAI API

  1. batch input file を作る(jsonl、 1 行につき 1 completion request)
    • ユニークなリクエストIDを振るのをわすれずに
  2. batch input file をアップロードする
    • アップロードだけでは実行されない
  3. batch を作成する
    • validation がうまくいけば、24 時間以内に処理される
    • 「24時間」よりも早くとか遅くとかは指定できない
  4. batch のステータスを確認する
    • in_progresscompleted
  5. 処理結果をダウンロードする
    • どれくらいの期間保存されてるんだろ?

大量のデータを小分けにする

(completion あたりの単語数) * (batch あたりの completions 数)

completion あたりの単語数を決める

  • system instructions をつくりながら、playgroundchat completions で試してみる
  • 単語数を増やしたり減らしたりして、アウトプットが期待通りか、壊れてないかを確認
    • 1 user content に 100 words 入れることに決めた
  • 入力する単語数が多すぎると(200 words とかでもう)、アウトプットが壊れ(途中から意味不明のめちゃくちゃになり)やすくなった
    • どうしてなのかよくわからん
    • gpt-4o-2024-08-06
    • なので、最近のでかい context window に比べて、今の入出力はぜんぜん短いと思うんだけどねぇ
    • attention が直近の部分のほうがききやすいから?
  • 入出力 token 数をざっくり計算
    • system instructions: 400 tokens
    • 1 completion あたりの token 数の見積もり(10 completion で平均)
prompt_tokens
(system instructions
+ user content)
completion_tokens
(output)
total_tokens
1470 1200 2670

batch あたりの completions 数を決める

  • 先に投入した batch がまだ完了していない状態で新しい batch を投入したら、新しいほうの batch が失敗した(status='failed'
    • エラーは token_limit_exceeded
    • 処理待ち prompt_token の上限 (Usage tier 1) を超過したということ
Enqueued token limit reached for gpt-4o in organization org-xxxx. Limit: 90,000 enqueued tokens. Please try again once some in_progress batches have been completed.
  • 情報があちこちに散らばっているが
  • 処理が終われば新しい batch を投入できる(1日ごとの上限ではない)ので、待って再投入する
  • 1 batch に入れる completions の数を減らす必要があると考え、100 completions ずつ投入することにした
    • でもよく考えてみたら、上記の見積もりだと 1 batch に 150k tokens ぐらい入ってる計算になる
    • 90k tokens のリミットを超過しているのでは?なんでいけたんだろう?(もっといけたのか?)
    • なんか柔軟なのだろうか?(なにもわからん)
  • 16万語ちょい = 100 words * 100 completions * 17 batches となった

ぼちぼち実行

  • batch は、validation がうまくいけば、24 時間以内に処理される
  • 実際にはさまざま
    • 週末に投げたとき、10時間ぐらいかかって心配になった(週末は混むのかな?)
    • 平日夜に (JST) 投げたとき、1時間もかからずすぐ完了してたりした(すいてたのかな、米国時間で忙しい時間帯と違うのかも?)
  • 4日ぐらいで全部終わった
    • status 確認から次の batch 作成まで自動化したかったが、未知のトラブルが起きるかもしれないと心配しながら、片手間に手で実行して様子を見ているうちに完了〜
  • 最初の試行錯誤(system instructions 書くの含めて)と実際の処理あわせて $11.72 かかった(1年前よりだいぶ安くなったよねえ、2桁違う?)
    • gpt-4o with Batch API (Pricing - OpenAI 2024/10 現在)
      • $1.25 / 1M input tokens
      • $5.00 / 1M output tokens

次回は分類結果について書くつもり。