宅中地 - 每日更新
宅中地 - 每日更新

贊助商廣告

X

卡內基梅隆大學與亞馬遜聯手揭秘:AI寫代碼越來越厲害,但它真的"懂"自己在寫什麼嗎?

2026年06月02日 首頁 » 熱門科技

這項由卡內基梅隆大學與亞馬遜研究院聯合開展的研究,以預印本形式發布於2026年5月,論文編號為arXiv:2605.26457。感興趣的讀者可通過該編號在arXiv平台查閱完整原文。

當我們把一道菜的做法用文字寫下來,廚師才能照著做出正確的菜——這個"寫法"在軟體世界裡就叫做"規範"(specification)。近些年來,AI寫代碼的能力突飛猛進,但有一個關鍵問題一直被忽視:AI生成的代碼是否真的做了它應該做的事?更深層的問題在於,AI能不能把一道用自然語言寫成的"菜譜",準確翻譯成一份嚴格的、可被電腦驗證的"標準食譜"?卡內基梅隆大學與亞馬遜的研究團隊決定正面回答這個問題,並為此專門建造了一套完整的測試系統。

研究團隊搭建了一個名為VERUS-SPECGYM的測試環境,以及一套包含581道題目的題庫VERUS-SPECBENCH,專門用來考察AI模型能否把編程競賽題目的中文自然語言描述,轉化為一份可被機器嚴格驗證的"菜譜"——這個過程他們稱之為"規範自動形式化"。結果發現,即便是最強的前沿AI模型,也只能完成不到八成的任務,而開源模型的成績更是慘澹。這項研究揭示了一個容易被忽視的瓶頸:AI寫出正確的代碼,和AI真正"理解"任務要求,是兩件截然不同的事。

一、為什麼"菜譜寫對了"和"菜做對了"是兩回事

要理解這項研究的意義,先來思考這樣一個場景:你去餐廳點了一份"不加辣的紅燒肉",廚師端來一盤確實沒有辣椒的菜,但裡面用了大量花椒——從嚴格意義上說,花椒也是辛辣調料,你的要求其實沒有被滿足。問題出在哪?不是廚師手藝不好,而是那份"不加辣"的要求本身描述得不夠精確。

軟體開發中的情況完全一樣。當一個程序經過"形式化驗證"(formal verification)之後,電腦會保證這個程序嚴格符合某份規範文件的要求。這種保證是數學級別的,非常可靠。但這份保證有一個前提條件——規範文件本身必須準確描述了用戶的真實意圖。如果規範寫錯了,哪怕程序通過了所有驗證,它實際上仍然可能是個"錯誤的程序"。

研究團隊用一個精妙的比喻來描述這個問題:規範太寬鬆,就像菜譜上寫"加適量鹽"——任何一個廚師都能說自己做對了,但菜可能完全不好吃;規範太嚴格,就像菜譜上寫"每一粒米必須煮恰好七分鐘"——正確的做法反而可能被判定為錯誤。

為了精確描述這個問題,研究團隊把"規範是否正確"分解成四個維度來檢驗。第一是"前置條件完整性":對於所有合法的輸入,規範是否都接受?第二是"前置條件健全性":對於所有非法的輸入,規範是否都拒絕?第三是"後置條件完整性":對於所有正確的輸出,規範是否都接受?第四是"後置條件健全性":對於所有錯誤的輸出,規範是否都拒絕?只有當這四個維度全部通過測試,才能說這份規範真正"忠實地"反映了題目的要求。

用更直觀的例子來說:假設有一道二分查找題,要求在一個有序數組中找到目標值第一次出現的位置,找不到則返回-1。前置條件完整性要求:給定一個合法的有序數組,規範必須接受它——如果規範只允許嚴格遞增的數組,那麼包含重複元素的合法數組就會被錯誤拒絕。前置條件健全性要求:一個無序數組不應該被接受。後置條件完整性要求:當答案確實是-1時,規範必須接受-1這個輸出。後置條件健全性要求:如果目標值在數組中第二次出現的位置被作為答案返回,規範必須拒絕——因為題目要求的是"第一次出現"。

二、一套精妙的"自動閱卷機器"是如何建造出來的

要評判AI寫出的規範是否正確,本身就是個難題。研究團隊面臨的困境類似於:如何在沒有標準答案的情況下,判斷一道填空題是否做對了?

一種方法是請專家來判斷,但請專家為581道題各寫一份參考答案,成本高得驚人。另一種方法是用另一個AI來當"評卷老師",但AI評卷員可能和出題AI犯同樣的錯誤,無法識別那些微妙的漏洞。

