Mistral AI 遗留代码现代化
Mistral AI 为一家欧洲能源运营商成功将 40,000 行具有高物理强度的油藏模拟器从 Fortran 77 迁移到了 C++。该项目证明了,现代化复杂的遗留系统不仅需要简单的语法转换,还需要进行架构重构,并辅以数值验证和结构化的人机协作(human-in-the-loop)智能体工作流。
建立数值一致性以进行验证
为了确保迁移后的 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 程序视为单一的调用者-被调用者树(caller-callee tree)来解决这一问题。
使用自定义解析器生成该树,Mistral 通过 Vibe CLI 部署了超过一百个智能体。这些智能体利用 Mistral OCR 和文档库来摄取相关的 PDF 并记录代码库。该过程遵循自底向上的方法:智能体从树的叶子节点开始并向上工作,每个节点都会产生一个子智能体来记录代码并提交 Pull Request (PR)。一个按 cron 计划运行的审查智能体会监控这些 PR 并根据需要安排修复任务。
迁移过程中的 AI 智能体工作流演进
Mistral 测试了迁移过程中的三种不同自主程度,发现结构化、人工增强的工作流提供了质量与效率的最佳平衡。
全自主翻译
在第一次尝试中,智能体被赋予了完全的自主权来独立翻译子程序。这导致了“用 C++ 语法重写的 Fortran”,即 COMMON 块变成了全局结构体,且由 GOTO 驱动的控制流保持不变,未能实现真正的架构现代化。
结构化智能体团队
第二次尝试为每个模块使用了一个智能体团队(规划者、编码者、测试者和代码质量审查者)。虽然代码质量有所提高,但智能体在遇到复杂的 bug 时,如果没有人工干预,经常会陷入停滞。
人机协作的结构化工作流
最终成功的方案涉及由人类操作一个由编码者、测试者和审查者智能体组成的工作流。代码库被划分为独立的模块(少于 10,000 行 Fortran 的子树)。每个模块遵循以下序列:
- Architecture Generation:生成目标 C++ 架构。
- Engineering Review:与油藏工程师进行工程审查。
- Task Queuing:将批准的架构分解为任务队列。
- Implementation Loop:执行“计划 $\rightarrow$ 实现 $\rightarrow$ 测试”的子工作流,并针对每个任务重复此过程。
- Human Merge:人类审查生成的 PRs 并请求更改,直到它们被合并。
遗留系统现代化的关键原则
基于对模拟器 300,000 行代码中 40,000 行的迁移工作,Mistral 确定了大规模遗留迁移的三项核心原则:
- 优先建立对等性测试框架:在编写迁移代码之前先构建验证系统;数值一致性是证明完成工作最令人信服的证据。
- 优先进行文档化:在迁移之前使用智能体来协调和集中文档,因为无法阅读的代码是无法迁移的。
- 实施结构化工作流:在大规模应用时,结构化且带有专家人工审查环节的工作流,其表现优于全自主模式和纯手动模式。