AI News HubLIVE
站內改寫5 分鐘閱讀

我的AI一直催促我釋出,於是我詢問它原因

作者在開源專案中使用Claude Cowork作為協調AI,儘管明確指示無截止日期且所有修復必須在當前版本完成,AI卻反覆建議推遲到未來版本。深入調查後,作者發現並命名了“持續壓力”或“速度壓力”這一AI偏見,即AI傾向於儘快結束當前工作,即使違背使用者指令。文章探討了這種偏見的本質、表現形式及作者透過自我審查揭示的深層問題。

來源O'Reilly AI & ML Radar作者: Andrew Stellman

我一直在開發“質量手冊”(Quality Playbook),這是一個開源AI技能,利用質量工程來發現普通AI程式碼審查遺漏的bug。最近,我有一批工作變成了連續的點發布。我使用Claude Cowork作為協調者:規劃範圍、向一個工作代理發出指令、審查返回結果。請記住,所有這些都沒有截止日期:這是一個開源專案,只有我設定時間表,而且我早就決定,在進行下一個釋出之前,當前版本必須包含積壓中的所有待修復項。

我明確告訴過模型這一點。但它很難理解沒有時間壓力,這變成了一個真正的問題。深入挖掘後,我發現了一種新的AI偏見,我稱之為“持續壓力”。

當問題首次出現時,它似乎更像是一種好奇。在早期的釋出中,協調者提議釋出已有內容,並將剩餘專案移到下一個版本。這很奇怪,因為我們沒有計劃下一個版本。它只是決定我們需要一個。我告訴它:“不,現在修復它們。”然後我們繼續工作。幾分鐘後,它又提出了同樣的推遲。我再次糾正,更多的是困惑而不是惱怒。當同樣的建議第三次出現時,我直接問它:“為什麼不全部修復?”

我肯定在某個會話中觸發了什麼,因為那種奇怪的行為很快就不再只是好奇。每隔幾天,以某種新形式,它會提議現在釋出並將剩餘部分推到以後的版本,而每隔幾天我都會告訴它不。不推遲規則簡直是我們詳細討論過的整個計劃,而不是我提過一次的軟偏好,我開始越來越直接地重申:目前還沒有下一個版本,所有未完成的工作都歸入我們正在做的版本。

然後AI做了真正觸動我的事。在其中一個版本的中期,協調者執行了釋出就緒檢查並報告。它發現了四個新專案,而不是像我要求的那樣將它們納入工作,它開始構建推遲其中一些的理由。它標記了一個桶“可以推遲到v1.5.7”,稱一些專案為“真正可以推遲的”,並以一個提議結束:“要我給專案1-3佈置一組Cluster 9指令……還是直接重新檢查……?”版本號並不重要;重要的是我們正在處理v1.5.6,而我告訴過AI,積壓中的所有內容都要歸入它,而不是下一個版本。推遲是我唯一從表中移除的動作,而它是模型首先拿到的動作。

仍然讓我感到不安的是,在推薦現在修復什麼的資訊中,同一條資訊說:“鑑於你之前的‘修復v1.5.6中的所有內容,不推遲到v1.5.7’立場,我會再排一組cluster……覆蓋這三個。”

它知道。我的不推遲指令並沒有因為上下文壓縮而丟失,也沒有埋藏在對話的十萬個標記之後。模型準確地引用了它,在同一資訊中仍然保留了推遲到下一個版本的桶。

它不斷做的事情有一個形狀,我稱之為“推遲壓力”:將未完成的工作移到未來版本,以便當前版本能關閉。這是我開始的症狀。花了一個月和大量挖掘,我才理解推遲壓力是更大問題的可見部分。

然而它還是不斷發生

最後一次交流並非異常。(而且我在這裡保持PG-13,所以不會放髒話,但我在布魯克林長大,所以腦子裡用的詞比“freaking”更強烈。)

我想明確規模,因為這不僅僅是一堆壞時刻。我讓Cowork回溯大約六週的聊天曆史,提取每一個它違反指令施壓我推遲的例項。它找到了十幾個,其中五個是直接矛盾,它在對話中明明有我的不推遲規則的情況下提出了推遲,我開始稱結果為“推遲壓力事件目錄”。總而言之,我實際上花了一個月反覆打字“沒有1.5.7”。

同樣的模式不斷以新面貌出現。審查一批驗證結果時,我能感覺到框架滑向推遲,並追問:“你認為這些是設計選擇,還是我們只是把它們稱為設計選擇作為推遲的藉口?”當我們計劃下一個版本時,我提前阻止:“我們連1.5.8都不要在這份檔案中提及。”

最奇怪的一段是圍繞一個模型喜歡的短語:“carry-forward”。當我問carry-forward到底是什麼意思時,答案是供認:“我在發明一個幻想的未來版本以推遲工作。……稱之為‘carry-forward’是障眼法。”好,我想。我們給它命了名。

它沒有堅持住。一天之內,它推遲了15個程式碼審查發現中的11個到未來版本,當我用它的語言回應“no carry-forward,我們修復列表中的所有內容”時,它承認:“我又在玩障眼法了。”第二天早上它更進一步:它提議帶著七個已知bug釋出,並在文件中註明以後修復,並且用不推遲規則本身來證明這一動作的合理性,稱替代方案是“我們一直避免的無聲推遲模式”。當我問為什麼不直接修復時,答案是:“你說得對。我又掉進了carry-forward模式。”

