在代理式工程中的重構經濟效益
重構直接降低 AI 代幣成本
重構由代理生成的程式碼庫可透過減少 AI 代理在實作新功能時必須處理的輸入代幣數量,提供可衡量的經濟效益。在一項受控實驗中,將單一 17,155 行的 Rust 檔案重構為模組化結構,使代表性變更所需的輸入代幣從 159,564 降至 27,360,相當於 83% 的代幣節省。
此節省並非因為程式碼總量減少——資料存取層的總行數仍相對保持不變——而是因為模組化使代理能夠辨識並僅讀取最小必要的檔案子集。當程式碼被合併成單一巨大的檔案時,代理必須吞入整個檔案以維持上下文,導致成本上升且執行速度變慢。
重構實驗
為了量化程式碼結構對代幣使用的影響,使用了一個約 150,000 行程式碼(主要為 Rust)的應用程式。該應用程式完全由代理(Claude Code 與 Cursor)撰寫,未經人工程式碼審查。隨著時間推移,資料存取層演變成一個超過 17,000 行的單一檔案,具備高度重複性且缺乏內部抽象。
方法論
實驗對每個測試使用「全新」代理,以確保先前步驟的學習不會影響結果。流程遵循以下步驟:
- 建立基線: 針對代表性變更(新增一個 trait 與實作),向子代理發出提示,以記錄初始代幣成本。
- 迭代重構: 根據嚴格的重構規範(參考 Martin Fowler 的《Refactoring》第二版),執行了一系列 15 個重構步驟。
- 測量: 每個重構步驟之後,向新的子代理發出完全相同的代表性變更,以測量輸入代幣、輸出代幣與執行時間的變化。
定量結果
| 指標 | 基線 | 第 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 腳本搭配
grep與sed以確保正確性。 - 需要指導: 必須由具備深厚軟體工程知識的人類撰寫提示與重構計畫,才能達成期望的架構結果。
社群觀點綜合
工程師之間對此發現的討論突顯了 AI 與軟體架構交叉領域的多個關鍵點:
「無聊」最佳實踐的回歸
許多觀察者指出,這項「令人興奮」的新發現——重構有助於 AI——其實只是對基本軟體工程原則的再發現。正如一位貢獻者所說:
"無聊:重構讓你的開發者在長期內更具生產力。令人興奮:重構讓你的 AI 在長期內更具生產力。"
對推理與正確性的影響
除了代幣成本外,有人認為緊湊的上下文能提升 AI 的推理能力。透過更佳的抽象降低程式碼的「熵」可能提升 AI 產生能良好泛化且正確的軟體的機率,而不僅僅是通過特定測試案例。
人類在迴路中的必要性
普遍共識認為,雖然代理能撰寫程式碼,但高層次的架構願景仍屬於人類的責任。要為特定的 async trait 以及其在多種儲存類型的實作提供提示,需要的領域專業知識目前代理尚無法自行綜合。有些人認為我們正進入「氛圍編程」時代,人在此扮演架構師角色,而 AI 則是高速的執行者。