LLM APIの料金感覚がつかめないので、見積もり用の計算機を作った
Claude APIの請求で学んだ料金の落とし穴3つ(出力単価・思考トークン・履歴の再送)と、月額をざっくり見積もる方法。自作の無料計算機も公開しています。
先月、検証用に回していたバッチ処理の請求を見て、一瞬固まった。想定の3倍だったからだ。
計算間違いというより、そもそも計算していなかった。「1リクエスト数円でしょ」という雑な感覚で回して、あとから請求で答え合わせをする。LLM APIを使い始めた頃の自分は、ずっとこれをやっていた。
同じ失敗をする人が減るように、請求書から学んだことをまとめておく。ついでに、毎回スプレッドシートを作るのが嫌になって計算機も作ったので、それも最後に紹介する。
請求が想定とズレる原因は、だいたい3つ
1. 出力トークンは入力の5倍高い
料金表を見ると「入力 $3 / 出力 $15」のように書いてある(Claude Sonnet 5の場合。100万トークンあたり)。この非対称を意識せずに「合計トークン数×単価」で見積もると、出力が多いワークロードで盛大に外す。
要約タスクなら出力は入力より短いから誤差で済む。でも記事生成やコード生成は逆で、コストの大半が出力側に乗る。私の場合、ブログのメタデータ一括生成で「入力は短いプロンプトだけだし安いはず」と思っていたら、出力のJSONが毎回長くて、請求の8割が出力トークンだった。
2. 思考トークンも課金される
最近のモデルは回答の前に「考える」。この思考(thinking)部分も出力トークンとして課金される。難しいタスクを高い思考努力で回すと、目に見える回答は10行でも、裏で数千トークン考えていたりする。
これは悪い話ではなくて、考えさせた方が結果の品質は上がる。ただ「見えているテキスト量」から料金を逆算すると絶対に合わない、ということは知っておいた方がいい。
3. 会話は長くなるほど加速度的に高くなる
一番見落としやすいのがこれ。チャット形式のAPIはステートレスなので、ターンごとにそれまでの履歴を全部入力として送り直す。
つまり10ターン目の入力には、1〜9ターン目の全部が含まれる。会話が2倍の長さになると、コストは2倍ではなく、ざっくり4倍近くに膨らむ。長い会話を扱うアプリを作るなら、履歴の要約や打ち切りを最初から設計に入れておかないと、ヘビーユーザーに使われた月の請求で泣くことになる。
ざっくり見積もりの手順
前提として、日本語はおおむね1文字≒1トークン。英語は1単語≒1.3トークンくらい。この換算だけ覚えておけば、あとは掛け算で済む。
例えば「2,000文字の記事を渡して、800文字の要約を返してもらう」処理を月1万回やるとする。
- 入力: 2,000トークン × 10,000回 = 2,000万トークン
- 出力: 800トークン × 10,000回 = 800万トークン
Sonnet 5($3/$15)なら、入力$60 + 出力$120 = 月$180。1ドル150円なら27,000円。同じ処理をHaiku 4.5($1/$5)に落とせば月$60、9,000円。
この「モデルを1段落とすと1/3になる」感覚が大事で、要約くらいのタスクなら小さいモデルで品質が足りることも多い。最上位モデルを思考停止で選ぶ前に、一度安いモデルで試す価値はある。
あと、本気で削るなら2つの公式割引がある。同じ長いプロンプトを使い回すならPrompt Caching(キャッシュ読み取りは通常の約1/10)、リアルタイム性が不要ならBatch API(50%オフ)。このへんは別記事で書いた実測があるので、そちらも参考に。
毎回この計算をするのが面倒で、ツールにした
上の計算、やること自体は単純なのに、モデルを4つ並べて比較して円換算して……とやると地味に時間を食う。それでスプレッドシートを作っては捨て、を3回くらい繰り返した末に、ブラウザで動く計算機にした。
トークン数とリクエスト数を入れると、主要モデルの月額が安い順に並ぶ。円換算つき。文字数からトークン数をざっくり出す換算も付けた。
こだわったのは単価セルを全部手で編集できるようにしたこと。LLMの料金表は本当にすぐ変わるので、固定値のツールは数ヶ月で嘘つきになる。改定されたら公式の料金ページを見て、その場で上書きすればいい。
料金の感覚がついてくると、「このタスクにこのモデルは過剰」という判断が数秒でできるようになる。それだけで月の請求は普通に半分になる。まずは自分のワークロードを一度、数字にしてみてほしい。