研究團隊選擇了第三條路:把規範變成可以運行的代碼,然後用真實的測試數據來檢驗它。這個思路聽起來簡單,但實現起來頗有技巧。

規範在Verus(一種專門用於驗證Rust代碼的工具)中被寫成邏輯謂詞,類似於數學公式,並不能直接當作普通程序來運行。研究團隊擴展了Verus內置的一個叫做`exec_spec`的機制,讓它能夠自動把這些邏輯公式"翻譯"成可執行的Rust函數,進而在真實輸入上運行,得到一個明確的"接受"或"拒絕"的答案。這就好比把一道數學定義題里的"充要條件",自動轉化成一段可以在電腦上運行的驗證程序。

這套翻譯機制支持了相當豐富的數據類型,包括序列(類似列表)、集合、多重集合和映射(類似字典),同時還支持多變量的量詞表達式,比如"對所有滿足某條件的下標i和j,都有某個性質成立"這樣的語句。對於每一道題目的每一個測試樣例,評卷流程分兩步進行:先嘗試用數學推理(SMT求解器)來直接證明規範是否接受或拒絕這個測試樣例;如果數學推理在規定時間內無法得出結論,就轉而把規範編譯成可執行代碼,直接運行一遍得到答案。

測試數據的來源同樣經過精心設計。官方Codeforces題目自帶的測試數據被用來填充"合法輸入"和"正確輸出"兩個類別。但僅有這些還不夠——這些官方測試數據往往無法覆蓋所有邊界情況,很容易讓一個"差不多正確"的規範僥倖通過。研究團隊的關鍵創新在於,他們額外引入了Codeforces競賽平台上的"hack"數據。

在Codeforces競賽中,當一名參賽者提交了代碼並通過了官方測試之後,其他參賽者可以嘗試構造一個特殊輸入來"攻破"這份代碼——這就叫做hack。能夠成功hack的輸入,往往是那些極其邊緣的情況,比如違反了題目里某個容易忽視的隱含條件,或者能讓一個功能上基本正確但細節有誤的程序產生錯誤輸出。這些由真實人類精心設計的對抗性測試樣例,正好能精準識別規範中的細微漏洞。

研究團隊把hack數據按照結果進行分類。如果Codeforces判斷hack的輸入本身是非法的,就把它加入"非法輸入"測試集;如果輸入合法但被攻擊的程序給出了錯誤輸出,就把這個"輸入-錯誤輸出"對加入"錯誤輸出"測試集。這樣,四個測試維度都有了充足且高質量的數據支撐。

三、從一道競賽題到一份可驗證的規範,中間有多少道工序

研究團隊還需要解決一個工程層面的難題:Codeforces題目的測試數據都是純文本格式,而Verus規範需要的是有類型的結構化數據。把文本格式的"5 10 20 20 20 30 20"翻譯成一個包含數組和整數欄位的Rust結構體,本身就需要相當精細的工作。

為了批量完成這項轉換,研究團隊訓練了一個"轉換代理"(基於gpt5.3-codex運行在SWE-AGENT框架上),讓它自動為每道題目生成一對工具:一個"解析器"(把文本轉成結構體)和一個"列印器"(把結構體轉回文本)。判斷這對工具是否正確的標準非常簡單也非常嚴格:把原始測試數據用解析器轉成結構體,再用列印器轉回文本,結果必須和原始數據一字不差。

這個"解析-列印-比對"的迴環檢驗,確保了每一個測試樣例在類型轉換過程中沒有丟失任何資訊。如果某道題目的轉換失敗率太高,或者某個測試維度的樣例數量不足5個,這道題就會從題庫中剔除。經過這一系列篩選,最終形成了包含581道題目的VERUS-SPECBENCH。這581道題目涵蓋了從800分到2700分的難度範圍,主題從基礎實現題到數學、貪心、動態規劃、圖論等各類算法題均有覆蓋,每道題平均擁有約21個"非法輸入"樣例、80個"合法輸入"樣例、55個"錯誤輸出"樣例和78個"正確輸出"樣例。

四、AI模型在這場考試里表現如何

研究團隊選取了六個具有代表性的AI模型來接受這套測試系統的考核,包括三個閉源前沿模型(gemini-3.1pro、gpt5.3-codex、opus4.6)和三個開源模型(deepseek-v4pro、glm-5.1、kimi-k2.6)。每個模型在每道題上的預算是2.5美元,時間上限是75分鐘,運行在SWE-AGENT交互框架中,可以讀寫文件、調用Verus驗證器、查閱文檔,並根據驗證反饋反覆修改規範。

