在代理式工程中的重構經濟效益

重構直接降低 AI 代幣成本

重構由代理生成的程式碼庫可透過減少 AI 代理在實作新功能時必須處理的輸入代幣數量,提供可衡量的經濟效益。在一項受控實驗中,將單一 17,155 行的 Rust 檔案重構為模組化結構,使代表性變更所需的輸入代幣從 159,564 降至 27,360,相當於 83% 的代幣節省。

此節省並非因為程式碼總量減少——資料存取層的總行數仍相對保持不變——而是因為模組化使代理能夠辨識並僅讀取最小必要的檔案子集。當程式碼被合併成單一巨大的檔案時,代理必須吞入整個檔案以維持上下文,導致成本上升且執行速度變慢。

重構實驗

為了量化程式碼結構對代幣使用的影響,使用了一個約 150,000 行程式碼(主要為 Rust)的應用程式。該應用程式完全由代理(Claude Code 與 Cursor)撰寫,未經人工程式碼審查。隨著時間推移,資料存取層演變成一個超過 17,000 行的單一檔案,具備高度重複性且缺乏內部抽象。

方法論

實驗對每個測試使用「全新」代理,以確保先前步驟的學習不會影響結果。流程遵循以下步驟:

  1. 建立基線: 針對代表性變更(新增一個 trait 與實作),向子代理發出提示,以記錄初始代幣成本。
  2. 迭代重構: 根據嚴格的重構規範(參考 Martin Fowler 的《Refactoring》第二版),執行了一系列 15 個重構步驟。
  3. 測量: 每個重構步驟之後,向新的子代理發出完全相同的代表性變更,以測量輸入代幣、輸出代幣與執行時間的變化。

定量結果

指標 基線 第 15 步後 變化
資料存取層行數 17,155 16,608 -2.9%
最大檔案行數 17,155 3,695 -78.4%
每次變更的輸入代幣 159,564 27,360 -83%
每次變更的輸出代幣 1,705 2,113 +23.9%
每次變更的時間(秒) 342 454 +32.7%

雖然隨著最大檔案大小減少,輸入代幣「急劇下降」,但輸出代幣相對保持穩定。這表明,雖然重構讓 AI 更容易閱讀程式碼,卻不一定使產生的程式碼更短

主要技術洞見

模組化 vs. 簡單切分

隨機將大型檔案切分為較小檔案不足以實現這些節省。實驗顯示,只有在程式碼經過邏輯重構以抽取重複部分並建立重複核心後,代幣減少才最為顯著。此結構使代理的檢索機制能成功隔離相關檔案,而不是在多個小檔案中搜尋所需的邏輯。

重構中的「代理差距」

儘管能產生大量程式碼,實驗顯示目前的 AI 代理(特別是 Claude)在執行重構本身時仍面臨困難:

  • 缺乏主動性: 代理不會自行建議或執行重構以改善程式碼庫;它們需要明確的人類指導與詳細計畫。
  • 執行錯誤: 由代理處理的重構機械過程(搬移程式碼、更新匯入)常不可靠,需使用外部 Python 腳本搭配 grepsed 以確保正確性。
  • 需要指導: 必須由具備深厚軟體工程知識的人類撰寫提示與重構計畫,才能達成期望的架構結果。

社群觀點綜合

工程師之間對此發現的討論突顯了 AI 與軟體架構交叉領域的多個關鍵點:

「無聊」最佳實踐的回歸

許多觀察者指出,這項「令人興奮」的新發現——重構有助於 AI——其實只是對基本軟體工程原則的再發現。正如一位貢獻者所說:

"無聊:重構讓你的開發者在長期內更具生產力。令人興奮:重構讓你的 AI 在長期內更具生產力。"

對推理與正確性的影響

除了代幣成本外,有人認為緊湊的上下文能提升 AI 的推理能力。透過更佳的抽象降低程式碼的「熵」可能提升 AI 產生能良好泛化且正確的軟體的機率,而不僅僅是通過特定測試案例。

人類在迴路中的必要性

普遍共識認為,雖然代理能撰寫程式碼,但高層次的架構願景仍屬於人類的責任。要為特定的 async trait 以及其在多種儲存類型的實作提供提示,需要的領域專業知識目前代理尚無法自行綜合。有些人認為我們正進入「氛圍編程」時代,人在此扮演架構師角色,而 AI 則是高速的執行者。

Sources