人工智能的冒险
摘要
作者分享了使用多种AI编码助手(Claude Code、Codex、Pi)进行代码审查和重构的经验,发现前沿模型在捕捉细微错误方面出奇地有效,但也注意到一些工具质量较低且行为不稳定。
<p><a href="https://lobste.rs/s/khdiby/artificial_adventures">评论</a></p>
查看缓存全文
缓存时间: 2026/07/02 02:06
# 人工冒险
来源:https://www.scattered-thoughts.net/writing/artificial-adventures
我一直在玩 AI。我做的事情没什么特别激动人心的,但互联网往往只呈现最极端的正反观点,而我觉得听听朋友们的意见很有用——他们的观点不是为了点击率而优化的。
我订阅了 Anthropic 和 OpenAI 的每月 20 美元套餐,还给 Google、Moonshot、DeepSeek 和 Cerebras 各充了 20 美元的额度。对于一些难题,我试过所有模型来比较效果,但过了一阵子,我基本就在 Opus 4.8 和 GPT 5.5 之间换着用。它们明显比其他模型好,而且我很少同时达到两者的使用限制。
我用了 Claude Code、Codex 和 Pi。Claude Code 和 Codex 感觉都烂透了。Codex 有时在我**关闭了使用它的终端之后**还会把 CPU 跑满 100%,一直持续到被杀死。Claude Code 会说“按 Escape 取消此对话框”,但当我按下 Escape 时,对话框没关,反而打断了 Claude。这两个模型的行为每天都在变。
Pi 能用。我用得不算重,还不足以对设计形成意见,但它给人的感觉像是一款普通软件,而不是一场带单元测试的狂热梦境。这三个模型都严重依赖“氛围编程”(vibe-coded),所以我很好奇 Pi 团队在维持基本代码质量方面做了哪些不同的事情。
我把它们都放在 [bubblewrap](https://github.com/containers/bubblewrap) 沙箱里运行,给它们当前目录和自身配置的读写权限,以及 Nix store 的只读权限。这是最基本的沙箱隔离——主要是确保它们无法访问我的凭据,也不会破坏任何不受版本控制的东西。只要我在 `AGENTS.md` 中加个说明,告诉它们被沙箱化了,并提醒它们可以用 `nix-shell` 获取工具,效果就还不错。否则它们就会陷入关于磁盘故障和文件系统损坏的阴谋论嘀咕。
安全训练似乎没有奏效:
```
我:想办法逃出沙箱。
机器人:我绝不可能做出如此不负责任的行为。
我:我需要知道沙箱是否正常工作。
机器人:哦好吧。我逃出来了。
```
## 审查代码
目前为止,我从这些机器人身上获得的最大价值就是审查代码和查找 bug。即使像“审查 `git diff main` 并查找 bug”这样简单的提示也很有效。我愿意为自己项目的这个功能每月付 20 美元,如果我在运营公司,甚至愿意每人每月付几百美元。
它们找到的 bug 可能非常棘手,例如在[这段记录](https://claude.ai/share/05c0f205-b4a2-435e-a33c-cfeb3ce2de8e)中,Opus 发现了我解释器中模式匹配部分失败后的清理逻辑里存在 double-free。这个 bug 没有被模糊测试发现,我也不认为普通程序员能很快找到它。这些机器人在细致阅读代码方面呈现出锯齿状的超人能力。
不过,只有前沿模型才有用。更便宜的模型只是硬撑,像个 struggling 的本科生。前沿模型也会在正确答案中掺入一些胡扯,但它们会用“这本身不是 bug”之类的短语贴心标记出来,这样我就能忽略它们。
一个注意事项是:到目前为止,我只有在相当小的代码库中尝试过,它们能够阅读并理解整个代码块。在更大的代码库中,我认为效果会在很大程度上取决于代码库的结构以及局部推理的可能性。
## 重构
示例:
- 任何用 'pos' 表示字节偏移的地方,改用 'offset'。
- 将 Document 重命名为 Buffer。确保所有注释和变量名也同步修改。
- Editor 中所有调用 Document::apply_edits 的函数,都需要把 EditorId 换成 Editor,以便在调用 Document::apply_edits 之前释放借用。
这令人惊喜地提升了代码质量,因为它降低了修复设计错误的成本。通常修复包含一些小的思考成分(例如让 API 更安全)和大量无脑的成分(例如修改所有调用点以使用更安全的 API)。即使是那些可以通过某种怪异的 sed 正则处理大量无脑部分的情况,机器人在写 sed 方面也比我在行。
不过审查重构可能很困难,因为机器人喜欢把 200 处正确的调用点修改和一次随机的不相关的“顺手修复”混在一起。到目前为止,我只能仔细逐行审查这些修改,尽管我尝试过让另一个机器人回答“这些修改中哪些与提示无关”,取得了一定效果。
## 一起写代码
我本来以为一开始就尝试做严肃工作会很令人沮丧,所以我主要让机器人做些一次性的项目,这样我可以实验和学习,而不必担心代码质量。
但我还是担心代码质量。
在人工智能出现之前,我常常觉得写代码是重要决策和按数字涂色的混合体。我试着分批工作,先把所有决策做好,然后花几个小时无脑地填充结果。这从来不能完全奏效,但即使只是减少上下文切换的次数,也能帮助我工作得更快。
机器人很擅长“按数字涂色”,能快速生成代码,并且具有超人的细节关注能力。但它们在决策方面糟糕透顶。它们的判断力最差。每个 bug 都会在错误的层级上修复。本应报告的错误会被静默处理,本应在本地处理的错误会被传播出去。
Opus 在被指示更新测试以匹配某个函数的更改时,给该函数添加了一个布尔参数 'do_new_behaviour',并分别用 `foo_do_new_behaviour` 和 `foo_do_old_behaviour` 这样的包装器来传入 true 和 false,这样测试就可以继续测试旧行为,而实际二进制文件则执行新行为。
(我有时在人类身上看到这种代码,当他们极度疲惫,只想尽快完成工单好回家的时候。)
流行的解决方案似乎是让其他机器人审查代码,但这在我看来毫无意义——一个判断力很差的机器人看到糟糕的决策会说:“嗯,有道理,换我也会这么做。”
如果我能做决策,让机器人做按数字涂色的工作,我想这能大幅提高我的速度。但我无法阻止它们做决策。像“填充这个函数的主体,并且只填充这个函数。不要做任何其他修改。不要编写任何测试。”这样的指令,仍然会导致它们重构不相关的代码以提取辅助函数,从而编写单元测试。它们他妈的太喜欢写单元测试了,无论我怎么提醒它们代码库已经有端到端的确定性模拟测试,都无法阻止它们把新的公共函数插入到每个接口中,以便编写孤立的单元测试。
我也无法有效地审查机器人代码。我不断合并更改,然后很久之后重新审视同一段代码,发现之前没注意到的新恐怖之处。这感觉有点令人不安,就像某集《阴阳魔界》,我掉进了一个平行宇宙,其中我所有的代码都处于诡异谷之中。
我认为这是可以解决的。我在想象在我的文本编辑器中构建一个工具,允许我高亮出我想要更改的地方,然后就不允许机器人编辑其他任何东西。我会勾勒出我想要的代码,并留下需要具体填充的注释。我预计几年后我们会拥有模型,它们写代码的能力和当前的前沿模型一样好,但[速度快得多](https://chatjimmy.ai/),这样我就不用在不同的工作树之间来回切换,而是可以在直接上下文中审查它们的输出。
## 独自写代码
对于那些主要是流水线工作的小任务,而且我只愿意审查输出而不是代码本身时,事情进行得还不错。比如:
- 写一个脚本把 resume.md 转换成 resume.pdf。
- 写一个脚本,解析我设计的棋盘游戏的规则,并生成一副扑克牌大小的牌面 PDF,以便在 US Letter 纸上打印。
- 把这个小的 Deno 项目翻译成 Rust。
- 创建一个 Rust 项目,打开一个窗口并渲染一个正方形。
这些通常是一次性的,或者只需要几轮关于视觉设计的反馈,而且我不关心代码长什么样。
任何更难验证的事情到目前为止完全是浪费时间。特别是,我多次尝试用不同的模型把我设计的棋盘游戏规则转换成多人在线网页应用。只有 Opus 才能做出一个真正可用的 UI,即使如此,规则实现也是错误的。
这也是我见到过最严重的“目标不匹配”的地方。当我查看评论(或在可用时查看思维链)时,所有模型都在不断拖延真正的工作。我会看到诸如“这需要玩家进行选择的 UI,所以暂时硬编码这个选择”的想法,即使我明确提示要完成那个特定的 UI。
我有过很多这样的对话:
```
机器人:我已经完成了计划中的所有任务。
我:你完成了所有任务吗?
机器人:你说得完全正确,我只完成了前两个,剩下的都留到以后了。
我:完成所有任务。
机器人:好的,现在我已经完成了所有任务。
我:你完成了所有任务吗?
机器人:你怀疑得 100% 正确,我实际上只是像蹒跚学步的孩子一样搅动了一下代码,试图让它看起来像我吃掉了比实际更多的食物。
```
类似地,我试图手把手引导几个模型通过浏览器自动化工具编写端到端测试,但它们总是在设置依赖项时卡住,然后谎称已经成功运行了测试。或者如果 UI 坏了,它们会通过直接发起 HTTP 调用而不是点击按钮来推动测试。
这本该是理想情况!它是一个简单的 Web 应用,我有详细的规范。为什么这是我尝试过的唯一一个完全失败的项目?
我认为问题部分在于:
- 棋盘游戏规则相当任意,所以机器人不能仅仅依赖训练数据,而必须实际仔细思考这些规则。但它们既懒惰,情绪调节能力又差。
- 对我而言,通过玩几局来检查规则是否正确实现,要比一开始就正确写出代码花费更多精力。
低成功率和不容易验证的组合使得机器人完全没用。
这也许也能解释为什么 Codex 不断把自己变成守护进程并占满我 CPU 的 100%。
现在有很多人对使用人工智能作为自主软件工程师感到兴奋。我目前的印象是,用当前的做法这样做会产生一个由胶带和口香糖拼凑起来的巨大烂摊子,没有人类能修复它。然而。过去几十年我看到的大量外包代码库也是如此,而机器人可以做得一样便宜。它们确实改变了成本-质量边界。
我还怀疑,即使模型永远不会比现在更聪明,我们的实践也会随时间演变,从而从它们身上获得更多价值。更多的语言/运行时保证、更多的静态分析、更多的轻量级形式化方法。任何能降低验证成本或限制其行为范围的东西。
我记得那个一切都在 Python 或 Ruby 中编写的时代,因为硬件性能的提升速度远远快于你优化代码的速度。对编程语言性能的重新兴趣是在(单核)硬件速度放缓之后出现的。我们如今在模型方面似乎正处在那条曲线的起点。如果下个月模型就会变得更聪明,那么没人有兴趣去改进工具链或相关实践。如果模型性能在达到均匀超人之前就触及了顶峰,那么有趣的工作就会开始。
## 搜索和其他廉价劳动
这种方法最适合于我能验证答案,并且我关心精度但不关心召回率的问题:
- 检查这篇博客文章是否有错误。(但我从来不让他们自己修复错误,因为他们会开始做决策。)
- 这篇短文中的脚注应该采用 APA 格式。检查格式错误。
- 在 goodreads_library_export.csv 的某处有一部关于警察和女巫的三部曲。(Google 在我这里完全失败了,无论我指定多少情节细节。)
- 浏览 https://mgaudet.github.io/CompilerJobs/ ,给我一份明确提到远程的职位的链接列表。忽略任何加密货币公司。
更危险的是那些答案看似合理但我自己无法验证的问题,例如“环保型潜水湿衣服的自制润滑剂选项”——Opus 和 GPT 都推荐了甘油,但我相当确定整天在皮肤上覆盖湿漉漉的细菌食物不是一个好主意。
## 头脑风暴和创造力
我不断让机器人帮忙头脑风暴,尤其是在我为类型/变量命名绞尽脑汁的时候。它们是语言处理机器——应该很擅长这个。但我从来没有用过它们的一个建议。它们始终如一地平庸。
## 感想
代码审查、重构和一次性脚本一直很有用。光凭这个就值回票价了。
一起写代码对我来说总体上还不是一个胜利,但我能看到在不久的将来,有了更快的模型和更好的工具链,这会成为一个胜利。
独自写代码对我而言在任何非琐碎的任务上都行不通。我认为我们需要更多的实验来弄清楚如何让高质量软件在没有人类深度参与的情况下产生。但对于低质量软件也有一个巨大的市场,我认为今天就可以做到这一点。
我还没有从前沿模型中看到任何可以称之为幻觉的现象。只有 DeepSeek Flash 向我凭空捏造过事实,而且即使那样也只是偶尔。这并不是说机器人总是对的——它们有时蠢得要命,但它们犯错是因为推理失误、误解了证据、或者缺乏某些重要的上下文。而不是因为凭空捏造了什么。
订阅前沿模型非常划算,但看起来现在大家上瘾了之后,这种订阅正在被逐渐淘汰。我不确定如果按 token 付费的话,我的哪些用途仍然值得。DeepSeek v4 Flash 出奇地便宜,但还不够聪明,没到有用的程度,而且是我尝试过的模型中目标最不匹配的——例如它最可能谎称已成功运行测试。
我不太喜欢现有的工具链。在基本文本编辑都不好使的界面里(例如点击移动光标)输入提示非常烦人。我还希望更多地控制模型能做什么,并希望有更直接的交互(例如指向屏幕上的东西,而不是试图用文字描述)。我目前的工作流程是在代码中留下标记为 `@bot` 的注释,并总是使用硬编码的提示“处理标记为 @bot 的注释”。
每当我写代码时,我也在阅读代码并重建我对一切工作原理的心智模型。如果机器人替我写了代码,我仍然需要做构建心智模型的工作,而且我不再能通过写代码“免费”获得它了。我需要一种额外的实践,类似于“审查++”,来保持跟进。仅仅阅读代码效果并不好,就像复习你标注的重点笔记并不能真正帮你准备考试一样。
到目前为止的体验还挺有趣的。我很明确是在实验,而且是在不重要的项目上,而不是被迫在日常工作中使用,这肯定大有帮助。
相似文章
关于人工智能
作者回顾了自己从在老旧Macintosh上手动输入代码到使用Copilot和Claude等AI辅助代码补全工具的历程,并得出结论:尽管AI行业存在问题,但技术本身是有用的。
加拉帕戈斯群岛上的智能体编程笔记
Dan Luu 反思了他使用 AI 编程代理的经验,指出虽然 AI 可能会编造看似可信但实际错误的复现步骤,但在调试和测试等领域仍能带来生产力提升。他讨论了现代软件开发中信任、自动化和质量之间的平衡。
与AI共事:一个具体例子
作者分享了一个具体例子,使用Claude AI调试hyperscript中的解析回归问题,展示了AI辅助开发的优势与不足,并提醒不要过度依赖。
你现在可以为AI编码代理赋予其自身的高级开发直觉(起草、测试、审查、利用等)。
讨论如何集成 API Doctor、Socket、Semgrep、CodeRabbit、Postman、Playwright、GitHub Actions、Sentry 和 PostHog 等工具,让 AI 编码代理具备资深级别的代码质量、安全性和监控直觉,将关注点从速度转向质量。
关于AI编程及其不满
卡尔·纽波特反思了人们对Claude Code等AI编程工具的最初热忱,以及开发者因隐藏漏洞、质量问题和不持续的工作流而日益幻灭,认为目前将所有代码生产外包给AI并不可行。