Extended thinking
讓 Claude 在生 visible response 前先「想」一段——thinking block 是真的 token 要算錢,但難題、debug、長 reasoning 的準確率明顯升。
TL;DR
- Extended thinking = 模型在 text block 前面多一個 thinking block,把推理過程寫出來,再給最終答案
- thinking block 是真的 token、要算錢——用
thinking: {type: "enabled", budget_tokens: N}設預算(最少 1024) - 跟 prompt caching、temperature、prefill 部分不相容;2025 年起支援 interleaved thinking(thinking 跟 tool_use 可以交錯)
一個情境:簡單 prompt 怎麼問都答錯
你有一道資料分析題:「給你三張表,找出 retention 最差的 cohort,並解釋原因。」
不開 thinking 直接問——Sonnet 有時候會跳過中間步驟、直接給結論,但結論常常掛在「最近 cohort」這種 surface-level pattern,沒看 join 出來的真實流失率。
開 extended thinking 之後,model 先在 thinking block 裡推:怎麼 join、怎麼算 retention、哪個 cohort 真的最差、為什麼。然後在 text block 給乾淨答案。
代價:慢(thinking 也要時間)、貴(thinking 是計費 token)。回報:難題的準確率有感提升。
什麼時候開、什麼時候不開
最直接的判準:先跑 eval,不開 thinking 看分數。如果 prompt 已經調過、分數還不夠,這時才考慮開 thinking。
| 任務類型 | 開 thinking? |
|---|---|
| 抽欄位、分類、簡單問答 | 不必,純加成本 |
| 翻譯、摘要 | 通常不必 |
| 數學、邏輯題、program reasoning | 開 |
| 多步驟 debug | 開 |
| Code review、refactor 規劃 | 看複雜度,多步驟才開 |
| Agent 規劃下一步 | 開(搭配 interleaved thinking) |
開啟方式
res = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
thinking={
"type": "enabled",
"budget_tokens": 2048, # 最少 1024
},
messages=messages,
)
兩個關鍵限制:
budget_tokens最小 1024——再少 API 直接拒max_tokens必須 >budget_tokens——不然真實 output 沒空間。實務上max_tokens至少是budget_tokens的 2 倍
budget_tokens 是「上限」,model 可以用得比這少。設高一點不會白花,model 不需要就不會用。
Response 結構長這樣
開 thinking 之後 res.content 會出現新的 block type:
[
{"type": "thinking", "thinking": "我先看 cohort A 的 retention...",
"signature": "EpYBCkQIB..."}, # 加密簽章,後面說
{"type": "text", "text": "Retention 最差的是 2024 Q3 cohort..."},
]
兩條規則:
- Thinking block 一定在 text block 前面(model 是先想再答)
- 同一 response 裡可能有多個 thinking block(interleaved 時更常見)
Signature:別亂改 thinking 內容
每個 thinking block 都帶一個 signature:Anthropic 的密碼學簽章,用來確認你沒改過 thinking 文字。
為什麼要簽?因為 thinking 是 model 生成答案的依據。如果開發者偷改 thinking 內容、再把整段塞回對話歷史,可能把 model 引導到不安全的方向。簽章讓 server 驗證「這段 thinking 是我生的、沒被動過」。
實務影響:multi-turn 對話想保留前一輪的 thinking 給下一輪參考,整個 thinking block(含 signature)原封不動塞回 messages 即可,不要拆、不要改字。
Redacted thinking
偶爾你拿到的 thinking block 不是文字,而是:
{"type": "redacted_thinking", "data": "EpYBCgI...(加密 blob)"}
這代表 thinking 內容被內部 safety system 攔下了。你看不到原文,但加密版本還是會傳給你——你下一輪要繼續對話時把它原樣塞回去,model 就能拿回完整 context。
實作 chat UI 時記得 handle 這個 type,不要假設只有 thinking 跟 text,否則一遇到 redacted 就 crash。
Thinking 跟 streaming 怎麼搭
Streaming 模式下 thinking block 也是逐 token 來的——你會先收到一串 thinking 的 content_block_delta、然後 content_block_stop、再開始 text block。
UX 設計:很多 chat 介面會把 thinking 折起來(「Show reasoning」可展開),預設只顯示最終 text。不要把 thinking 跟 text 混在一起印,user 看了會困惑。
跟其他 feature 的相容性
| Feature | 跟 thinking 相容? |
|---|---|
| Tool use | ✅(且強烈建議搭 interleaved,後面講) |
| Streaming | ✅ |
| Prompt caching | ⚠️ 部分情境受限,看官方相容矩陣 |
temperature | ❌ 不能設(thinking 走自己的策略) |
| Prefill assistant | ❌ 不能 prefill 開頭 |
| Vision / PDF | ✅ |
不相容的不是「會報錯」就是「設了沒用」——具體請參考 Anthropic 官方 extended thinking compatibility 表。
2025–2026 補強:Interleaved thinking
舊版 thinking 是「全部想完再開始 tool use / 答題」。Interleaved thinking 讓 model 可以:
thinking → tool_use → tool_result → thinking → tool_use → tool_result → thinking → text
也就是每次拿到 tool result 後可以再想一段。這在 agent 場景很關鍵:拿到查詢結果之後 model 常需要重新規劃下一步,沒 interleaved 就只能在最初一次 thinking 裡硬猜後面所有步驟。
開啟方式(Sonnet 4.x / Opus 4.x 起):
res = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=8192,
thinking={"type": "enabled", "budget_tokens": 4096},
tools=tools,
extra_headers={"anthropic-beta": "interleaved-thinking-2025-05-14"},
# ↑ beta header 名稱 / 是否還需要視當前 docs 為準
messages=messages,
)
計費怎麼算
Thinking token 算 output token(不是 input)——跟一般 generated text 同一個費率。
總費用 ≈ input × input_price
+ thinking_tokens × output_price ← 這段是新的
+ visible_output_tokens × output_price
response 的 usage.output_tokens 會把 thinking 跟 text 都算進去。實務上 thinking-heavy 的請求,output token 會比看到的回答多很多——預算規劃時別忘了加上去。
接下來
下一篇看 vision 跟 PDF——把圖跟 PDF 直接餵給 Claude。截圖 debug、發票抽欄位、合約摘要全是這條路。

