Applied AI School
v0 · 規劃中
Anthropic

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,
)

兩個關鍵限制:

  1. budget_tokens 最小 1024——再少 API 直接拒
  2. 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,不要假設只有 thinkingtext,否則一遇到 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、發票抽欄位、合約摘要全是這條路。