Claude Code ultrathinkとeffortレベルで思考の深さを制御する

Claude Code ultrathinkとeffortレベルで思考の深さを制御する | mohablog

Claude Codeで深く考えさせたいとき、プロンプトにultrathinkと入れる。これは今も有効です。ただultrathinkが内部で何をしているかは、Opus 4.7以降で変わりました。

思考の深さを決める主役は、いまやultrathinkではなくeffortレベルに移っています。背景にあるのはOpus 4.7以降のadaptive reasoning。公式ドキュメント “Model configuration” を引きながら整理します。

目次

ultrathinkが渡しているのは指示文だけ

公式が書くultrathinkの挙動

“Use ultrathink for one-off deep reasoning” セクションは、キーワードの役割をこう説明します。

Include ultrathink anywhere in your prompt to request deeper reasoning on that turn without changing your session effort setting.

ultrathinksession effort setting を変えません。足すのはその回限りの指示文だけで、APIに送るeffortレベルは元のまま。トークン予算を固定値に切り替えるスイッチではありません。

think hardは「キーワード」ではないが無視もされない

同じセクションに、見落とされやすい一文があります。thinkthink hardthink moreは “passed through as ordinary prompt text and are not recognized as keywords” だと。Claude Codeが特別な指示を注入するのはultrathinkだけ、という意味です。

ただ「think hardは効かない」と読むのは行き過ぎ。adaptive thinkingのドキュメントには、ユーザーのメッセージに “Please think hard before responding.” を足すとその回の思考を促せる、とあります。think hardはキーワードとして特別扱いされないだけで、地の文としてモデルには届きます。adaptiveなモデルはその誘導に反応する。違いはClaude Code側が指示を注入するか、地の文としてモデルが受け取るかです。

effortレベルが思考量を決める

では思考量そのものは何で決まるのか。決め手はeffortレベル。”Adjust effort level” セクションは、これを adaptive reasoning を制御する設定と定義しています。考えるか・どれだけ考えるかを、モデルがステップごとにタスクの複雑さで判断する仕組みです。

adaptive reasoningには副産物があります。tool呼び出しの合間にも思考を挟む interleaved thinking が自動で有効になる点。ファイル読み込みやコマンド実行を何度も往復するエージェント的な作業ほど、この恩恵が出ます。1回の回答で1度だけ深く考える方式とは、向き不向きが分かれる。

モデルで使えるレベルが違う

effortは5段階。ただし使える段数はモデルで変わります。

モデル使えるeffortレベルデフォルト
Opus 4.8 / Opus 4.7low / medium / high / xhigh / maxOpus 4.8はhigh、Opus 4.7はxhigh
Opus 4.6 / Sonnet 4.6low / medium / high / maxxhighなし)high

非対応のレベルを指定すると、そのモデルが対応する一段下へ丸められます。Opus 4.6でxhighを指定すればhighとして動く。レベル名は同じでも内部の値はモデルごとに較正が違うので、同じ”high”が同じ深さを意味するわけではありません。

/effortで切り替える

セッション中の変更は/effortです。

/effort low

切り替わると、スピナーの横に現在のレベルが出ます。

✻ Thinking… (with low effort)

引数なしの/effortはスライダーを開き、/effort autoでモデルのデフォルトに戻せます。レベルがロゴ脇に常時表示されるので、/modelを開かなくても今どの設定かを確認できます。

設定の優先順位

effortの指定経路は複数あり、優先順位が決まっています。環境変数CLAUDE_CODE_EFFORT_LEVELが最優先、次に設定ファイルの値、最後にモデルのデフォルト。恒久設定ならsettings.jsonにこう書きます。

{
  "effortLevel": "medium"
}

ただしmaxultracodeはセッション限りで、設定ファイルには書けません。--effortフラグ、/modelのスライダー、Skillやサブエージェントのfrontmatterからも指定できます。Opus 4.8の既定はhigh。手元ではeffortLevelをhighで固定し、設計レビューのように重い調査だけセッション限りでmaxへ上げています。

MAX_THINKING_TOKENSが効くのはどのモデルか

固定のトークン予算という概念はまだ残っていますが、効く範囲は狭まりました。”Adaptive reasoning and fixed thinking budgets” セクションが線を引いています。

Opus 4.7 and later always use adaptive reasoning. The fixed thinking budget mode and CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING do not apply to them.

固定予算モードに戻せるのはOpus 4.6とSonnet 4.6だけ。CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1を立てると旧来のモードになり、ここで予算を握るのがMAX_THINKING_TOKENSです。Opus 4.7以降では、この変数も固定予算モードも無効になります。

