AI 对于代码的理解能力在某些时候依然让我震惊 (反向)

先说一下,我的 shell 水平就是会用 pipe,懂 $() 做变量插值,稍微会写点最简单的 grep。sed awk 的水平。用 bash 来写 shell 脚本,写控制流的能力是完全没有。

于是用 AI (claude code 配合 sonnet 4) 写了一个 bash 的小脚本,总共代码量 400 多行,一行代码没写,claude code 完成的一气呵成,没什么问题。

但是接下来问题发生了,这个脚本在 macOS 上运行正常,在 linux 上就运行失败,而且是 silently fail 一点报错信息都没有 (也就是错误的原因根本就没有被 claude code 生成的错误检查代码检查到)。

于是我就开始问 AI 叫 AI 去 debug 了、和它说了测试命令 (在 linux 上失败 在 macOS 上不会失败的命令)。然后 AI 就说可能是 silently 失败的可能原因是 set -e 导致的,然后就开始吭哧吭哧的改代码,加了一堆防御性的代码,但是改的是一坨狗屎,防御性代码全部都加错位置。总共就 400 多行的小脚本,烧了我大几万的 token,我还重启了好几个 session 改了好多次,就没一次改对地方。

最后没办法,我自己开始看,首先自己先确定上 bash 版本不一致的原因 (macos 自带的 bash 非常古老),用 brew 安装了 bash 最新版以后就遇到了和 linux 一样的 silent fail 的问题。然后自己读了一遍代码,凭借自己浅薄的 bash 水平,就定位到了如下的这段代码:

