Gemini 2.5 Flash に追加された思考モード(Thinking Mode)を見て、「これで全部解決する」と思って全タスクに適用したら、APIコストが前月の3倍になりました。冷静に向き合い直した結果、思考モードが本当に効果を発揮するタスクと、使わない方がいいタスクの境界線がかなり明確になってきたので、整理して共有します。
思考モードの仕組みと料金
Gemini 2.5 Flash の思考モードは、応答を返す前に内部で推論ステップを踏む機能です。通常モードと比べて精度が上がりますが、その分トークン数が増え、レイテンシも伸びます。
API では thinking_config パラメータで制御します。
import google.generativeai as genai
genai.configure(api_key="YOUR_GEMINI_API_KEY")
model = genai.GenerativeModel("gemini-2.5-flash-preview-04-17")
# 思考モードを有効にする
response = model.generate_content(
"与えられたコードのバグを特定して修正してください。\n\n" + code_content,
generation_config=genai.GenerationConfig(
thinking_config=genai.ThinkingConfig(
thinking_budget=8192, # 思考に使う最大トークン数
)
)
)
print(response.text)thinking_budget は 0(思考なし)から 24576 まで設定できます。0 に設定すると思考を完全に無効化でき、事実上の通常モードになります。
どのタスクで思考モードが効くか
3ヶ月の試行錯誤で見えてきたのは、思考モードが効果を発揮するタスクには共通パターンがあるということです。
効果が大きいタスク:
- 複数ステップの推論が必要なコードレビュー: 「このコードが特定の条件下でメモリリークする可能性がある」といった、複数の実行パスを追う必要がある分析
- 要件が曖昧な仕様書からの実装方針導出: 矛盾や抜け漏れを検出しながら整合性のある実装方針を作る作業
- 複雑なSQLのクエリ最適化: 実行計画を頭の中で追いながら改善案を出すタスク
- 数学的・論理的な証明や計算: ステップを積み重ねる必要があるもの
効果が薄い(または逆効果になりうる)タスク:
- 単純な要約・翻訳: 思考フェーズが無駄に長くなり、回答の品質差はほぼない
- 定型フォーマットへのデータ変換: JSONに変換する、CSVを整形するなど
- 会話型のチャットボット応答: レイテンシが増すだけで精度向上は限定的
- 画像の説明生成: 視覚的理解は思考フェーズとの相性があまりよくない
タスクによる切り替えを実装する
実務では思考モードのオン/オフを動的に切り替えるラッパーを作っておくと、コスト管理がしやすくなります。
from enum import Enum
import google.generativeai as genai
class TaskComplexity(Enum):
SIMPLE = "simple" # 翻訳・要約・フォーマット変換
MODERATE = "moderate" # コード生成・説明文作成
COMPLEX = "complex" # バグ解析・設計レビュー・複雑な推論
THINKING_BUDGET_MAP = {
TaskComplexity.SIMPLE: 0, # 思考なし
TaskComplexity.MODERATE: 2048, # 軽い思考
TaskComplexity.COMPLEX: 8192, # 深い思考
}
def generate_with_complexity(prompt: str, complexity: TaskComplexity) -> str:
model = genai.GenerativeModel("gemini-2.5-flash-preview-04-17")
budget = THINKING_BUDGET_MAP[complexity]
if budget == 0:
response = model.generate_content(prompt)
else:
response = model.generate_content(
prompt,
generation_config=genai.GenerationConfig(
thinking_config=genai.ThinkingConfig(thinking_budget=budget)
)
)
return response.text
# 使用例
summary = generate_with_complexity(article_text, TaskComplexity.SIMPLE)
bug_analysis = generate_with_complexity(code_with_bug, TaskComplexity.COMPLEX)thinking_budget=0 にすると完全に思考を無効化できます。単純タスクではこれが最もコストパフォーマンスが高い設定です。
思考の中身を確認する
デバッグに役立つのが、思考の中間プロセス(thinking parts)を取得する方法です。
response = model.generate_content(
complex_prompt,
generation_config=genai.GenerationConfig(
thinking_config=genai.ThinkingConfig(thinking_budget=8192)
)
)
# 思考プロセスと最終回答を分けて取得
for part in response.candidates[0].content.parts:
if hasattr(part, "thought") and part.thought:
print("🧠 思考プロセス:")
print(part.text[:500]) # 長い場合は先頭だけ表示
else:
print("💬 最終回答:")
print(part.text)思考の中身を見ると、モデルが何を考慮して答えを出しているかが分かります。これが間違った方向を向いている場合は、プロンプトに追加情報を入れることで修正できることが多いです。
コスト削減の実測値
同一のコードレビュータスクを思考モードあり/なしで100件ずつ実行して比較した結果です。
| 設定 | 平均レイテンシ | 入力+出力トークン | バグ検出率 |
|---|---|---|---|
| 思考なし(budget=0) | 2.1秒 | ~1,200 | 61% |
| 軽い思考(budget=2048) | 4.8秒 | ~2,800 | 78% |
| 深い思考(budget=8192) | 9.3秒 | ~5,600 | 86% |
バグ検出率は「モデルが指摘したバグのうち、実際に修正が必要だったものの割合」です。コードレビューでは思考あり(2048)が最もコストパフォーマンスが高く、それ以上の budget はバグ検出率の伸びに対してコスト増が大きくなりました。
thinking_budget の選び方
実務で安定して使えている目安は以下の通りです。
- budget=0: 翻訳・要約・データ変換など、「正解が一意に定まるタスク」
- budget=1024〜2048: コード生成・説明文作成など、「少し考えた方がいいが深い推論は不要なタスク」
- budget=4096〜8192: バグ解析・仕様検討・複雑なリファクタリング判断など、「複数の可能性を考慮する必要があるタスク」
- budget=16384以上: 数学的証明や極めて複雑な推論など、「コストより精度が絶対優先のタスク」(ほぼ使わない)
一つのアプリ内で全て同じ設定を使うのではなく、タスクの種類に応じて切り替える設計にすると、コストと精度の両方で満足できる結果になります。
思考モードは「コストをかけて精度を買う」機能
整理すると、思考モードは「追加コストを払って推論精度を上げる」オプションです。全タスクに適用するものではなく、精度の差が結果を左右するタスクにだけ使うのが正しい使い方です。
まず今使っている API 呼び出しのログを確認して、「どのタスクに最もトークンを使っているか」を把握するところから始めてみてください。そのタスクが「深い推論が必要か」を問い直すと、最適な budget の設定が見えてきます。