最近在网上看到一个很有意思的帖子,一位老哥让大模型帮忙修复代码Bug,结果模型给出的代码片段里有一句逻辑让他直呼“完蛋,看不懂了”。

AI生成代码示例

大模型生成的代码片段示例,展示了‘先报错再修正’的奇特逻辑

那段代码的核心逻辑大概可以理解为“先让状态变红(报错/异常),然后再去修复它”。老哥一脸懵圈:直接写正确的代码不行吗?为什么要先搞砸再修?这不有那个大病吗?

其实,这并不是模型“疯了”,而是大模型生成代码的一个隐性特征。今天咱们就来聊聊为什么AI修Bug有时候会显得这么“玄学”,以及遇到这种情况我们该怎么办。

为什么大模型喜欢“先搞砸再修补”?

很多初学者认为,大模型应该像经验丰富的人类程序员一样,大脑里直接构思出完美的解决方案,然后一次性敲出来。但事实并非如此。

1. 概率生成的“思维链”外溢 大模型本质上是在做预测,它根据上文预测下一个字。当我们要求它“修Bug”或者“重构代码”时,它的内部推理过程可能包含了多步思考:

  • 识别当前的问题是什么(比如状态不对);
  • 先尝试把这个“错误状态”显式地表达出来;
  • 然后逻辑上再执行修复操作。

有时候,模型把这个内部的思考过程直接写进了代码里。你看到的“先红再修”,可能就是它先把“错误判断”写一遍,紧接着写“修复逻辑”。这就像是我们解数学题时,先写“解:因为X是错误的...”,这虽然有点啰嗦,但在逻辑推导上是成立的。

AI编程概念图

大模型代码生成的概率预测机制示意图

2. 训练数据中的“烂代码”污染 大模型的训练数据来自互联网,那里充斥着各种质量的代码。Stack Overflow、GitHub历史提交中,有很多代码本身就是“Patch打补丁”式的风格。比如开发者为了快速上线,先写个临时逻辑(甚至抛个异常占位),后面再覆盖或修正。

模型在学习时,不仅学会了正确的范式,也学到了这些“工程妥协”的写法。当你给它一个模糊的指令时,它可能会模仿这种“打补丁”的风格,因为它认为这也是解决编程问题的一种常见模式。

3. 缺乏“全局观”的局部优化 大模型处理长文本虽然有长窗口,但它的注意力机制依然是倾向于局部关联的。在生成某一行代码时,它可能只关注了紧邻的上下文。如果前文提到了“红色状态”,它顺手就生成一个处理红色状态的代码片段。它可能没有意识到在人类看来,直接跳过这个错误状态会更高效。

遇到“看不懂”的AI代码,我们该咋整?

既然这种“玄学”现象难以完全避免,那我们在日常使用AI辅助编程时,该怎么应对呢?别急着骂模型,试试这几招。

第一招:明确“禁止”指令 很多时候模型画蛇添足是因为我们给的任务太宽泛。比如你只说“修好这个Bug”,它可能会给你展示十种修法。

试着把指令收紧:

“请修复上述代码中的逻辑错误。直接输出修复后的最终代码片段,不要输出中间的测试变量或临时的错误状态逻辑。保持代码简洁。

加上这种否定约束,模型会意识到你不需要过程,只要结果,从而减少“先红再修”的废话。

第二招:启动“慢思考”模式 现在的很多模型(如GPT-4o, Claude 3.5等)都支持更强的推理能力。你可以要求它先解释思路再写代码。

“首先分析这段代码报错的原因,列出步骤。然后根据分析结果,提供一个没有任何冗余逻辑的精简修复方案。”

强迫它先在文本层逻辑把思路理顺,生成的代码通常会更符合人类的逻辑直觉。

第三招:人机协作的“Code Review”不能少 不管AI写得多么天花乱坠,只要是你看不懂的代码,一律视为“有风险”。

如果看到像帖子中那样奇怪的逻辑,直接追问模型:

“第X行代码的逻辑看起来像是先制造问题再解决问题,为什么要这样写?如果是为了某种特殊场景,请解释;如果是冗余,请删除它。”

AI通常会很诚实地回答:“抱歉,这是一个逻辑冗余,这是优化后的版本。”

总结

大模型不是全知全能的神,它更像是一个博览群书但有时候会过于刻板的实习生。它写出“先红再修”这种让人挠头的代码,一方面是推理过程的“外溢”,另一方面是模仿了人类编程历史中的“坏习惯”。

作为开发者,我们不能当“甩手掌柜”,直接Copy-Paste。掌握正确的Prompt技巧,学会质疑和追问,才能真正把AI变成提效神器,而不是给自己埋雷。

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