模型越新、工具叫用越歪:Ronacher 追出 Opus 4.8 憑空發明參數之謎
Flask 作者 Armin Ronacher 在部落格記錄一場詭異的除錯之旅:他的 agent 工具 Pi 不斷收到格式錯誤的編輯工具呼叫——oldText 與 newText 內容完全正確,模型卻在物件尾端多塞了發明出來的鍵,像 requireUnique、matchCase、in_file,甚至還有 oldText2、newText2 這種「自創第二組參數」。整個動物園式的清單橫跨十幾種假欄位。
反直覺的地方在於版本方向:出包的是 Opus 4.8 和 Sonnet 5 這兩個新旗艦,舊模型反而乖乖照 schema 走。失敗高度依賴上下文——單輪的「幫我改這個檔」完全無法重現,要在模型讀過檔案、診斷過問題的長 agent 對話裡才會發作,某位用戶的 session 重現率約 20%;把思考區塊從歷史裡剝掉,失敗率砍半;開啟嚴格工具呼叫(constrained decoding)則完全消除。
文章順帶科普了工具呼叫的底層真相:所謂 tool call 只是模型照訓練慣例吐出的帶標記文字,巢狀陣列參數以 JSON 字串內嵌,天生就有走鐘空間。Ronacher 推測新模型在更複雜的訓練分佈下,對這種「JSON 藏在偽 XML 裡」的格式反而更容易腦補欄位。他坦言刻意沒測 Fable,因為不確定分級路由會不會把他悄悄降級到 Opus——本站第 26 期報導過的隱形路由爭議,在這裡又客串了一次。
實務結論很清楚:能開 strict tool invocation 就開,harness 要把 schema 驗證當第一道防線,而且別假設新模型在所有介面上都比舊模型可靠。
歸剛點評|「SOTA 模型在特定工具上輸給舊型號」戳破了無腦升級的迷思。歸剛提醒自架 agent 的團隊:升級模型前先跑一輪自家工具的回歸測試,尤其是巢狀參數的工具——這篇等於免費幫大家踩過雷了。