LLM機能の運用コストは、トークン単価から出した数字の倍になる

LLMを使った機能を本番に載せる前に、必ず聞かれることがある。 月いくらかかるのか。

トークン単価は公開されているので、計算はできる。 ただ、そこで出した数字は、実際の請求額とだいたい合わない。

倍近くずれることもある。 何が抜けているのかを書いておく。

■ まず、素の計算をしてみる

社内向けの問い合わせチャットを例にする。

1日1,000リクエスト。 1リクエストあたり、入力8,000トークン、出力500トークン。

入力が多いのは、RAGで検索した社内ドキュメントをコンテキストに詰めるからだ。 LLMを使った機能では、入力が支配的になることが多い。

Claude Sonnet 5 の単価は、100万トークンあたり入力3ドル・出力15ドル。

入力:8,000 × 1,000 = 800万トークン → 24ドル/日 出力:500 × 1,000 = 50万トークン → 7.5ドル/日

合計で約32ドル/日。 月に約950ドル、日本円で14万円ほど。

ここまでは誰でも出せる。 問題はこの先だ。

■ プロンプトキャッシュで、入力側は下がる

入力8,000トークンのうち、6,000トークンは毎回同じだとする。 システムプロンプトと、固定の参照情報だ。

この部分はキャッシュできる。 キャッシュから読む場合の単価は、通常の約0.1倍になる。

つまり600万トークン分が、24ドルではなく数ドルで済む。 入力側は半分以下に落ちる。

ただし書き込み時は1.25倍(5分保持)または2倍(1時間保持)かかる。 5分保持なら2回目のリクエストで元が取れるが、1時間保持は3回必要になる。

リクエストが散発的にしか来ない機能では、キャッシュが切れ続けて書き込み料だけ払うことになる。 ここは実測しないと分からない。

■ ここから、単価表に載っていない費用が積み上がる

素の計算に抜けているものが3つある。

ひとつ目はリトライだ。 タイムアウト、レート制限、そして出力のJSONパース失敗。 どれも再実行になる。数パーセントは見込む必要がある。

ふたつ目は検証のための二重呼び出しだ。 回答をそのまま返せる用途は少ない。 コンテキストに無いことを喋っていないか、別のLLM呼び出しで検証することになる。

この検証を入れると、単純に呼び出し回数が倍になる。

三つ目は評価だ。 プロンプトを変えるたびに、テストケースを全件流し直す。 これは開発中ずっと発生し続ける。

評価はレスポンスを待つ必要がないので、バッチAPIを使える。 バッチなら単価が半額になるので、ここは必ず使う。

■ 積み上げた結果

先ほどの例に戻る。

キャッシュ適用後で、1日約15ドル。 検証の二重呼び出しで、約1.7倍。 リトライで数パーセント。

月に約800ドル、12万円前後。

素の計算と近い数字に戻ったように見えるが、中身が違う。 キャッシュで下げた分を、検証と再実行で食い潰している。

キャッシュを実装していなければ、月20万円を超える。

■ 一番大きい費目は、推論費用ではない

ここが本題だ。

月12万円の推論費用に対して、この機能を維持するために何時間使うか。

回答品質のレビュー。 プロンプトの調整。 モデル更新への追従。

月20時間使えば、エンジニア単価から逆算して、推論費用より人件費のほうが大きくなる。

LLM機能のコストは、実質的には人件費だ。 トークン単価の議論に時間をかけても、桁が変わることはない。

削るべきは、運用に人手がかかる設計のほうだ。

■ 見積もりの立て方

だから、着手前にこう出す。

まず1リクエストあたりのトークン数を実測する。 推定しない。代表的な入力を10件ほど流して測る。

次にリクエスト数を想定する。 ピーク時と平常時を分ける。

そこに係数を掛ける。 検証の呼び出し回数、リトライ率、評価の実行頻度。

最後に、運用に何時間かかるかを見積もる。 ここを出さない見積もりは、意味のある数字にならない。

■ 単価は動く

最後にひとつ。

モデルの単価は変わる。 新しいモデルが出れば旧モデルは値下がりし、導入価格が設定されることもある。

だから見積もりを固定値で持たない。 単価を設定値として外に出し、トークン数のほうを資産として持つ。

トークン数の実測値さえあれば、単価が変わっても再計算は一瞬で終わる。