Rars: 使用 LLM 工程化實現 Rust 版 RAR
從零開始實現一個 RAR 壓縮器是一項艱鉅的任務。從歷史上看,RAR 的專有性質以及缺乏正式的公開規範,意味著這樣的項目可能需要數年的手動逆向工程。然而,開發者 davidsong 最近的一個項目展示了一種範式轉移:利用大型語言模型 (LLMs) 將數年的工作量壓縮到幾週內完成。
rars 是一個基於 Rust 的 RAR 格式實現。雖然作者將生成的代碼庫描述為「粗糙」且「慢」,但它達成了一個關鍵里程碑:為世界提供了一個免費軟體的 RAR 實現。從空白狀態到功能完備的 CLI 的過程,揭示了當前 AI 輔助工程化的現狀、人類監督的必要性,以及自主代碼生成的脆弱性。
逆向工程階段:從民間傳說到規範
由於官方的 unrar 源代碼並非免費,且 RAR 的作者 Eugene Roshal 以對格式極度保護著稱,第一個挑戰是在不存在規範的情況下創建一份規範。這個過程是一個數據收集與 LLM 合成的迭代循環:
- 數據聚合:作者從免費解壓縮工具 (unar, libarchive, UNRARLIB)、隨機網頁以及一般的「民間傳說」中提取信息。
- LLM 文檔化:使用 Claude 來記錄這些發現。作者維護了一個「缺口文檔」(gaps doc) 來追蹤缺失的功能,並在上下文重置時持續保留這些信息,以確保 LLM 專注於未知領域。
- 二進制分析:為了填補剩餘的缺口,作者使用 Ghidra 和 DOSBox-x 對 DOS 和 Windows 的 RAR 二進制文件進行十六進制轉儲 (hex-dump) 並進行分析,創建測試基準來驗證猜想。
這個過程產生了一套針對每個版本的 RAR 文件格式的全面規範文檔,這些文檔現在成為了實現的基礎。
實現工作流
構建 CLI 涉及多模型策略,利用了 OpenAI Codex 5.5 和 Claude Opus 4.7 的不同優勢。
模型專業化
- Claude Opus:用於高層次策略、架構討論以及整體的代碼審查。然而,作者指出 Opus 傾向於熱情地生成代碼,但卻忽視了更廣泛的架構。
- OpenAI Codex:用於將規範轉化為代碼的「苦力活」。作者發現 Codex 在給定規範並被告知「直接開始做」時,表現得更專業且更能保持目標一致。
「網絡安全」障礙
開發過程中最引發關注的軼事之一發生在 Claude 嘗試理解身份驗證機制時,它實際上透過繞過產品註冊來「破解」了 WinRAR。當這些發現被記錄在規範中並隨後餵給 Codex 時,OpenAI 的安全過濾器觸發了網絡安全違規警告,差點導致封號。作者不得不清除 git 歷史記錄,並決定不實現註冊繞過功能。
管理「AI 垃圾」與維持質量
通過 LLMs 寫出 55,000 行代碼不可避免地會導致「垃圾」(slop)——醜陋的模式、特殊情況的修復以及技術債。
大規模測試的角色
為了防止 LLMs 「偷工減料」或產生幻覺,作者實現了極大量的單元測試。這些測試充當了扭曲文本生成的「統計質量」,迫使模型保持與現實一致。當代碼在面對真實世界的存檔文件時失敗時,規範就會被更新,隨後代碼也會被重新生成。
上下文管理與審查
為了避免模型在審查自己工作時產生的「複合盲點」,作者使用了過濾式審查流程:
- 審查生成:Claude 生成完整的代碼審查報告。
- 過濾:審查結果被分組並移至
plan.md文件,隨後驅動 Codex 的開發任務。 - 選擇性上下文:作者頻繁重置會話並切換機器,以確保模型不會過於專注於相同的錯誤。
透過自主循環進行擴展
隨著 OpenAI 的 /goal 功能的引入,項目進展顯著加速。這是一個允許機器人進行無限期任務的循環,通過壓縮自身的上下文來運作。這使得機器人能夠在長達 16 小時的會話中,「注滿」大約 40,000 行代碼,處理如恢復記錄 (recovery records)、加密和多卷支持等複雜功能。
結果與經驗教訓
性能 vs. 功能性
雖然實現是功能完備的,但並未經過優化。作者指出,雖然 Codex 可以使用 valgrind 和 hyperfine 來尋找熱點,但它缺乏資深 C 開發者會使用的創新性能優化技巧。因此,該工具比 WinRAR 慢了數倍,且壓縮率略低(約差 5-10%)。
AI 驅動開發的關鍵啟示
該項目為「AI 優先」的工程化方法提供了藍圖:
- 從規範開始是有效的:提供清晰的規範是引導 LLM 最可靠的方式。
- 架構需要人類:沒有強大的架構把控,模型會透過不斷處理特殊情況來陷入混亂。
- 測試是導向機制:在 AI 開發中,測試不僅用於驗證;它們也被用來引導模型的輸出。
- 盲點是固有的:除非特別提示模型去尋找,否則 LLMs 可能會忽略明顯的 UX 缺陷或架構不一致之處。
最終,rars 證明了自主研究與 LLM 驅動的編碼可以解決以前被認為對單個開發者來說太耗時的問題,即使最終生成的代碼需要人類不斷「對機器人吼叫」以保持其在正軌上。