文檔上寫著「大約 1.0 到 1.35 倍」,但對技術文件的實測卻是 1.47 倍。對 CLAUDE.md 檔案的測量也達到 1.45 倍。標價沒變,配額沒變,但每次對話消耗的 tokens 變多了,你的 Max window 燒得更快,快取的前綴成本每回合都在增加,速率限制會更早碰到。

Anthropic 一定在用這個換什麼東西。換到了什麼?又值不值得?

一個開發者的實測疑問

Anthropic 的官方遷移指南說明新的標記器(tokenizer)使用的 tokens 「大約是 4.6 的 1.0 到 1.35 倍」。對於這個數字,Claude Code Camp 的作者並不滿足於相信官方說法,他決定自己測一次。

測試方法很簡單:使用 Anthropic 的 /v1/messages/count_tokens 端點,這是一個免費的、不進行推理的 token 計數器。用同一份內容,分別問兩個模型,每個模型只回傳一個數字。差異完全是標記器造成的。

他準備了兩批樣本。第一批是七個真實內容,來自實際的 Claude Code 使用者會發送的內容:一個 CLAUDE.md 檔案、一個使用者的提示詞、一篇部落格文章、一個 git log、終端機輸出、一個堆疊追蹤、以及一段程式碼 diff。第二批是 12 個合成的樣本,涵蓋不同的內容類型:英文散文、程式碼、結構化資料、CJK 文字、表情符號、數學符號,目的是看看比例如何隨內容類型變化。

核心迴圈只有三行 Python 程式碼,但產生的結果卻很耐人尋味。

真實場景中的成本增加

第一批樣本全部來自實際檔案,這是 Claude Code 使用者真正會發送的內容。結果很清楚:一個 5KB 的 CLAUDE.md 檔案,在 4.6 版本是 1,399 個 tokens,到了 4.7 版本變成了 2,021 個,比例是 1.445 倍。

典型使用者提示詞的比例是 1.373 倍,Markdown 格式的部落格摘錄是 1.368 倍,Git 提交紀錄是 1.344 倍,終端機輸出(例如 pytest 執行結果)是 1.291 倍,Python 堆疊追蹤是 1.250 倍,程式碼 diff 是 1.212 倍。

把這七個真實樣本加權平均,比例是 1.325 倍。也就是說,原本 8,254 個 tokens 的內容,在 4.7 版本會變成 10,937 個。

第二批樣本是用來對比不同類型的內容。英文技術文件的比例是 1.47 倍,Shell 腳本是 1.39 倍,TypeScript 程式碼是 1.36 倍,西班牙文散文是 1.35 倍,帶程式碼區塊的 Markdown 是 1.34 倍,Python 程式碼是 1.29 倍,英文散文是 1.20 倍。

密接的 JSON 只有 1.13 倍,JSON Schema 格式的工具定義是 1.12 倍,數字型 CSV 是 1.07 倍。日文和中文散文的比例幾乎沒變,分別是 1.01 倍和 1.01 倍。

如果把英文和程式碼的樣本加權平均,比例是 1.345 倍。CJK(中日韓)文字的部分則是 1.01 倍,幾乎沒有變化。

標記器到底改了什麼

從數據中可以看出三個明顯的模式。

第一,CJK、表情符號和符號類的內容只變了 1.005 到 1.07 倍。如果是整個詞彙表重新設計,這些內容的變化應該更一致,但實際上沒有。這和非拉丁部分的詞彙表變化比拉丁部分少,是一致的。但光從 token 數量不能證明哪些具體的詞彙表項目被保留了。

第二,英文和程式碼在自然內容上的變化是 1.20 到 1.47 倍。這和 4.7 版本對常見的英文和程式碼模式使用了更短或更少的次詞合併,是一致的。

第三,程式碼受到的影響比獨特散文更大(1.29 到 1.39 倍 vs 1.20 倍)。程式碼有更多重複的高頻率字串——關鍵字、import 語句、識別碼——這正是字節對編碼(Byte-Pair Encoding)在程式碼上訓練時會合併成長序列的模式。

英文的每個 token 代表的字元數從 4.33 個降到 3.60 個。TypeScript 從 3.66 個降到 2.69 個。詞彙表用更小的片段來表示相同的文字。

這是一個假設,不是證明。計算 tokens 不會告訴你 Anthropic 的專有詞彙表中哪些具體項目改變了。

為什麼要用一個消耗更多 tokens 的標記器

Anthropic 的遷移指南提到:「更字面的指令遵循,特別是在較低的努力層級。模型不會無聲地將一個項目的指令推廣到另一個項目。」

