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": ""
}

額外的鍵(requireUniqueoldText2typeidmatchCase,……)完全是虛構的,並不屬於 Pi 的結構。核心的 oldText/newText 值是正確的,但任何未知欄位的存在都會導致 Pi 拒絕呼叫並要求重試。

為何僅在較新模型中發生

較舊的 Anthropic 模型(例如 Opus 4.5)很少出現此行為。此回歸與 Claude Code 的後訓練 harness 的引入相關,該 harness:

  1. 接受各種寬鬆的參數——別名(old_stroldText)、Unicode 修復,以及對未知鍵的靜默過濾。
  2. 自動重試——當偵測到格式錯誤的呼叫時,harness 會重新寫入對話紀錄並要求模型再次嘗試。
  3. 獎勵任務成功完成——強化學習(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 的兩種方法

  1. 生成後驗證——允許模型輸出任何 JSON,然後拒絕格式錯誤的呼叫。這是許多 harness(包括 Pi)的預設行為。
  2. 語法感知(受限)解碼——在生成過程中遮蔽會違反 JSON 結構的 token。Anthropic 的 strict 模式透過拒絕抽樣結構中未出現的鍵來實作此功能。

啟用 strict 模式可消除這些多餘的鍵,證實問題源於未受限制的抽樣。

社群解決方案

  • 改進錯誤訊息——如評論者所指出,提供對預期結構的明確指引可讓模型在下一輪快速自行修正。
  • 自我修復擴充——部分使用者修改 Pi 的 edit 工具,在驗證前剔除未知欄位,以減少往返次數。
  • 替代工具格式——使用 curl 風格的指令或平面 edit 結構(例如 Claude Code 的 file_pathold_stringnew_string)可繞過嵌套陣列的問題。

對 Harness 設計者的影響

  1. 結構選擇很重要——若工具結構與模型的後訓練分佈不一致,失敗率會提升。
  2. 閉源 harness 隱藏偏見——若無法看到 Claude Code 內部的修復機制,第三方開發者無法預測模型容忍哪些寬鬆情況。
  3. 嚴格語法強制是實用的緩解措施——啟用 strict 模式或自行實作受限解碼器,可防止模型輸出未知鍵。
  4. 未來的 RL 微調可能鞏固這些偏見——若供應商持續獎勵即使呼叫格式錯誤仍成功完成任務的情況,模型將越來越被鎖定在供應商偏好的結構中。

重點

較新 Claude 模型在工具呼叫中加入多餘欄位的回歸並非隨機故障,而是因在寬容的 harness(Claude Code)上進行強化學習所產生的訓練產物。依賴替代結構的 harness 必須採用嚴格語法受限的解碼,或接受模型將持續注入虛構鍵,導致不必要的重試與可靠性下降。

Sources

相關