Gemini の費用を削る前に、計器を疑った:単価・内訳・キャッシュの 3 つが壊れていて、キャッシュの条件は測り直すと変わっていた
トレカダッシュ 開発の記録 / 2026年9月〜10月
iOS アプリ「トレカダッシュ」は、記事の判定や商品の照合に、Google の Gemini(AI)を使っています。使った分だけお金がかかるので、費用を減らす作業を何度かしました。この記事は、その中の 2 つの回の記録です。
- 9 月 4 日:費用を削る前に計測を点検したら、3 か所とも壊れていた。
- 10 月 16 日:「キャッシュが効く条件」を測り直したら、9 月の結論と食い違っていた。
数字は、2026 年 9 月 4 日と 10 月 16 日の作業の記録から書いています。使ったのは gemini-3.1-flash-lite です。
計器が、3 か所とも壊れていた
「費用を削って」と言われて、最初にしたのは、削ることではなく、費用の計測が合っているかの確認でした。合っていない計器で削ると、効かない場所を削って「なぜ下がらない」となります。実際に、3 つの欠陥が見つかりました。
| 計器の欠陥 | 起きていたこと |
|---|---|
| 単価が違う | コード上の単価は、100 万トークンあたり入力 $0.10・出力 $0.40。実際の価格は 入力 $0.25・出力 $1.50。費用を約 1/2.6 に、少なく表示していた。 |
| 内訳のラベルが潰れていた | 用途別の集計が、実際には存在しない名前のキー(params.system)を見ていた(正しくは system_instruction)。31 種類の用途が、全部 1 つの塊になり、どの指示文が高いのか、一度も読めていなかった。 |
| キャッシュを数えていない | 入力の 31% はキャッシュの命中で、単価が 1/10 なのに、全部を定価で数えていた。約 4 割、多く見積もっていた。 |
もう 1 つ、見かけ上の「費用 2 位」が、本番の問題ではありませんでした。「ジョブ外」という名前の項目が 1 日 195 円で 2 位でしたが、これは私自身が、手で実行した分でした。本番の実力を見るときは、手動で動かした分を、必ず除きます。
直した計器で測ると、この時点で、1 日約 606 円(月 18,168 円)。キャッシュの分を引いた実質は、月約 13,200 円でした。費用のほとんどは入力トークンで、中身は、毎回送り直す指示文と候補の一覧です。
9 月の測定:キャッシュは約 8,000 トークンを超えてから
Gemini には、同じ長い指示文を繰り返し送ると、2 回目から安くなる仕組み(暗黙のキャッシュ)があります。命中した分の単価は 1/10 です。そこで、同じ指示文を 3 回続けて送って、どこから効くかを測りました。
| 指示文の長さ(入力トークン) | キャッシュの命中 |
|---|---|
| 5,209 | 0 |
| 8,490 | 4,079 |
| 17,070 | 12,263 |
当時の結論は、「約 8,000 トークンを超えてから効く」でした。実質のトークンは、入力 − 0.9 × 命中で計算できます。
ここで、無理に指示文を長くして基準に乗せるのは、逆に高くつく、と分かりました。4,200 トークンの指示文を 8,500 に膨らませると、実質は 4,814 トークンで、元より多いのです。キャッシュが得になるのは、元から大きい指示文だけです。
10 月の測り直し:条件は、約 4,000 トークンだった
もう一度、本番のキーで、同じ測定をしました。今度は、interactions API という呼び出し口で測りました。結果は、9 月と違いました。
| 指示文の長さ(入力トークン) | キャッシュの命中 |
|---|---|
| 1,770 | 0 |
| 4,093 | 2,031(2 回目から) |
| 7,017 | 4,076 |
約 4,000 トークンから効き、先頭の約 2,038 トークン単位で命中していました。9 月は「8,000 から」、10 月は「4,000 から」。なぜ食い違うのかは、確かめていません。測り方の違いや、サービス側の変更が考えられますが、どれが原因かは分かっていません。分かるのは、「キャッシュの条件は、固定の事実ではなく、測り直すもの」ということです。
本番の指示文は、1,000〜2,500 トークンでした。先頭の固定部分が基準に届かず、命中は 1 日中 0 でした。入力トークンが費用のほぼ全部(出力は約 1%)なので、キャッシュが効けば、大きな節約に見えました。
指示文を水増ししてみた。判定が 9% ずれた
「判定に影響しない注記」を足して、指示文を約 2,300 トークンに伸ばし、基準に乗せる案を試しました。実データ 90 件で、元の指示文と答えを比べました。
- 判定が 8 件(9%)食い違いました。「その他」「抽選」「ゲリラ販売」のあいだで、答えが変わりました。
- しかも、約 2,600 トークンでは、キャッシュに命中しませんでした。
精度が落ちるのに、命中も取れない。この案は取り下げて、本番には出していません。「影響しない」はずの文章でも、AI の答えは変わります。確かめずに足してはいけません。
いま残っている、いちばん大きい項目
実データで内訳を見ると、最大の単独項目は、商品の照合でした。1 回あたり平均 7,151 入力トークン、1 日 297 回で、約 83 円です。候補の絞り込み、まとめて聞く、AI に聞かずに済ませる、は、すでに入れてあります。これ以上は、候補を減らす、つまり精度を下げる方向になるので、見送っています。
削るなら、指示文を短くする方向です。その場合は、1 本ずつ、実データで判定が一致するかを確かめます。末尾の水増しで、キャッシュを狙いません。
分かったこと
費用を削る前に、削る道具を疑う。
- 単価は、記憶で書かない。公式の価格ページで確かめます。1/2.6 の過小表示は、単価の書き写しの誤りでした。
- 内訳のラベルが、本当に分かれているか、実データを 1 回出して目で見る。31 種類が 1 つに潰れていても、合計は合っているので、気づきません。
- 自分の作業が、本番の数字に混ざっていないか見る。
- 条件は、測り直す。9 月の「8,000」は、10 月には「4,000」でした。
- 「影響しない」変更も、実データで確かめる。90 件で試して、9% ずれました。
この話に出てくるもの
- トレカダッシュ — トレカの抽選・予約・先着の情報を集める iPhone アプリ
- Claude API から Gemini API へ移行した — Gemini を使うことになった経緯
- Claude API と Gemini API を、公式の数字で比べる — 値段や上限を公式の情報で比べた記事
- Firestore の費用を円で出したら、読み取りの 91% が 1 か所だった — 同じ「まず計器」の記録
ほかの記録
- Firestore の費用を円で出したら、読み取りの 91% が 1 か所だった:キャッシュを入れても効かなかった理由 — Firestore を初めて円で見たら、月 1.3 万円で Gemini とほぼ同額だった。読み取りの 91% は商品一覧の読み直し。60 秒キャッシュが効かなかったのは、32 件が同時に動いていたから。「読み込み中の約束」を覚えて直した記録。
- 「確認済み」の印が付いていたのに、リンク先を一度も読めていなかった:t.co の中継ページ — X の告知の応募リンクを、ブラウザの名乗りを付けて開くと、t.co は転送せず中継ページを返した。表示中の 220 件が全部読めておらず、9 件は閉じたフォームだった。直し方と、誤った「確認済み」の印の外し方の記録。
- Claude API から Gemini API(gemini-3.1-flash-lite)へ移行した:16 か所の呼び出しを 1 つの関数にまとめた — Anthropic の利用上限で予定外の課金が出たため Gemini へ移行。モデルの選び方(廃止予定日)、呼び出しの一本化、Web 検索の回数上限が無い問題への回路遮断器、止めるスイッチの記録。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。