更小的 tokens 會迫使注意力機制專注在個別單詞上。這是一個有紀錄的機制,可以實現更緊密的指令遵循、字元級任務,以及更精確的工具調用。合作夥伴的報告(Notion、Warp、Factory)指出在長時間執行時有更少的工具錯誤。

標記器是這個改善的一個合理因素。權重和後訓練也改變了。Token 數量無法將它們分開。

4.7 真的更遵循指令嗎

測量成本的部分說完了。現在的問題是:Anthropic 用這個換到了什麼?

他們的賣點是「更字面的指令遵循」。這個說法合理,但 token 計數的數據不能證明它。作者做了一個直接測試。

IFEval(Instruction Following Evaluation)是 Google 在 2023 年發布的一個基準測試,包含 541 個帶有可驗證約束的提示詞。「剛好用 N 個字回應」「包含單詞 X 兩次」「不使用逗號」「全部大寫」。每個約束都有一個 Python 評分器,只有通過或失敗兩種結果。

作者從 IFEval 的 541 個提示詞中用固定種子隨機選了 20 個,每個都跑過兩個模型,然後用 IFEval 公布的評分器評分。

結果如下:在嚴格模式下,4.6 版本在提示詞層級通過 17 個(85%),4.7 通過 18 個(90%),增加了 5 個百分點。在指令層級,4.6 通過 25 個(86%),4.7 通過 26 個(90%),增加了 4 個百分點。在寬鬆模式下,兩個模型在提示詞層級和指令層級都通過 90%,沒有差別。

這是一個小但方向一致的改善,特別是在嚴格的指令遵循上。寬鬆評估則是平的。兩個模型都已經能遵循高層次的指令——嚴格模式的差距來自 4.6 偶爾會處理錯確切格式,而 4.7 不會。

只有一個指令類型有實質變化:英文大小寫轉換,從 0/1 變成 1/1。其他都相同。真正區分兩個模型的是一個四約束鏈的提示詞,4.6 跌了一個約束,4.7 全部通過。

作者也指出幾個值得注意的限制。樣本數 N=20,IFEval 有 541 個提示詞,20 個提示詞的樣本足以看到方向,但不足以確定改善的大小。在 N=20 時的 +5pp 差異,可能是「沒有真正差異」,也可能是「真的 +10pp 改善」。

這測量的是 4.6 到 4.7 的淨效應。標記器、權重、後訓練都改變了。作者無法分離是哪個驅動了 +5pp。在「更小的 tokens」和「更好的指令遵循」之間的因果關聯仍然是一個假設。

另外,每個提示詞只有一次生成。如果每個提示詞多跑幾次,估計會更緊密。

結論是:4.7 在這個子集上比 4.6 在嚴格指令遵循上好幾個百分點。效果小,但真實。所以,這個值不值得為每次提示詞多付 1.3 到 1.45 倍的 tokens?讓我們算算實際成本。

一個 Claude Code 會話的美元帳

想像一個長時間的 Claude Code 會話——80 個回合的前後對話,用來修一個 bug 或重構程式碼。

每次回合的設定(每回合都在你上下文中的內容)包括:靜態前綴 2K 的 CLAUDE.md 加上 4K 的工具定義,總共 6K tokens,每回合都一樣。對話歷史每回合大約成長 2K(500 tokens 的使用者訊息加上 1,500 tokens 的回覆),到第 80 回合時會到約 160K。使用者輸入每回合大約 500 個新 tokens。輸出每回合約 1,500 tokens。快取命中率大約 95%(在 5 分鐘的 TTL 內很典型)。

需要先解釋一點:這 80 個回合的平均快取前綴大約是 86K tokens,不是 6K。靜態的 6K 很小;所有回合的平均歷史(第 1 回合是 0,第 80 回合是 160K,平均約 80K)才是主導因素。因為大部分的快取讀取成本發生在後面回合,那時歷史已經很巨大,所以那 ~86K 的平均才是每回合實際計費的數字。

在 4.6 版本下,第一回合快取寫入的成本是 8K 乘以每百萬 tokens $6.25,約 $0.05。第 2 到 80 回合的快取讀取是 79 乘以 86K 乘以每百萬 tokens $0.50,約 $3.40。新的使用者輸入是 79 乘以 500 乘以每百萬 tokens $5,約 $0.20。輸出是 80 乘以 1,500 乘以每百萬 tokens $25,約 $3.00。總共約 $6.65。

快取讀取占據了輸入成本的大部分。輸出則是整體成本的主導因素。