例外が一つ。MAX_THINKING_TOKENS=0はeffortレベルに関係なく思考そのものを止めます。adaptiveなモデルでも、ゼロ指定だけは効く。思考を挟みたくない定型のCI実行などで使えます。

「ultrathinkは31,999トークン使う」という数字を見た人もいるはず。これは固定予算モードが主流だった頃の解説で語られた値です。adaptive reasoningが既定になった今、思考量を決めるのはトークンの固定枠ではありません。effortレベルとタスクの複雑さで動的に変わります。古い記事の数字をそのまま当てにすると、現行の挙動とずれてしまう。

思考の表示と課金は別系統

思考の表示は、effortとは独立して切り替えます。セッション内のトグルは macOSでOption+T、Windows/LinuxでAlt+TCtrl+Oを押すと、推論の中身がグレーのイタリック体で展開されます。

課金は表示と無関係です。公式は “You are charged for all thinking tokens generated, even when collapsed or redacted.” と明記しています。折りたたんでいても、effortを上げて思考が増えればその分だけ請求される。表示を消すのはレイテンシ対策であって、コスト対策ではありません。

実際にいくら思考に使ったかは、APIレスポンスのusage.output_tokens_details.thinking_tokensで読めます。たとえばoutput_tokensが348でthinking_tokensが312なら、出力の大半は推論に消えた計算です。画面に出る要約は実トークンと一致しないので、コストを見るならこの内訳のほうが正確。effortを上げる前に、いまの内訳を一度見ておくと判断しやすくなります。

Skillとサブエージェント単位でeffortを固定する

effortはセッション全体だけでなく、SkillやサブエージェントのfrontmatterからもオーバーライドできるとAdjust effort levelに書かれています。読むだけのレビュー用エージェントは浅く、設計を任せるエージェントは深く、と役割ごとに固定値を持たせられます。

---
name: code-reviewer
description: 差分を読んで指摘する読み取り専用レビュー
effort: low
---

このサブエージェントが起動すると、スピナー横の表示が “with low effort” に切り替わり、親セッションのレベルとは独立して動きます。frontmatterのeffortはそのSkill・サブエージェントが動いている間だけ効き、セッションのレベルを上書きする。ただし環境変数CLAUDE_CODE_EFFORT_LEVELには勝てません。優先順位は、環境変数 > frontmatter > セッション設定 > モデルのデフォルトの順です。

この粒度が効くのは、定型のレビューや要約を流す自動化です。重い思考が要らない処理にlowを割り当てておけば、無駄なトークンを毎回削れます。

effortレベルの選び方

5段階あるからといって、常に最大へ振るのは逆効果です。

やりがちなのが、これを既定にしてしまう設定。

/effort max

“Choose an effort level” セクションはmaxを “may show diminishing returns and is prone to overthinking” と評しています。常用すると、単純なタスクでも考え込んでトークンと時間を浪費します。

タスクで振り分けるほうが噛み合います。

# 日常のコーディングは既定のまま
/effort auto

# 難所だけ、その回のプロンプトで上乗せ
ultrathink この競合状態の原因を3つの仮説で切り分けて検証して

常時の深さはeffortのデフォルトに任せ、難所だけultrathinkでその回だけ持ち上げる。これならsession effort settingを触らずに、必要な場面でだけ深く考えさせられます。

逆に、調査や大きめのリファクタリングのように最初から重いと分かっているセッションは、/effort xhighで底上げしておくほうが楽です。その回ごとにultrathinkを打ち続ける手間が消えます。レベルを変える粒度は、タスクの寿命で決めると噛み合う。1問で終わる調べ物はキーワード、半日かけるセッションはeffort側。寿命で分ければ、毎回悩まずに済みます。

まとめ

  • ultrathinkはその回限りの指示文を足すキーワード。session effort settingは変えない
  • thinkthink hardはキーワード扱いされないが、地の文としてadaptiveなモデルの思考を促す
  • 思考量の主役はeffortレベル。Opus 4.8/4.7はlowmaxxhighを加えた5段階
  • MAX_THINKING_TOKENSと固定予算モードが効くのはOpus 4.6/Sonnet 4.6まで。Opus 4.7以降はadaptive reasoning固定
  • 折りたたんでも思考トークンは課金される。表示を消してもコストは減らない
  • 既定はhighに任せ、難所だけultrathinkmaxの常用はoverthinkingを招く

effortとコンテキスト管理は別の話ですが、トークンの出方という点では地続きです。長いセッションでの節約はClaude Codeのコンテキスト管理術にまとめています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次