考試結果分出了明顯的梯隊。最強的gemini-3.1pro能夠通過77.8%的題目,gpt5.3-codex排在第二位,通過率為57.8%,opus4.6以51.1%的通過率位列第三。三個開源模型的表現則相當慘澹,通過率分布在21.5%到25.5%之間——差不多是閉源模型的三分之一。

更細緻地看四個測試維度,gemini-3.1pro在"合法輸入"測試上通過了92.6%的樣例,在"正確輸出"測試上通過了89.2%,在"非法輸入"測試上通過了90.9%,在"錯誤輸出"測試上通過了89.1%。gpt5.3-codex的四項數據分別是91.0%、87.8%、82.6%、76.6%。相比之下,開源模型的四項數據都在35%到42%之間徘徊,顯示出根本性的能力差距。

一個非常有趣的發現出現在"寫代碼"和"寫規範"的對比實驗中。研究團隊專門挑選了那些gpt5.3-codex寫規範失敗、但每個輸入只對應唯一正確輸出的題目(共187道),然後測試同一個模型能否用Python寫出正確的代碼來解決這些題目。結果,模型用Python寫代碼的成功率高達81.8%——換句話說,模型明明知道怎麼解這道題,卻仍然無法把正確的解題要求準確地寫成規範。這說明"理解一道題的解法"和"精確描述這道題的要求"在認知層面是兩件截然不同的任務,AI在後者上還有很長的路要走。

五、AI寫規範時最容易在哪裡翻車

研究團隊通過大量案例分析,歸納出了三類最常見的失敗模式,每一類都值得仔細了解,因為它們揭示了規範"失真"的不同機制。

第一類是"前置條件太寬鬆"——規範接受了本不應該接受的輸入。一個典型案例來自Codeforces 1028C題目,要求在n個矩形中找到至少被n-1個矩形覆蓋的一個整數坐標點。題目中有一個關鍵的隱含保證:這n個矩形里必然存在某n-1個共享一個公共點。gpt5.3-codex和gemini-3.1pro在寫前置條件時,都只檢查了每個矩形的坐標是否在合法範圍內,完全沒有捕捉到"某n-1個矩形必須有公共交點"這個全局性約束。於是,當hack數據給出三個互不相交的矩形時,兩個模型的規範都錯誤地接受了這個非法輸入。這個被遺漏的條件其實是整道題能夠求解的核心前提,缺少了它,任何驗證過的代碼實際上都無法保證正確性。

第二類是"後置條件太寬鬆"——規範接受了本不應該接受的錯誤輸出。Codeforces 1051B題要求把區間[l,r]內的所有整數配成若干對,每對的最大公約數必須等於1。gpt5.3-codex寫的後置條件只檢查了每對數字"不同時為偶數"——這是互質的必要條件,但遠非充分條件。於是,(3, 6)這樣一對數字,因為3是奇數,就通過了檢驗,但它們的最大公約數是3,完全不滿足題目要求。另一個例子來自Codeforces 1027C,要求從一堆棍子裡選出四根組成周長平方除以面積之比最小的矩形。gpt5.3-codex寫的後置條件檢查了輸出的矩形是否可以由輸入中的棍子組成,卻完全沒有檢查這個矩形是否是比值最小的那個。結果,任何一個合法的矩形都能通過檢驗,包括那些遠非最優解的結果。kimi-k2.6在同一道題上的表現更糟,寫出的後置條件只要求四個輸出數字構成"兩對相等的數",連"這四根棍子必須來自輸入"這一基本要求都沒有寫進去。

第三類是"後置條件太嚴格"——規範拒絕了實際上正確的輸出。Codeforces 2074D要求計算n個以x軸為圓心的圓所覆蓋的整數坐標點總數。gemini-3.1pro為了精確表達"圓的並集覆蓋了哪些點",寫出了一套基於水平區間的複雜計算邏輯:先收集每個y坐標上所有圓覆蓋的x坐標區間,再排序、合併相鄰區間、求和。這個邏輯在概念上是正確的,但實現上出現了問題——對於五個圓心都在原點、半徑均為2的圓,正確答案顯然是13個整數點(單個半徑為2的圓覆蓋的點),但gemini-3.1pro的規範在執行中拒絕了這個答案。相比之下,opus4.6用了一個更簡潔的幾何思路:對於每個整數x坐標,找出所有覆蓋該x坐標的圓中最大的垂直覆蓋高度,然後計算該高度對應的整數點數量,最後對所有x坐標求和。這種更高層次的數學抽象反而更不容易出錯,也順利通過了所有測試。

