Loading... # 使用 AI Agent 将 MiniJinja 移植到 Go 语言 # 一、新闻概述 ## 1. 标题 使用 AI Agent 将 MiniJinja 移植到 Go 语言 ## 2. 发布时间 2026 年 1 月 14 日 ## 3. 来源 Armin Ronacher 个人博客(lucumr.pocoo.org) # 二、核心内容 ## 1. 事件摘要 ### A. 主要内容 Armin Ronacher 使用 AI Agent 成功将 MiniJinja(Rust 编写的 Jinja2 模板引擎)移植到 Go 语言。整个移植过程耗时约 10 小时,但人工参与时间仅 45 分钟,主要用于高层指导。 ### B. 核心亮点 - AI Agent 独立完成绝大部分移植工作 - 采用测试驱动开发方式,逐步实现词法分析、语法分析和运行时 - Agent 从字面移植转向行为移植,更符合 Go 语言习惯 - API 成本约 60 美元,使用 220 万 tokens ## 2. 关键信息 ### A. 涉及项目 - MiniJinja:Rust 版本的 Jinja2 模板引擎 - 移植目标:原生 Go 语言实现 ### B. 重要数据 - Agent 运行时长:10 小时(3 小时人工监督 + 7 小时独立运行) - 人工参与时间:约 45 分钟 - 消息总数:2698 条 - 用户提示:34 条 - 工具调用:1386 次 - API 成本:60 美元 - Token 总量:220 万 ### C. 使用的模型 - Claude Opus 4.5(主要开发阶段) - GPT-5.2 Codex(测试修复阶段) ## 3. 背景介绍 ### A. MiniJinja 简介 MiniJinja 是 Jinja2 模板引擎的 Rust 重新实现版本。Armin Ronacher 最初编写它是为了在 Rust 中进行基础设施自动化项目,虽然原项目没有继续,但 MiniJinja 本身对作者和其他用户都很有用。 ### B. 测试机制 MiniJinja 使用快照测试进行验证,通过 insta 工具比较输入和预期输出。这些快照测试成为验证 Go 移植版本的重要依据。 # 三、详细报道 ## 1. 移植策略 ### A. 测试驱动方法 初始提示要求 Agent 确定如何验证移植。通过对话,作者与 Agent 达成一致路径:复用现有的 Rust 快照测试,逐步移植(词法分析器 → 语法分析器 → 运行时)。 Agent 构建了 Go 端工具链: - 解析 Rust 测试输入文件(嵌入 JSON 配置头) - 解析参考 insta 快照文件并比较输出 - 维护跳过列表以暂时排除失败的测试 这形成了一个紧凑的反馈循环:Agent 有明确目标(让所有测试通过)和清晰的进度路径。 ```mermaid graph LR A[Rust 快照测试] --> B[Go 测试工具] B --> C[词法分析器] C --> D[语法分析器] D --> E[运行时] E --> F[所有测试通过] ```  ### B. Pi 的分支功能 作者使用 Pi 的分支功能将会话结构化为不同阶段。通过回滚到较早部分并使用分支切换功能,自动告知 Agent 已完成的工作。 分支切换时做两件事: - 保持在同一会话中,但从较早消息创建新分支 - 切换时,将已完成的工作摘要作为引导消息添加到分支点 这避免了 Agent 重新从头开始探索进度。 ### C. 从字面移植到行为移植 有趣的是,Agent 很快从字面移植转向行为移植。作者没有阻止这种转变,只要行为保持一致。原因有两个: - 代码库不大,必要时可以在最后调整 - 这样更符合 Go 语言习惯 例如,在运行时方面: - 实现了树遍历解释器(而非 Rust 的字节码解释器) - 决定使用 Go 的反射来实现值类型 这些是 Agent 自主决定的,但比复制 Rust 解释器设计更合理(Rust 设计部分原因是缺乏垃圾回收器和运行时类型信息)。 ## 2. 需要人工干预的情况 ### A. 错误消息处理 Agent 完全放弃了所有必须失败的测试,因为运行时差异导致无法完美复制错误消息。作者引导它改用模糊匹配。 ### B. 行为回归 Agent 想要回退作者想保留的行为(如精确的 HTML 转义语义,或 range 必须返回迭代器)。如果没有引导,Agent 可能无法完成,或者作者会对结果失去信心。 ## 3. 完整覆盖的攻坚阶段 修复主要语义不匹配后,剩余工作是填补所有缺失部分:缺失的过滤器、测试函数、循环扩展、宏、调用块等。 作者切换到 Codex 5.2,排队提交几个继续让测试通过的提示,然后让它通过压缩独立工作。一旦基础覆盖完成,作者确信 Agent 可以在没有指导的情况下让剩余测试通过。 这个阶段在无人监督的情况下通宵运行。 ## 4. 最终清理 功能收敛后,作者要求 Agent: - 记录内部函数 - 重新组织(如将过滤器移到单独文件) - 记录所有函数和过滤器(类似 Rust 代码库) 此时设置了 CI、发布流程,并讨论创建的内容以进行最后的完善,然后合并。 ```mermaid sequenceDiagram participant H as 人工 participant A as AI Agent participant R as Rust 代码 participant G as Go 代码 participant T as 测试 H->>A: 提供高层指导 A->>R: 分析现有代码 A->>G: 编写 Go 实现 A->>T: 运行快照测试 T-->>A: 测试结果 A->>G: 修复失败 H->>A: 纠正行为偏差 G-->>H: 最终代码 ```  # 四、影响分析 ## 1. 行业影响 ### A. 技术选择不再受限 这类移植现在已经可行。虽然几个月前移植已经可能,但需要更多关注。这种情况改变了某些动态。作者感觉技术选择不再受生态系统锁定约束。 ### B. 代码价值转移 价值正从代码本身转向测试和文档。一个好的测试套件可能比代码本身更有价值。不过,这不是保守测试秘密的理由——生成良好覆盖的测试也变得越来越容易。 ## 2. 移植可能性评估 - 简单库:完全可行 - 中等复杂度:如 MiniJinja,可行 - 高度优化库:如 NumPy 移植到 Go 会更复杂,使其具有竞争力甚至更困难(多年优化积累) 但总的来说,感觉现在可以使用更多库了。 ## 3. 社会动态变化 过去有人将你的代码移植到其他语言是值得骄傲的事情。这是成就的标志——项目足够酷,有人花时间让它在其他地方可用。 有了 Agent,它不再引起同样的感觉。Will McGugan 也指出了这种变化。 # 五、各方反应 ## 1. 相关资源 - PR #854:MiniJinja Go 移植的 Pull Request - Pi 会话记录:完整的 Agent 交互记录 - 视频演示:移植过程的旁白视频 ## 2. 技术社区反馈 Will McGugan 在 Bluesky 上指出,Agent 改变了代码移植带来的社会意义——从致敬行为变成了技术可行性的展示。 # 六、关键经验总结 ## 1. 成功因素 - 完善的测试套件是移植成功的基础 - 测试驱动方法提供了清晰的进度指标 - 适度的人工引导确保了方向正确 - 从字面移植到行为移植的灵活性提高了代码质量 ## 2. 成本效益 - 60 美元 API 成本 - 45 分钟人工时间 - 相比手动移植数小时到数天的工作量,效率提升显著 ## 3. 未来展望 - 跨语言库的同步需要共享测试,否则不可避免地会出现分歧 - AI Agent 使得技术选型不再受限于语言生态 - 代码的价值正在向测试和文档转移 *** ## 参考资料 1. [Porting MiniJinja to Go With an Agent](https://lucumr.pocoo.org/2026/1/14/minijinja-go-port/) 最后修改:2026 年 03 月 20 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