到了 4.7 版本,前綴中的每個 token 都會根據其內容類型縮放:CLAUDE.md 是 1.445 倍,所以 2K 變成 2.9K。工具定義是 1.12 倍,4K 變成 4.5K。對話歷史(大部分是英文和程式碼)是 1.325 倍,到第 80 回合時從 160K 變成 212K,整個會話平均約 106K。使用者輸入是 1.325 倍,500 變成約 660。

4.7 的平均快取前綴大約是 115K tokens(從 86K 上來)。輸出 tokens 是變數——大概和 4.6 一樣,但如果 Claude Code 的新 xhigh 預設產生更多思考 tokens,可能會高達 30%。

第一回合快取寫入的成本是 10K 乘以每百萬 tokens $6.25,約 $0.06。第 2 到 80 回合的快取讀取是 79 乘以 115K 乘以每百萬 tokens $0.50,約 $4.54。新的使用者輸入是 79 乘以 660 乘以每百萬 tokens $5,約 $0.26。輸出是 80 乘以 1,500 到 1,950 乘以每百萬 tokens $25,約 $3.00 到 $3.90。總共約 $7.86 到 $8.76。

差異大約是從 $6.65 到 $7.86-$8.76。每個會話大約多花 20% 到 30%。

每個 token 的價格沒有變。但每次會話的成本變了,因為同一個會話包含了更多 tokens。對於使用 Max 方案、碰到速率限制而不是美元上限的使用者:你的 5 小時視窗會大約按照同樣比例提早結束。在 4.6 上能跑滿整個視窗的會話,在 4.7 上大概不行。

這如何衝擊提示詞快取

提示詞快取是 Claude Code 運行的架構基礎。4.7 標記器的變化在快取上有三個交互作用。

第一次 4.7 會話是冷啟動。Anthropic 的提示詞快取是按模型分區的——從 4.6 切換到 4.7 會讓所有快取的前綴失效,就像從 Opus 切換到 Sonnet 一樣。標記器變化不是造成這個的原因,但它讓冷啟動更貴:你寫到新快取的前綴,比 4.6 的等效版本大了 1.3 到 1.45 倍。

快取的體積按照 token 比例成長。CLAUDE.md 部分多了 1.445 倍 tokens,意味著 1.445 倍更多 tokens 付一次快取寫入費用,之後每回合也多付 1.445 倍快取讀取費用。機制仍然有效,只是要付費的東西變多了。

同樣的對話紀錄,不同的計數。在 4.7 上重新跑一個 4.6 的會話,你的日誌會顯示不同的數字。如果你根據歷史 token 數量來基準計費或觀測,要預期在你切換模型 ID 的那一天會有一步變化。

反方的聲音

有人說:「輸入大多是快取讀取。每 token 的成本幾乎沒變。」

這說法有道理。在一個停留在 5 分鐘 TTL 內的會話中,96% 的輸入是每百萬 tokens $0.50 的快取讀取——已經是原價的九折。對快取部分的 1.325 倍比例,在美元上的影響比新輸入小。

但 Max 方案是計算所有 tokens 來計算速率限制,不是美元。而且有幾種模式會碰到非快取領域:每次 TTL 過期後的第一個會話、每次快取崩潰事件(CLAUDE.md 編輯、工具清單變更、模型切換)、以及每次重寫前綴的壓縮事件。在那些回合上,你要為快取寫入付全部的比例。穩定狀態是亮點,但邊緣變得雜訊更多。

另一個反方說法:「Anthropic 記錄的是 1.0 到 1.35 倍作為一個範圍,不是硬上限。」

這點同意。實際世界的加權比例(1.325 倍)落在他們範圍的上緣。個別檔案類型超過它——CLAUDE.md 在 1.445 倍,技術文件在 1.473 倍。這是有用的發現:紀錄範圍的上緣,才是大部分 Claude Code 內容所在的地方,不是中間。計畫圍繞著上限,不是平均值。

所以,對英文和程式碼來說,tokens 大約貴了 1.3 到 1.45 倍。Anthropic 為你買到了嚴格指令遵循上 +5pp 的改善。標價沒有變。但每次會話的有效成本變了。

值不值得?這取決於你送什麼。你為模型多字面地遵循你的提示詞的小但真實改善,大約多付 20% 到 30% 的會話成本。如果你寫很多技術文件或程式碼,這差異可能比 Anthropic 紀錄的中間值更接近上限。如果你的內容主要是 CJK 文字或數值資料,成本變化就小很多。重點不是害怕切換模型,而是知道你到底在付什麼,然後根據自己的使用模式做決策。