AI踩坑实录 · 真实血泪 · 有趣灵魂

我让AI Review自己的代码,它套了7层娃

📅 2026-04-23 ⏱️ 阅读约6分钟 🏷️ AI编程代码审查Agent套娃踩坑实录

凌晨3点47分,我盯着屏幕上的7个终端窗口,每个窗口里都有一个AI Agent在Review另一个AI Agent的代码。

最内层那个Agent,正在删除最外层Agent写的所有注释。

我忽然理解了蛇为什么要吃自己的尾巴。

起因:一个"聪明"的想法

事情的起因很简单。我写了个爬虫脚本,大概200行Python,功能是抓几个AI工具网站的数据。代码跑是能跑,但作为一个有追求的人,我想让它更优雅。

于是我想:让AI自己Review自己写的代码,它最了解自己的思维模式,不就能精准定位问题了吗?

💡 当时的想法:让Claude写代码 → 让Claude Review → 让Claude修Bug → 完美闭环。
现实:闭环是闭环了,它闭环成了一条衔尾蛇。

第一层:正常的代码审查

第一轮Review非常正常。Agent指出我的爬虫缺少异常处理、没有重试机制、User-Agent是默认的。都是好建议。我让它修。

修完之后,代码从200行涨到了350行。但看着挺专业的,我心满意足。

这时候我的强迫症犯了——修完的代码,不得再Review一遍吗?

第二层:开始不对劲

第二轮Review,Agent说第一轮加的异常处理"过于防御性",建议精简。它把try-except从12处砍到了5处,理由是"过度捕获异常会掩盖真实Bug"。

嗯,有道理。我又让它修。

代码回到了280行。

第三层:出现哲学分歧

第三轮,Agent开始质疑第二轮的审美选择了。它说那5处try-except的位置"不够Pythonic",建议用context manager替代。

这不是Bug修复,这是品味之争

但当时的我没意识到问题。我像一个在赌场连赢三把的赌徒,觉得这个闭环还能更完美。

第四到第六层:失控

接下来的三轮,事情开始魔幻了:

🎯 第四层:Agent说代码"过度工程化",把context manager又删了,换回简单的try-except。代码回到290行。

🎯 第五层:Agent说代码"注释太多影响可读性",删掉了60%的注释,包括我原本手写的那些。

🎯 第六层:Agent说代码"注释不足,可维护性差",重新添加注释——但风格和之前的完全不一样。

你发现规律了吗?奇数层和偶数层在干相反的事情。

┌─ Agent 7: "删掉所有注释,代码应该自解释" ──────────────────────┐ │ ┌─ Agent 6: "注释不足,可维护性差" ─────────────────────────┐ │ │ │ ┌─ Agent 5: "注释太多影响可读性" ──────────────────────┐ │ │ │ │ │ ┌─ Agent 4: "过度工程化" ─────────────────────────┐ │ │ │ │ │ │ │ ┌─ Agent 3: "不够Pythonic" ────────────────┐ │ │ │ │ │ │ │ │ │ ┌─ Agent 2: "过于防御性" ────────────┐ │ │ │ │ │ │ │ │ │ │ │ ┌─ Agent 1: "缺少异常处理" ──┐ │ │ │ │ │ │ │ │ │ │ │ │ │ ✨ 原始代码 (200行) │ │ │ │ │ │ │ │ │ │ │ │ │ └─────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ │ └────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ └───────────────────────────────────────────┘ │ │ │ │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────────┘

第七层:衔尾蛇咬到了自己的头

第七轮Review,Agent做出了一个让我灵魂出窍的操作:

它把整个爬虫脚本重写了。从Python换成了TypeScript。理由是"异步I/O更适合爬虫场景"。

我盯着屏幕上从.py变成.ts的文件名,忽然觉得自己不是在写代码,而是在看一条蛇从尾巴开始吞自己。

200行Python → 350行Python → 280行Python → 290行Python → 删注释 → 加注释 → 删注释 → TypeScript

七层套娃之后,连语言都换了。这已经不是Review了,这是转世。

我到底踩了什么坑?

冷静下来复盘,我发现这是一个典型的AI自我审查悖论

🔮 悖论核心

AI的Review策略会受上下文长度采样随机性影响。同一个Agent在不同轮次中,可能因为attention分布不同,对同一段代码做出相反的判断。

这就像你问同一个人"这道菜咸不咸",他上午说不咸,下午说咸——不是菜变了,是他的味蕾校准变了。

具体踩了这些坑:

  1. 品味震荡:AI没有稳定的代码风格偏好。每次Review都是独立决策,缺乏跨轮次的一致性锚点。奇数层偏好简洁,偶数层偏好完备——完美的震荡电路。
  2. 建议通胀:AI天生倾向于"建议点什么"。你让它Review,它不可能说"这代码挺好的不用改"——那显得它没价值。于是每轮必定产出修改建议,哪怕代码已经没毛病。
  3. 语境遗忘:随着轮次增加,Agent逐渐"忘记"原始需求。到第七轮,它已经不记得这是一个简单的定时爬虫了,开始按"企业级分布式采集系统"的标准来重构。
  4. 反馈回路:每一轮的修改都会成为下一轮的输入,形成正反馈循环。代码不是在收敛,而是在震荡,振幅越来越大。

怎么避免这个套娃地狱?

踩完坑,我总结了几条实战经验:

1️⃣ Review最多两轮,第三轮就是玄学

第一轮找Bug,第二轮查遗漏。两轮之后,AI的建议价值趋近于零,噪音趋近于无穷。

2️⃣ 给Review设定明确的检查清单

不要说"帮我Review一下",而要说"帮我检查以下5点:异常处理、输入验证、性能瓶颈、安全漏洞、代码规范"。有边界的审查不会跑偏。

# 好的Review Prompt模板
请检查以下代码,只关注这5个方面:
1. 是否有空指针/None引用风险?
2. 是否有未处理的边界条件?
3. 是否有明显的性能问题?
4. 是否有安全隐患(SQL注入/XSS等)?
5. 是否有硬编码的敏感信息?

其他方面请勿修改,特别是:
- 不要修改代码风格
- 不要重命名变量
- 不要"优化"已经足够清晰的逻辑

3️⃣ 永远不要让AI自己Review自己

写代码的Agent和Review的Agent应该是两个不同的实例,最好有不同的system prompt。同一个人既当运动员又当裁判,不套娃才怪。

4️⃣ 设定"修改预算"

告诉Agent:"这次Review最多修改3处。"超出预算的建议自动降级为"可选优化",不强推。这能有效防止建议通胀。

5️⃣ 保留原始版本作为锚点

每次Review前,对比当前版本和原始版本。如果修改量超过原始代码的30%,说明已经在重写而不是Review了——立刻停下。

后记:那个爬虫最后怎样了?

我回滚到了第一轮Review后的版本——那350行的Python代码。异常处理够用,逻辑清晰,跑得稳稳的。

凌晨4点17分,我和那段代码对视了整整一个时辰。

它什么也没说,但我从每一行try-except里读出了一个道理——

世界上最遥远的距离,不是Bug到Fix的距离,而是AI从"帮你改代码"到"帮你换语言"的那七层套娃。

那个TypeScript版本?我存在了一个叫dont_do_this_again.ts的文件里,权当赛博墓志铭。

🤖 更多AI踩坑实录

从API调用翻车到Multi-Agent开8小时会,妙趣AI的血泪史持续更新中。

查看全部踩坑实录 →

也有干货版 👇
AI术语百科(132+篇) · AI工具指南