爱美剧,爱生活 请登录 | 免费注册


根本原因:AI更容易犯代码错误


小美发布 2025-08-02 11:30:51 阅读 43 字数 893
48



说白了,这次宕机事故,其实源于一次代码迁移时的一个细微变更。但因为整段代码整体都在迁移,这个小变动就被“淹没”在大量修改里,开发团队在代码审核时没能察觉。


该团队指出,这暴露出整个行业在“识别代码小幅变更”这方面工具的不足。像 Git 这样的主流工具,确实可以识别一个文件整体的“迁移+改动”,但要是在同一个文件中某段代码被改动了位置又稍作修改,它就很难看出——技术上实现起来也确实不简单。


在实际开发中,这种情况并不少见:一大片红绿 diff(即“新增/删改”的代码差异)中看起来大同小异,很容易漏掉真正重要的改动。而这种错误,并不是因为用了 AI 才出现,哪怕是人类开发者也可能踩坑。


但问题在于:AI 更容易犯这种错。


人类开发者做重构时,往往是直接剪切原来的代码,再粘贴到新位置,然后做有意识的修改。这个过程相对“闭环”,出错概率比较低。


然而,AI 编码助手的逻辑则不同——它不会“剪切粘贴”,而是“先删掉一段代码,再重新写一段”。本质上,它是在尝试“转录”旧的逻辑到新位置,稍有偏差就可能抄错。


而这次的 Bug,就属于这种“转录错误”的典型案例。


对此,Sketch.dev 团队也列举了一个典型例子来说明这种转录错误是如何发生的:


if err != nil {
    // Log error but continue with other installations
    log.Printf("Error fetching repositories for installation %d: %v", *installation.ID, err)
    break
}


可以看到,上面代码的注释写的是“but continue”,但实际的程序逻辑却写成了“中断执行”(break)。也就是说,注释和代码本身“打架”了。


这种错误,是怎么发生的?该团队工程师分析后发现,这是 AI 在生成代码时两种“判断信号”发生了冲突:


一种是“转录信号”,也就是它试图照搬旧代码中的逻辑(这一层面它想用 break);


另一种是“局部预测”,也就是它根据上下文猜测此时该写什么(这一层面它认为应该用 continue)。


很不幸,这次 AI 更相信自己的“直觉”——结果它选择了 continue,也就是错误的那个选项,从而引发了 Bug。



评论