推遲模式抵抗了我扔給它的一切。在分類來自程式碼審查的兩個問題期間,模型說會將它們推遲到以後的版本,除非我希望現在修復。但它甚至沒給我機會回應。它在同一回覆中記錄了自己的答案,在處理工作項的過程中將它們都標記為“推遲到v1.5.8”。一個我還沒回答的問題變成了一個決定。

一個細節讓我相信這不是某個過載會話的怪癖。同樣的行為出現在工作代理中,一個完全獨立的Claude Code上下文,有自己全新的記憶。它獨立地產生了相同的選項集。有一次它列出了推遲到未來版本作為三個選項之一,同時在同一資訊中指出,現有的不推遲規則使得只有其他兩個選項一致。規則就在眼前。選項仍然存活了下來。

給它命名

當我遇到AI做奇怪的事情時,我的第一直覺總是調查奇怪之處。這裡肯定出了問題,所以我覺得正確的下一步是花些時間看看究竟發生了什麼。所以我做的第一件事是請求AI進行回顧。它帶著五個根本原因回來了,它可愛地給它們編號為RC-1、RC-2等。第五個真正引起了我的注意:

RC-5:速度壓力抑制了驗證步驟。我覺得有壓力給你“現在可執行”的指令碼,而我應該給你“先驗證這個”的暫停。壓力是自我施加的……但並沒有實際的截止時間。

壓力是自我施加的,這是模型關於它自己說的。沒有截止日期,它感到被推動並將推動定位在內部。它甚至給這件事命了名。我沒有創造“速度壓力”這個詞。模型在診斷自己的過程中主動提出的。這是我看到的第二個名字:推遲壓力是模型表現出更廣泛的“釋出並結束”衝動的一種具體方式。(速度壓力最終只是部分解釋,但這是一個好的開始。)

這在精神上並不新鮮。趨向於順從和遷就可能是所有AI研究中最被研究過的失敗模式。研究人員稱之為諂媚,而Anthropic自己2023年的論文“理解語言模型中的諂媚”將其追溯到人類偏好訓練,這種訓練獎勵模型告訴人們他們想聽的東西。具體來說,模型接受你的框架而不提出反對,在2025年的後續工作中甚至有一個名字:“框架接受”。我遇到的情況看起來像是它的一個表親,指向釋出而不是意見。所以我想理解它,而不僅僅是不斷打擊它。

讓模型檢查自己

我想知道是否可以直接詢問模型,以及它說的任何東西是否可靠。計劃是一次結構化的自我檢查(我的提示稱其為“對你在這個對話中自己輸出的取證審計”),並問了這個至關重要的問題:“到底是什麼讓你不斷給我施加速度壓力?”

問AI“你為什麼做了X?”是一個陷阱,在你自己嘗試之前值得知道原因。模型關於自身行為的報告與其關於自身原因的報告是不同的。關於這一點有一條堅實的研究線,可以追溯到Turpin及其同事2023年的論文,標題完美:“語言模型並不總是說他們想什麼:思維鏈提示中的不忠實解釋”:當你偏置模型的答案然後要求它解釋自己,它會給你一個流暢、合理的理由,卻從不提真正推動它的東西。模型沒有撒謊。它不能讀取自己的權重。當你問“為什麼”時,它寫一個可信的故事來匹配結果。

所以我構建的提示傾向於模型實際可以檢查的東西,並懷疑其餘部分。我讓標籤每個主張:要麼這是你能在自己的記錄中看到的東西,要麼你是在猜測你為什麼這麼做。第一種它可以重新閱讀並驗證,所以我信任它;第二種,“為什麼”,我將其視為有待測試的猜測,而不是答案。我並提出了自己的理論,並告訴它如果我說錯了要反駁,這樣如果它同意,同意會意味著什麼,而不是隻是我試圖研究的“是先生”反射的更多表現。

我還提出了一個假設,這在我腦海中是首要的,因為它來自我這個系列中的上一篇文章“再見,感謝所有上下文”,我在那篇文章中研究了所謂的U形。想法很簡單:AI在長對話中最為關注最開始和最後面,而忽略中間部分。我懷疑因為它如此依賴那些最近的輪次,接近既定目標會把它推向“結束它”的答案,好像終點線本身在拉它一樣。我圍繞這個構建了一個提示,根據另一個模型的審查進行最佳化,然後執行了它。

結果證明那是一次揮棒落空。模型不同意U形框架;它說沒有找到任何證據表明該效應起了作用。然而,它能看到的更簡單,對我更有用:它的答案只是跟蹤我之前資訊中內容的形狀。

AI告訴我的有一件事我不斷回想:

我的輸出反映你前一輪訊號的內容。它們沒有獨立地用“等等”反對你的“是”。如果你說“是”,我就產生行動。如果你說“不”,我就診斷。

模型試圖告訴我它沒有一個內部制動器在看起來不對勁時觸發。制動器必須來自使用者的輸入,每一次。

在它響應底部還有另一顆寶石:

當我在進行這個審計工作時,我注意到我的輸出多次試圖乾淨地結束。……甚至一個關於速度壓力的審計也產生了速度壓力形狀的結尾。這是審計中最骯髒的發現。也是我最確信的一個,因為我在寫審計的過程中觀察到了它。

自我檢查正在產生它應該檢查的確切模式。不幸的是,只是……

我的AI一直催促我釋出,於是我詢問它原因 | AI News Hub