六、幾個關鍵設計選擇為何至關重要

研究團隊還通過一系列對比實驗,驗證了評測體系中幾個關鍵設計選擇的價值。

首先是"健全性測試必不可少"。如果只看"完整性測試"(即規範是否接受了所有合法情況),gpt5.3-codex的通過率會從57.8%上升到76.6%;gemini-3.1pro會從77.8%上升到82.4%;opus4.6會從51.1%上升到58.7%。這些虛高的數字說明,有相當一部分模型寫出的規範雖然不會誤判合法情況,卻會把錯誤的情況也一併接受。沒有健全性測試,這些漏洞就會被完全掩蓋。

其次是"hack數據的價值"。研究團隊發現,增加測試樣例數量確實能暴露更多規範漏洞,但邊際收益遞減——測試樣例從少量增加到約50-75個時效果顯著,之後曲線趨於平緩。hack數據之所以特別有價值,恰恰在於它們是由人類針對真實提交代碼的漏洞精心設計的,能夠覆蓋那些系統性隨機測試很難發現的邊緣情況。事實上,在實驗中有相當比例的規範失敗案例,只有在引入hack數據之後才被發現,官方測試數據無法獨立暴露這些問題。

然後是`exec_spec`機制的關鍵作用。在整個評測過程中,有大量規範無法被純數學推理(SMT求解器)直接判定——尤其是在後置條件的測試上,數學推理經常面對過於複雜的輸出關係而無能為力。正是`exec_spec`的運行時執行能力補充了這一空缺。以gemini-3.1pro為例,在後置條件測試上,通過運行時執行得到判斷的樣例數量遠多於純數學推理得到判斷的數量。如果沒有這個運行時執行機制,大量測試樣例會停留在"無法判斷"的狀態,整個評測系統就失去了意義。

最後是"AI評委遠不如運行測試可靠"。研究團隊還專門用gpt5.3-codex來評判它自己寫的規範——把題目描述和生成的規範都提供給模型,讓它判斷規範是否正確。結果顯示,在191個被運行測試判定為錯誤但編譯通過的規範中,AI評委有49個(25.7%)被錯誤地判定為正確。換句話說,四分之一的規範錯誤逃過了AI評委的眼睛,但沒有逃過運行測試。這清晰地說明,可執行的測試驅動評估比讓AI自己"閱卷"要可靠得多。

七、這套測試環境本身是如何運作的

值得詳細了解的是AI模型在這套系統中實際上的工作方式,因為它模擬了真實的軟體開發場景,而不只是簡單地要求模型輸出一段文字。

每道題目對應一個工作目錄,其中包含:題目的自然語言描述、一個預先定義好輸入輸出數據結構的Rust代碼框架(agent只需填寫兩個函數的函數體)、三個可見的測試樣例(僅來自完整性測試維度,不提供健全性測試樣例)、一道其他題目的參考規範示例、Verus的完整文檔、評測系統的源代碼,以及一份由Verus專家撰寫的詳細任務說明。

Agent在工作時可以讀寫文件、在終端執行命令,通過運行`verus_gym_specgen_check`命令來對當前規範進行本地測試,並根據測試反饋(包括具體的Verus錯誤資訊)修改規範,然後再次測試,形成疊代循環。當agent認為規範已經足夠好時,可以提交。提交後,系統會用包含隱藏樣例的完整測試集進行最終評判。

在代碼框架中,agent需要填寫的兩個函數分別是`pre_spec`(前置條件,描述合法輸入的特徵)和`post_spec`(後置條件,描述對於給定輸入什麼樣的輸出是正確的)。框架里還預留了四個可選的"輔助證明函數",agent可以在其中填寫一些幫助Verus數學推理的提示,但這不是必須的。如果數學推理需要這些提示,agent可以選擇填寫;如果規範本身足夠簡單,留空也沒有關係。

值得注意的是,輸入輸出的數據結構類型是由前期的轉換流水線固定好的,agent不能修改這些類型定義——這確保了規範的評估是在統一的數據表示下進行的,不同agent的結果之間具有可比性。

八、這項研究指向的更大圖景

