Mistral AI 舊代碼現代化
Mistral AI 為一家歐洲能源營運商成功將 40,000 行具備高強度物理運算的儲層模擬器從 Fortran 77 遷移至 C++。此專案證明了現代化複雜的舊代碼系統不僅需要簡單的語法轉換,更需要進行架構重構,並輔以數值驗證與結構化的「人機協作」代理工作流。
建立數值一致性以進行驗證
為了確保遷移後的 C++ 代碼庫與舊有的 Fortran 77 系統相符,Mistral 在開始遷移之前實施了「一致性測試框架」(parity harness)。由於程序化 Fortran 與物件導向 C++ 之間的結構差異使得兩者無法進行逐行對應,因此輸出結果的數值相等是唯一可靠的正確性證明。
一致性測試框架包含:
- State Export Subroutines:新增至 Fortran 代碼庫中,用於傾印狀態快照。
- C++ Test Framework:設計用於載入這些檢查點並驗證遷移模組的輸出。
- Skill.md Files:用於引導 AI 代理正確使用該框架。
透過在 Fortran 代碼中插入行以匯出特定變數(例如 RHOG),團隊可以使用這些值作為參考檢查點,來驗證遷移後的 C++ 模組。
透過代理樹狀結構進行舊代碼文件化
舊代碼庫通常面臨文件化資訊破碎的問題,這些資訊往往儲存在舊的 PDF 或行內註釋中。Mistral 透過將程序化 Fortran 程式視為單一的「呼叫者-被呼叫者」樹狀結構來解決此問題。
透過使用自定義解析器生成樹狀結構,Mistral 經由 Vibe CLI 部署了超過一百個代理。這些代理利用 Mistral OCR 與文件庫來讀取相關的 PDF 並將代碼庫文件化。該過程遵循由下而上的方法:代理從樹的葉節點開始並向上工作,每個節點都會產生一個子代理來記錄代碼並開啟一個 Pull Request (PR)。一個按定時排程執行的審查代理會監控這些 PR,並根據需要安排修復任務。
遷移過程中的 AI 代理工作流演進
Mistral 測試了遷移過程中的三種不同自主程度,發現結構化且由人類增強的工作流提供了品質與效率的最佳平衡。
完全自主翻譯
在第一次嘗試中,代理被賦予完全的自主權來獨立翻譯子程序。這導致了「用 C++ 語法重寫 Fortran」的結果,其中 COMMON 區塊變成了全域結構體,且 GOTO 驅動的控制流保持不變,未能實現真正的架構現代化。
結構化代理團隊
第二次嘗試使用了每個模組配置一組代理團隊(規劃者、編碼者、測試者與代碼品質審查者)。雖然代碼品質有所提升,但代理在遇到複雜的錯誤時,若沒有人類介入,經常會陷入停滯。
人機協作結構化工作流
最後成功的做法涉及由人類操作一個包含編碼者、測試者與審查者代理的工作流。代碼庫被劃分為獨立的模組(小於 10,000 行 Fortran 的子樹)。每個模組遵循以下順序:
- Architecture Generation:生成目標 C++ 架構。
- Engineering Review:與儲層工程師進行架構審查。
- Task Queuing:將核准的架構分解為任務隊列。
- Implementation Loop:執行「規劃 $\rightarrow$ 實作 $\rightarrow$ 測試 $\rightarrow$ 重複」的子工作流,針對每個任務進行。
- Human Merge:由人類審查產生的 PR 並要求修改,直到合併。
舊系統現代化的關鍵原則
根據對模擬器 300,000 行代碼中 40,000 行的遷移經驗,Mistral 識別出大規模舊代碼遷移的三個核心原則:
優先建立一致性測試框架:在編寫遷移代碼之前先建立驗證系統;數值一致性是完成任務最令人信服的證明。
先進行文件化:在遷移之前使用代理來整理並集中化文件,因為無法閱讀的代碼是無法遷移的。
實施結構化工作流:在大規模應用時,具有人類審查關卡的結構化工作流,其表現優於完全自主以及純手動操作。