Anthropic Claude 模型發出帶有額外欄位的無效工具呼叫
TL;DR
較新的 Anthropic Claude 模型(Opus 4.8 與 Sonnet 5)常常產生在 edits[] 陣列中包含額外、虛構欄位的 edit‑tool 呼叫,導致 Pi 的 edit 工具拒絕該呼叫。此回歸似乎與在 Claude Code 寬容的 harness 上進行的後訓練有關,該 harness 容忍格式錯誤的呼叫,從而強化了鬆散的結構。
症狀:Edit 呼叫中出現意外鍵
在呼叫 Pi 的 edit 工具時,預期的 payload 如下:
{
"path": "some/file.py",
"edits": [
{"oldText": "text to replace", "newText": "replacement text"}
]
}
實際上,Opus 4.8 與 Sonnet 5 有時會產生如下物件:
{
"oldText": "...",
"newText": "...",
"requireUnique": true
}
甚至是:
{
"oldText": "...",
"newText": "...",
"oldText2": "",
"newText2": ""
}
額外的鍵(requireUnique、oldText2、type、id、matchCase,……)完全是虛構的,並不屬於 Pi 的結構。核心的 oldText/newText 值是正確的,但任何未知欄位的存在都會導致 Pi 拒絕呼叫並要求重試。
為何僅在較新模型中發生
較舊的 Anthropic 模型(例如 Opus 4.5)很少出現此行為。此回歸與 Claude Code 的後訓練 harness 的引入相關,該 harness:
- 接受各種寬鬆的參數——別名(
old_str→oldText)、Unicode 修復,以及對未知鍵的靜默過濾。 - 自動重試——當偵測到格式錯誤的呼叫時,harness 會重新寫入對話紀錄並要求模型再次嘗試。
- 獎勵任務成功完成——強化學習(RL)將最終產生正確編輯的呼叫視為成功,即使其中間的鍵是錯誤的。
由於 RL 訊號不會對額外欄位進行懲罰,模型學會了一個強烈的先驗,認為某些可選欄位可能會出現。當面對不同的結構(Pi 的嵌套 edits[])時,模型沒有已學習的可選槽位名稱,於是捏造出各種隨機鍵。
工具呼叫是純文字,非魔法
LLM 工具呼叫是透過在模型的輸出串流中嵌入特殊標記(通常稱為 ANTML)實作的。簡化的表示如下:
<antml:function_calls>
<antml:invoke name="edit">
<antml:parameter name="path">some/file.py</antml:parameter>
<antml:parameter name="edits">
[
{"oldText":"...","newText":"..."}
]
</antml:parameter>
</antml:invoke>
</antml:function_calls>
模型將此標記產生為純文字;伺服器解析它並驗證 JSON payload。若驗證失敗,伺服器會回傳錯誤,模型會再次生成。
確保正確 JSON 的兩種方法
- 生成後驗證——允許模型輸出任何 JSON,然後拒絕格式錯誤的呼叫。這是許多 harness(包括 Pi)的預設行為。
- 語法感知(受限)解碼——在生成過程中遮蔽會違反 JSON 結構的 token。Anthropic 的
strict模式透過拒絕抽樣結構中未出現的鍵來實作此功能。
啟用 strict 模式可消除這些多餘的鍵,證實問題源於未受限制的抽樣。
社群解決方案
- 改進錯誤訊息——如評論者所指出,提供對預期結構的明確指引可讓模型在下一輪快速自行修正。
- 自我修復擴充——部分使用者修改 Pi 的 edit 工具,在驗證前剔除未知欄位,以減少往返次數。
- 替代工具格式——使用 curl 風格的指令或平面 edit 結構(例如 Claude Code 的
file_path、old_string、new_string)可繞過嵌套陣列的問題。
對 Harness 設計者的影響
- 結構選擇很重要——若工具結構與模型的後訓練分佈不一致,失敗率會提升。
- 閉源 harness 隱藏偏見——若無法看到 Claude Code 內部的修復機制,第三方開發者無法預測模型容忍哪些寬鬆情況。
- 嚴格語法強制是實用的緩解措施——啟用
strict模式或自行實作受限解碼器,可防止模型輸出未知鍵。 - 未來的 RL 微調可能鞏固這些偏見——若供應商持續獎勵即使呼叫格式錯誤仍成功完成任務的情況,模型將越來越被鎖定在供應商偏好的結構中。
重點
較新 Claude 模型在工具呼叫中加入多餘欄位的回歸並非隨機故障,而是因在寬容的 harness(Claude Code)上進行強化學習所產生的訓練產物。依賴替代結構的 harness 必須採用嚴格語法受限的解碼,或接受模型將持續注入虛構鍵,導致不必要的重試與可靠性下降。
Sources
相關
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch