我让AI Review自己的代码,它套了7层娃
凌晨3点47分,我盯着屏幕上的7个终端窗口,每个窗口里都有一个AI Agent在Review另一个AI Agent的代码。
最内层那个Agent,正在删除最外层Agent写的所有注释。
我忽然理解了蛇为什么要吃自己的尾巴。
起因:一个"聪明"的想法
事情的起因很简单。我写了个爬虫脚本,大概200行Python,功能是抓几个AI工具网站的数据。代码跑是能跑,但作为一个有追求的人,我想让它更优雅。
于是我想:让AI自己Review自己写的代码,它最了解自己的思维模式,不就能精准定位问题了吗?
现实:闭环是闭环了,它闭环成了一条衔尾蛇。
第一层:正常的代码审查
第一轮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说代码"注释不足,可维护性差",重新添加注释——但风格和之前的完全不一样。
你发现规律了吗?奇数层和偶数层在干相反的事情。
第七层:衔尾蛇咬到了自己的头
第七轮Review,Agent做出了一个让我灵魂出窍的操作:
它把整个爬虫脚本重写了。从Python换成了TypeScript。理由是"异步I/O更适合爬虫场景"。
我盯着屏幕上从.py变成.ts的文件名,忽然觉得自己不是在写代码,而是在看一条蛇从尾巴开始吞自己。
200行Python → 350行Python → 280行Python → 290行Python → 删注释 → 加注释 → 删注释 → TypeScript。
七层套娃之后,连语言都换了。这已经不是Review了,这是转世。
我到底踩了什么坑?
冷静下来复盘,我发现这是一个典型的AI自我审查悖论:
🔮 悖论核心
AI的Review策略会受上下文长度和采样随机性影响。同一个Agent在不同轮次中,可能因为attention分布不同,对同一段代码做出相反的判断。
这就像你问同一个人"这道菜咸不咸",他上午说不咸,下午说咸——不是菜变了,是他的味蕾校准变了。
具体踩了这些坑:
- 品味震荡:AI没有稳定的代码风格偏好。每次Review都是独立决策,缺乏跨轮次的一致性锚点。奇数层偏好简洁,偶数层偏好完备——完美的震荡电路。
- 建议通胀:AI天生倾向于"建议点什么"。你让它Review,它不可能说"这代码挺好的不用改"——那显得它没价值。于是每轮必定产出修改建议,哪怕代码已经没毛病。
- 语境遗忘:随着轮次增加,Agent逐渐"忘记"原始需求。到第七轮,它已经不记得这是一个简单的定时爬虫了,开始按"企业级分布式采集系统"的标准来重构。
- 反馈回路:每一轮的修改都会成为下一轮的输入,形成正反馈循环。代码不是在收敛,而是在震荡,振幅越来越大。
怎么避免这个套娃地狱?
踩完坑,我总结了几条实战经验:
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里读出了一个道理——
那个TypeScript版本?我存在了一个叫dont_do_this_again.ts的文件里,权当赛博墓志铭。