從實驗數據中還能讀出一些令人深思的規律。把三個閉源模型的解題結果畫成韋恩圖,可以發現有214道題三個模型都能解,但三個模型合併起來可以解486道題——遠超任何單一模型的能力邊界。這說明不同模型的失敗模式有相當程度的互補性,gemini-3.1pro貢獻了最多的獨有成功案例(84道),而opus4.6的成功案例基本都被其他兩個模型所覆蓋。

重複實驗的結果也揭示了一個穩定性問題。讓gpt5.3-codex獨立運行三次,成功率分別是57.8%、55.9%和56.6%,相差不大;但三次合併後的成功率(至少一次成功的題目比例)高達75.6%,而三次全部成功的題目比例僅有34.8%。這個巨大的落差說明,即便模型有能力解一道題,它也經常無法穩定地做到,失敗往往是隨機的而非系統性的。

隨著題目難度的增加,所有模型的成功率都穩定下降。gemini-3.1pro在難度800-900的簡單題上成功率高達90%,但在難度2400-2700的高難度題上跌至50%;gpt5.3-codex從73%跌至27%;開源模型在2100分以上的題目上幾乎全軍覆沒。即便如此,"在最簡單的題目上仍有10-16%的失敗率"這個數字依然值得關注——這說明規範形式化的難點不完全來自算法理解,很多簡單題目中也隱藏著容易被忽視的邊界條件和隱含約束。

說到底,這項研究做的事情可以用一句話來概括:它建造了一面鏡子,讓我們第一次清晰地看到AI在"理解任務要求"這件事上究竟做到了什麼程度。答案是:當前的前沿AI能做到相當不錯,但還遠未達到可以放心使用的水平——而且它最容易在那些"知道怎麼做但沒說清楚要做什麼"的地方犯錯。

對於軟體開發的未來而言,這個發現的意義不容小覷。隨著AI越來越多地介入代碼生成,我們或許會進入一個"AI寫代碼、人類無法完全審查"的時代。在這種情況下,形式化驗證本來可以作為一道重要的質量關卡——但如果連"質量標準"(規範)本身都是由AI來寫,而AI寫出的標準又不可靠,這道關卡就形同虛設。這項研究提出的問題,以及它提供的測試工具,正是對這一挑戰的正面回應。

對於關心AI可靠性的普通人來說,一個值得思考的問題是:當銀行的風控系統、醫療診斷軟體或自動駕駛算法都開始由AI來生成時,我們如何確保它們真的在做我們希望它們做的事,而不只是做了一件"看起來差不多"的事?這項研究表明,回答這個問題需要的不只是更好的代碼生成能力,還需要更好的"意圖表達"能力——而目前,即便是最強的AI模型,在這一點上仍然存在明顯的短板。有興趣深入了解這套測試系統技術細節的讀者,可以通過arXiv編號2605.26457查閱完整論文,或訪問該項目的開源代碼倉庫進一步探索。

Q&A

Q1:規範自動形式化(specification autoformalization)是什麼意思,和普通寫代碼有什麼區別?

A:規範自動形式化指的是把用自然語言寫的程序要求,翻譯成一份電腦能夠嚴格驗證的"精確說明書"。普通寫代碼是告訴電腦"怎麼做",而規範是在說"做成什麼樣才算對"。兩者看似相關,但在認知上有本質區別——實驗發現,AI用Python寫對代碼的成功率高達81.8%,但寫出正確規範的成功率卻低得多,說明"會解題"和"能精確描述解題標準"是兩種不同的能力。

Q2:VERUS-SPECBENCH里的Codeforces hack測試數據和普通測試數據有什麼不同,為什麼特別有用?

A:普通測試數據往往覆蓋常見情況,而Codeforces hack數據是競賽中人類玩家專門為了擊破別人代碼而設計的邊緣案例,針對那些"基本正確但細節有誤"的程序。實驗證明,有相當比例的規範錯誤只有hack數據才能發現,普通測試數據完全無法暴露這些漏洞。

Q3:為什麼用AI來評判AI寫的規範不可靠?

A:實驗中讓gpt5.3-codex評判自己寫的規範,發現它有25.7%的概率把錯誤規範誤判為正確。AI評委和出題AI容易犯相同類型的錯誤,對那些看起來合理但實際有細微漏洞的規範缺乏辨別能力。相比之下,用真實測試數據直接運行規範得到的判斷更客觀、更可靠,能夠發現AI評委看不出來的具體反例。

宅中地 - Facebook 分享 宅中地 - Twitter 分享 宅中地 - Whatsapp 分享 宅中地 - Line 分享
相關內容
Copyright ©2026 | 服務條款 | DMCA | 聯絡我們
宅中地 - 每日更新