跳至主要內容

    Agent 駕馭工程懶人包 (8)|換模型後,駕馭層為什麼失靈?四方整理

    把 coding agent 的 model 欄位改成新模型後,編輯呼叫可能被退回,替舊模型加的提醒也可能變得多餘。整理 Cursor、Armin Ronacher、LangChain 的 Vivek Trivedy 與 Anthropic 對換模型失靈的觀察,附對照表與換模型前的檢查。

    sunny 桑尼· · 15 MIN READ · 144 次瀏覽

    Agent 駕馭工程懶人包 (8)|換模型後,駕馭層為什麼失靈?四方整理
    本文目錄

    你把 coding agent 設定檔裡的 model 欄位,從舊模型改成剛發表的新模型,其他一個字都沒動。跑原本那批任務,可能先看到編輯工具的呼叫被退回,接著是同一件事多繞了幾圈;規則檔裡當初為了壓住舊模型毛病而加的提醒,讀起來也像是多餘的。駕馭層(Harness,模型以外讓 agent 能做事並被控制的整套軟體)是照某個模型調出來的,換了模型,它不會自動跟上。

    這篇整理四方的觀察:Cursor 的工程團隊、Flask 作者 Armin Ronacher、LangChain 的 Vivek Trivedy,以及 Anthropic。

    快速回答 駕馭層(harness)是模型以外、讓 agent 能做事並被控制的整套軟體;換模型後,它可能在五處失靈:編輯工具的格式、工具參數的細節、對話中途切換、提示詞,以及替舊模型加的補丁。Cursor 給每個模型它訓練時用的工具格式;LangChain 2026 年 4 月報告,逐模型調整設定後,GPT 5.3 Codex 在多輪工具使用評測 tau2-bench 的一個子集上,成績從 33% 升到 53%。我的建議是把換模型當成一次發版:有可重跑的任務集,就逐處驗過再切換。

    換模型後,駕馭層會在哪些地方失靈?

    失靈集中在編輯工具的格式、工具參數的細節、對話中途換模型、提示詞與工具要逐模型調、舊補丁變成死重這五處。下表把四方的說法放在一起,每列的出處在後面各節。

    項目名稱原因誰遇到怎麼緩解

    編輯格式不合
    原因
    模型訓練時用的編輯格式不同
    誰遇到
    Cursor;LangChain
    怎麼緩解
    每個模型配它訓練時的工具格式
    工具參數被亂加欄位
    原因
    訓練環境養成的偏好(Armin 的假說)
    誰遇到
    Armin Ronacher(調查 Pi 時)
    怎麼緩解
    開 strict 模式(平台強制參數合規格)
    中途換模型
    原因
    歷史由別的模型寫;快取按模型分開
    誰遇到
    Cursor
    怎麼緩解
    一段對話固定一個模型,或交給子代理
    提示詞與工具要逐模型調
    原因
    各家提示指南的慣例不同
    誰遇到
    LangChain;Cursor;Anthropic 文件
    怎麼緩解
    LangChain 逐模型設定表(profile);Cursor 逐模型客製
    舊補丁變死重
    原因
    補丁預設的模型缺陷後來消失
    誰遇到
    Anthropic;Cursor
    怎麼緩解
    換模型時重新測試每個補丁

    表 1 換模型時駕馭層的五種失靈(本站依下文來源歸納;「怎麼緩解」欄是各來源自己的做法,本站的建議在最後一節)。

    圖 1 換模型時要檢查的接點(本站依下文四方來源歸納)。

    圖 1 的四個實線接點,各有來源提到:編輯格式(Cursor、LangChain)、工具參數(Armin Ronacher)、提示詞(LangChain、Cursor、Anthropic 文件)、舊補丁(Anthropic、Cursor)。虛線的對話歷史只在同一段對話中途換模型時出現,說法來自 Cursor。

    換模型後,編輯工具為什麼會出問題?

    編輯格式和模型訓練時用的不同,就會多花 token、也多出錯,所以 Cursor 與 LangChain 都替每個模型換編輯工具。回到開頭那批任務,換完模型最先看到的,就是編輯工具的呼叫被退回。Cursor 在 2026 年 4 月 30 日的〈continually improving our agent harness〉(署名 Stefan Heule 與 Jediah Katz)裡寫:

    "OpenAI's models are trained to edit files using a patch-based format"、"Anthropic's models are trained on string replacement." (Cursor, 2026-04-30)

    文章接著說,兩種模型都能用兩種工具,但給它不熟的那種,會多花推理 token,也多出錯;所以 Cursor 的做法是 "we provision each model with the tool format it had during training."(給每個模型它訓練時用的工具格式)。

    LangChain 的 Deep Agents 團隊在 2026 年 4 月 29 日的文章裡做了同一件事:替 GPT 5.3 Codex 的設定把預設的檔案編輯工具換成 apply_patch,並把 execute 工具改名叫 shell_command。

    第二個例子來自 Armin Ronacher 2026 年 7 月 4 日的〈Better Models, Worse Tools〉。他從 coding agent Pi 的一則 issue 追查起,發現 Claude Opus 4.8 與 Sonnet 5 有時會在編輯工具的巢狀 edits[] 陣列裡,加進工具參數規格(schema)沒有定義的欄位,例如 requireUnique。編輯內容大多正確,但多出來的欄位讓 Pi 退回呼叫。他寫道,更舊的模型沒有這個現象。

    在另一位使用者的一段對話紀錄(session)裡,他看到 Opus 4.8 約 20% 的呼叫失敗;把紀錄裡模型的思考區塊(thinking blocks)拿掉,失敗率降到一半。他對原因的說法是假說:

    "My strongest hypothesis is that this is not random deterioration but a training artifact." (Armin Ronacher, 2026-07-04)

    他的推測是,模型後訓練(post-training)時用的 harness 可能像 Claude Code 一樣,會悄悄吸收格式不對的呼叫,結果養成了鬆散的習慣;Claude Code 的編輯工具是扁平結構,Pi 的是巢狀。文中沒有證實這個因果。他實際有效的緩解是開啟 strict tool invocation(嚴格工具呼叫,由平台強制參數符合 schema),"eliminated it in my runs"(在我的測試裡消除了這個現象);他也提醒 strict 模式對工具定義的複雜度有上限。他並且說 "Fighting that prior is probably futile if you want to get the best model performance."(如果想讓模型發揮最佳表現,對抗它訓練養成的這種偏好大概白費力氣)。

    工程上的意思: 這一類問題先從工具層排查,優先動的是工具定義與呼叫驗證。檢查方法是換模型後看工具呼叫的退回率,並且把「被退回的呼叫長什麼樣」存下來。

    對話進行到一半換模型,會多付什麼代價?

    中途換模型會遇到歷史不合與快取失效兩件事,Cursor 建議一段對話固定一個模型。這是開頭情境的分支:如果你在一段進行中的對話裡切換模型,而沒有去改設定檔,同一批任務會多付下面兩項代價。Cursor 的文章說,支援使用者在對話中途切換模型特別難,因為不同模型有不同的行為、提示詞與工具形狀。它列出的問題有兩個:

    1. 新模型得在另一個模型產生的對話歷史上使用工具,歷史對它來說 out of distribution(和訓練時看過的分布不同)。
    2. 快取按供應商與模型分開,換模型等於快取落空,第一輪又慢又貴。

    摘要可以緩解,但文章指出,任務做到一半時摘要會漏掉重要細節。Cursor 的結論是:除非有理由,一段對話建議固定一個模型;需要另一個模型時,改派子代理,因為子代理從全新的 context 起頭。

    提示詞也要逐模型調嗎?

    提示詞與工具要逐模型調,LangChain 與 Anthropic 的文件都這樣說,Cursor 也說自己的做法包含逐供應商的提示詞。回到開頭的規則檔,當初為舊模型加重語氣的那幾句,換模型後就是要重新檢查的對象。LangChain 的 Vivek Trivedy 與 Mason Daugherty 在 2026 年 4 月 29 日的文章裡下結論:"A single harness can't be optimal for every model."(單一 harness 不可能對每個模型都最佳)。他們的做法叫 harness profile,像替每個模型各備一張設定表:可以覆寫 system prompt 的前後綴、工具的納入與命名,也能分別設定 middleware(夾在模型與工具之間的處理步驟)、子代理與 skills;換模型時,呼叫端的程式碼不必動。

    他們在 tau2-bench(測多輪工具使用與遵循指令)的一個較難的子集上,報告了這組數字:

    項目名稱預設 harness套用 profile 後

    GPT 5.3 Codex
    預設 harness
    33%
    套用 profile 後
    53%
    Claude Opus 4.7
    預設 harness
    43%
    套用 profile 後
    53%

    表 2 LangChain Deep Agents 的 profile 效果。來源:LangChain Blog, 2026-04-29。子集題數與重複次數文章未說明;profile 同時改了提示詞、工具與 middleware,無法分出哪一項貢獻最大。

    Trivedy 在 2026 年 2 月 17 日另一篇文章裡寫過同樣方向的結果:模型固定為 gpt-5.2-codex,只改 harness,deepagents-cli 在 Terminal Bench 2.0 從 52.8 提高到 66.5。同一篇還提到,用 Claude Opus 4.6 測的是較早版本的 harness,得 59.6%,作者形容為「有競爭力但不如 Codex」,原因是沒有替 Claude 跑同一套改進迴圈。

    Anthropic 這邊,文件頁(查閱於 2026-10-23)寫到 Claude Opus 4.5 與 4.6 對 system prompt 更敏感:

    "If your prompts were designed to reduce undertriggering on tools or skills, these models might now overtrigger." (Anthropic, Prompting best practices,查閱於 2026-10-23)

    建議是把 "CRITICAL: You MUST use this tool when..." 這類強硬措辭降級成一般語氣。換句話說,原本為了防止漏用工具而加重的語氣,換到 Opus 4.5 或 4.6 上,可能讓模型過度呼叫工具。Cursor 的文章也提到,OpenAI 的模型在遵循指令上傾向更字面、更精確,並說它曾替一個出現「context anxiety」(context 快滿時開始拒絕工作)的模型,用提示詞修改減輕這個行為。

    工程上的意思: 提示詞與工具設定要能按模型分開存放。LangChain 把差異收進 profile,Cursor 說自己的 harness 抽象與模型無關,但可以逐模型客製;兩者的共通點是模型專屬的部分單獨一層,換模型時只換那一層。

    舊補丁什麼時候該拆?

    補丁針對的模型缺陷消失後,它就變成死重;Anthropic 建議在模型變強時重新檢驗每個補丁的假設。開頭說規則檔裡那些壓舊模型毛病的提醒讀起來多餘,原因就在這裡。Anthropic Claude Platform 團隊的 Lance Martin 在 2026 年 4 月 2 日的文章裡寫:

    "Agent harnesses encode assumptions about what Claude can't do on its own, but those assumptions grow stale as Claude gets more capable." (Lance Martin, Anthropic, 2026-04-02)

    他舉的例子是 context anxiety:Sonnet 4.5 感覺到 context 快到上限時會提早收尾,團隊因此加了清空 context 的重置機制;換成 Opus 4.5,這個行為不見了,原文說那些重置 "had become dead weight in the agent harness"。文章把「現在可以停止做什麼?」(what can I stop doing)列為修剪的問題。

    Cursor 也在拆。2024 年底它花了很多功夫做護欄,例如每次編輯後把 lint 與型別錯誤丟給 agent、限制單輪最多可呼叫的工具數;文章說這是兩種護欄,前者是替模型事先備好的資訊,後者是限制。文章說,事先固定塞給模型的資訊現在 "mostly long gone"(多半已經不在),改成讓模型需要時自己去取。

    工程上的意思: 每個補丁至少要記兩件事:它針對哪個模型、壓的是哪個失敗。沒有這兩個欄位,換模型時就無從判斷該不該拆。

    四方的說法哪裡一致,哪裡不同?

    四方一致的地方是駕馭層的某些部分和模型綁在一起,換模型要重新檢查;不同的地方是遇到綁定後的應對方向。

    項目名稱做法誰這樣說

    順著模型走
    做法
    每個模型配它熟悉的工具與提示
    誰這樣說
    Cursor;LangChain
    在外面加保證
    做法
    平台強制參數符合 schema,模型不動
    誰這樣說
    Armin Ronacher
    定期拆掉
    做法
    模型變強後重測並移除舊補丁
    誰這樣說
    Anthropic;Cursor

    表 3 遇到綁定後的三種應對方向(本站歸納)。Armin 也認為對抗訓練留下的偏好大概白費力氣,所以他的結論接近「順著走」再加保證。

    文中引用的數字都來自各自的環境,沒有第三方重現。Armin 的因果說法是假說;LangChain 的數字來自單一子集;Cursor 的文章沒有給失敗率。研究文獻也開始碰這個問題:Kyungmin Kim 等人的〈The Interplay of Harness Design and Post-Training in LLM Agents〉(arXiv,2026 年 6 月 24 日投稿,9 月 28 日修訂 v2)在擴充過的 ALFWorld 環境裡把 harness 當成可調變數。摘要寫的結果是:後訓練時把駕馭層設計納入考量,能改善模型在熟悉設定下的表現,也有助於適應沒見過的設定;如果後訓練只用最低限度的駕馭層,之後工具變動較大時,表現會明顯下降。這個實驗環境和商用 coding agent 差得遠,只能當方向參考。

    換模型之前先做什麼?

    把換模型當成一次發版,先驗過編輯工具、提示詞與補丁再切換。我的建議分三步,前提是你的 agent 已經有一批可重跑的任務:

    1. 用自己的任務在新模型上跑一遍,記兩種比率:工具驗證退回呼叫的退回率(工具層的問題),以及模型拒絕做事的拒絕率(像 context anxiety 那類行為問題)。前者是 Cursor 與 Armin 的問題最先顯示的地方。
    2. 把模型專屬的提示詞與工具設定拆成獨立一層,照 LangChain 的 profile 或 Cursor 的逐模型客製的方式;一段對話中途不換。
    3. 給每個補丁標上針對的模型與失敗,換模型時逐一比較保留與移除補丁的結果,只留下仍能避免該失敗的補丁。

    沒有可重跑的任務集時,第一步做不了,先補任務集比先讀完這四方的文章更有用。

    回到開頭那一行 model 欄位:改一個字很快,驗證要跑一輪。新模型上線後,先問哪個補丁已經用不到,再問哪個接點開始出錯。

    下一篇把 12 個 Agent 框架放進同一張表,看 Deep Agent 派與從基礎打造派各內建了哪些能力。

    常見問題

    換模型後 agent 變差,要先看哪裡?

    先看工具呼叫有沒有被退回,再看提示詞。Cursor 說格式不熟的工具會多花推理 token、多出錯;Armin Ronacher 在 coding agent Pi 裡看到 Claude Opus 4.8 與 Sonnet 5 在巢狀編輯參數裡加了不存在的欄位。這兩類都能從工具呼叫紀錄看出來,不必先猜模型變笨。

    Strict tool invocation 能解決工具參數亂加欄位的問題嗎?

    Strict tool invocation 由平台強制工具參數符合規格。Armin Ronacher 表示,在他自己的 Pi 測試裡,開啟後消除了參數亂加欄位的現象;他同時指出 strict 模式對工具定義的複雜度有上限。文章只報告了他的環境,換成別的工具結構是否一樣有效,文章沒有說。

    一段對話可以中途換模型嗎?

    可以,但有代價。Cursor 指出,新模型要接手另一個模型留下的對話紀錄,快取也會落空,切換後第一輪更慢更貴。它建議除非有理由,一段對話固定一個模型;需要別的模型時改派子代理(另開、帶獨立對話內容的 agent),讓它從全新的 context(模型這次讀到的全部內容)開始工作。

    為舊模型寫的提示詞,換新模型後還要留嗎?

    要重新測。Anthropic 文件說,Opus 4.5 與 4.6 對 system prompt 更敏感,原本為了防止漏用工具而加的強硬語氣,現在可能造成過度觸發(模型在不需要時也呼叫工具)。LangChain 的做法是把模型專屬的提示詞與工具設定收進 profile(逐模型設定表),每個模型各用一份。

    延伸閱讀

    參考資料

    留言0

    登入後就能留言。

    登入