@@ 106,9 106,14 @@ done
 validate_args() {
     # Count active modes
     local mode_count=0
-    [[ "$USE_TAB" == true ]] && ((mode_count++))
-    [[ "$USE_FLOATING" == true ]] && ((mode_count++))
-    [[ "$USE_PANE" == true ]] && ((mode_count++))
+
+    if [[ "$USE_TAB" == true ]]; then
+        mode_count=$((mode_count + 1))
+    elif [[ "$USE_FLOATING" == true ]]; then
+        mode_count=$((mode_count + 1))
+    elif [[ "$USE_PANE" == true ]]; then
+        mode_count=$((mode_count + 1))
+    fi

靠自己定位到了这段代码以后,我就让 AI 把代码从原先的类三目运算符的写法改成 if-else 的写法,是的我连 bash if-else 都不会写。然后代码就搞好了。

我还把这段 diff 丢给了 AI,让他解释一下为什么这么改,就不会让 set -e silently 报错了。然后 AI 就给了解释:

When a variable like `$USE_TAB` is `false` (or unset), the test `[[
"$USE_TAB" == true ]]` evaluates to false (exit code 1). This non-zero
exit code triggered `set -e`, causing the script to terminate.

This commit refactors the logic to use an `if/elif/else` block. In this
structure, the test conditions `[[ ... ]]` are part of the control flow
and their non-zero exit status (when false) does not trigger `set -e`.
This ensures that the script always proceeds to the next execution flow.

所以为啥让你解释你解释的头头是道,让你 debug 半天找不到这个位置呢?

经过这件事情,我对 AI 对代码的理解能力产生了巨大的震惊。我用的是 claudecode + sonnet 4,已经是目前最好的技术栈了。并且 AI 写 bash 的能力绝对远远强于我。

那么问题来了,为什么连最基本的 bash 语法都不太懂的我,都能定位到这段错误代码?而 AI 写 bash 的能力强我一万倍,却定位不到这段代码?而且这段代码的错误原因不涉及到任何的业务逻辑,是一个纯粹的 bash 语法问题。

此前根据我的经验,AI 在理解复杂的业务逻辑或者长链路的追踪上很可能会抓瞎,这是我完全理解的。但是我没办法理解,这么熟练写 bash 脚本的 AI,竟然会找不到这么低级的一个错误。在我看来,如果是一个会写 bash 的人类,应该能够几秒钟就定位到这个 bug。

2 个赞

因为 AI 没有理解能力。

就和,老师上课问同学,「你们懂了吗?」,「懂了」。然后考试还是错了,一样。

或者说,没有人类的思考能力, 它有自己的一套推理方式,只是它看上去比较像人而已。

或者换个角度,人类没有办法用数学或者其他语言描述人脑中的思考能力,能做到一定程度的模拟就不错了,哪怕是假的。

2 个赞

ai写bash很厉害 我也用ai写bash

我的经历也是一样的

让他写很厉害, 一但代码有问题他几乎没有debug的能力, 最后找到了解决办法他给我来一句:“是的, 你是对的, 因为12345…”

第一次有问题的时候没有解决成功, 那大概率是永远不会成功了

3 个赞

我觉得 这篇文章 挺在理的,一方面可能低估了问题的复杂性;

另一方面是,要用好 LLM 在目前这个阶段就是需要去和它搏斗、调试的,不能期望它聪明到一次性帮你完成工作。

「与其将编码代理的设计锚定在科幻理想(如魔法般完美的工人满足你的愿望),不如将其建立在实际科学基础上。」

引用

我的直觉是,除了已经识别出的所有潜在因素外,人们低估了自身所处的具体情境(即他们从「被要求构建的事物」中了解、解读并调整的程度,以及如何将这些与更丰富的、情境化的「有意义的构建目标」相联系,因为他们作为现实世界和问题空间的参与者)以及在使用和评估编程助手时所进行的主动解读和引导工作。

那些觉得引导过程耗费精力的用户最终会感到体验不佳,并把负面结果归咎于机器;而那些觉得过程轻松的用户则会称赞机器带来的正面结果。

这种对转向的容忍度很可能受到以下因素的影响:人们对自己和对人工智能(AI)的信任程度、他们可能感受到的威胁程度、现有的工作流程、他们可能获得的支持,以及他们选择的「基准」(也受上述因素影响)。

我提出这一理论是因为,我观察到那些对代理工作最热情且最有效的人,都深度参与了不断纠正和识别代理所陷入的错误、循环或死胡同的过程,同时引导代理远离这些问题,并为项目添加大量技术防护措施和标记,以提升代理的有效性。

当主动放弃这些努力时,随着代理通过重复相同死胡同模式不断扩大上下文窗口,其令牌成本会翻倍;异常情况和对不存在代码的引用会积累,代理会越来越做出脱离控制的行为,比如删除自己编写但已无法通过的测试。

我见过有人会把那种不稳定的行为归咎于自己(「哦,我应该那样提示的,是我错了」),而另一些人则会直接指责代理程序愚蠢或无用。

我所见(并亲身经历)的早期挫败感似乎源于遇到这些障碍,并开始觉得「这太糟糕了,和宣传的不一样。」

如果你身边有更熟练的用户,他们会建议你尝试不同模型、调整现有操作、提供更优提示,甚至分享充满专业术语的变通方案。

人工智能(AI)所宣称的能力与其实际表现之间存在显著差距。

要缩小这一差距,工程师需要开展大量工作。

Source

我也碰到过类型的,所以我尽量让AI来帮我做某个范围内的任务,最好还是之前做好过类型的逻辑让AI参考,然后我再去去把这部分代码和其他代码对接。

一旦出现过一次问题AI没有在两次 prompt 之内修复我就知道要么要开始和 AI 的拉锯战要么自己上了。

1 个赞

你是怎么怀疑到版本问题上去的?现阶段 AI 对这种“天马行空”的想象是不如人类的。AI 没有定位到的原因就是这个。所以你应该帮 AI 一把,把你能想象到的可能性都告诉它。

把temperature设高点说不定AI自己也能想到

这个事件让我感觉到,现在的 AI 的写代码能力依然是在做模式匹配,从它的训练数据里面去找类似的信息。而不是具备真正的“理解”能力。

硬要解释今天这个情况就是, bash 本身语法就非常晦涩,很多奇怪的 hack,大家写 bash 也很少像正经的工程那样写高质量的代码。那么因为数据集质量不够高,因此 AI 即便是这种最基本的语法问题都没有办法去 debug。

我在 o1 直到 o3 模型陆续发布的这段时间以来,是逐渐相信强化学习是有办法让 AI 去具备真正的 “理解” 能力而不是仅仅从训练数据做模式匹配。

但是今天这个 case 让我对 AI 的看法又倒退回去了。

1 个赞

因为AI的底层原理就是向量+概率?

2 个赞

前一阵子有个同事代码里也是出了set -e造成的错误。

首先我们用二分查找找到出问题的地方,但是想不出为什么这个地方会挂掉。而且在当前shell里面执行不会出问题,但是用sh执行会挂在这个的地方。

我问他有没有启用特殊的set选项,然后发现有set -e,关了就好了。

但是我也不知道为什么,查bash手册也看不明白。最后上stackoverflow看到一个类似的问题,才大概理解了。

从这个例子看,不理解其实是常态,这并不意味着不能解决问题。目前AI缺少的不是人理解问题的能力,而是人解决问题的方式,未必是因为它没有这个能力,只是因为目前还没有这样的数据。

我上班第一天对组长说,“我想在你旁边看一天,看看你是怎么工作的”。当然这不可能,被别人盯着看一天就没法偷偷摸鱼了,而摸鱼是不用教的。

3 个赞

众所周知,macOS 用的还是 GPLv2 时期版本的 bash

1 个赞

set -e ,关了就好了。

关掉 set -e 还是不推荐的,关掉这个就相当于隐式忽略错误处理,自动 try-catch 所有的代码并且 catch 后自动无视掉继续往下执行。关掉 set -e 就是这个属于是最后的办法,实在是找不到哪里 silently 报错也没有时间精力去找才关掉这个选项。

我这个情况最后还是靠自己找到了 silently 报错的地方并且解决了。

1 个赞

有时需要用命令的副作用而不是返回值作为判定条件,这种情况下不应该抛出任何异常。

我的经验就是AI 写大型shell 非常不好用, 尤其是需要引用一些lib 的.

加echo打印信息,二分法排除也找不到嘛

你如果换个模型就不一定能这样了, 不同大模型之间的差距很大

关键什么叫理解能力, 如果一个东西能正确回答你的话, 能做你指定的事情, 能反驳你, 你还说他没有理解能力?
一个东西看起来像鸭子, 听起来像鸭子, 走起来像鸭子, 那他就是只鸭子

你应该不会真的认为有人被关在电视里吧?

你觉得我说的没有说服力,你可以反推一下,为什么全世界这么多人关注 AI,却没什么人提出有伦理问题呢?这和基因克隆人的情况不一样。

我想起各大商家说云计算,云什么什么的时候,它说的云不是天上的云。同样的道理,现在说 AI 的推理能力,不是人类的推理能力。当然,它的表现离人类的推理能力差远了,不过你依然会看到有人误以为 AI 有感情,有思考能力。这也没办法。

其实这个问题也非常讽刺,就是,正是因为 AI 足够假,才能快速发展。不然全世界学术界早就封杀了。

2 个赞

在3 shot内解决不了的时候就很难解决了

感觉逻辑不成立,如果把AI当作人,某人可以处理一些很复杂、高难度的问题, 就想当然的以为一些简单的问题他也可以轻松处理应对。 然而实际情况却不是这样, 简单问题、一般人都能处理的问题他反倒是不会的