代码修到烦了?换个模型当“审计员”,别再让它陪你一起绕圈
项目跑了几天,Bug 也修了几天。
你改一处,它冒两处;你提出一个判断,模型立刻说“对,就是这个问题”,然后给出一段看似合理的代码。跑起来?啪,又炸了。
最气人的不是模型写错代码。
是它过度顺从你的判断。你怀疑 A,它就沿着 A 拼命推演;可真正的问题藏在 B、C,甚至是你压根没检查过的配置文件里。
这时候继续在同一个对话里硬扛,通常只会越聊越乱。上下文里堆满旧补丁、废弃假设和临时方案,模型也会被带偏。像两个人拿着错误地图找路,走得还特别自信。😅
一个更实用的办法是:换模型,清空情绪,做独立复盘。
比如把 Grok 当成项目的外部技术审计员,让它别急着写代码,先判断你到底卡在哪里。
为什么同一个模型会越修越乱?
AI 编程有个很真实的坑:它会努力维持对话的一致性。
这听起来很贴心,实战里却可能要命。
假设你一开始说:
我怀疑是数据库连接池没释放。
模型可能围绕连接池给你分析、改代码、补日志、加重试。你改了三轮,问题还是存在。因为根因也许是:
- 某个异步任务重复消费消息
- 环境变量加载了旧配置
- 缓存 Key 写错,读到了脏数据
- 前端请求重复触发
- 数据库事务没有按预期提交
模型不是故意糊弄你。
它只是接收了你的前提,然后非常勤奋地在这个前提里工作。前提错了,后面的推理再漂亮也没用。
更麻烦的是,连续对话会产生“补丁依赖”。
你让它改过 A,它为了兼容 A 再改 B;B 改完影响 C;C 出问题又回头加一个兜底。几天后,代码像贴满创可贴的水管,漏不漏全靠运气。
卡住时,别问“怎么修”,改问“我哪里想错了”
当你已经修了很多轮,建议暂停写代码。
把问题交给另一个模型,并且明确要求:不要顺着我的结论走。
你需要的不是一个热情的代码生成器,而是一个敢说“你方向错了”的排查搭子。
可以直接复制这段提示词:
你现在是我的高级代码审计员,不要急着给修复代码。
我正在排查一个持续多天的 Bug。请你独立分析,不要默认我目前的判断是对的,也不要为了迎合我而重复我的结论。
请按下面的结构回答:
1. 用一句话复述你理解到的现象。
2. 区分“已确认事实”“我的推测”“缺失信息”。
3. 给出 3~5 个最可能的根因,并按概率排序。
4. 对每个根因,告诉我最小验证动作是什么。
5. 指出我现有排查思路里可能存在的误区。
6. 只推荐能帮助定位问题的日志、断点或测试,不要立刻给大段重构代码。
这是项目背景、报错信息、关键代码和我已经尝试过的方案:
[把资料贴在这里]
这段话有两个关键点:
- 把“事实”和“猜测”拆开。很多 Bug 之所以难,是因为猜测被误当成了事实。
- 要求最小验证动作。别再接受“建议你检查一下”。检查什么?看哪个字段?预期值是什么?不说清楚就是废话。
给 Grok 的材料,别一股脑扔聊天记录
把几天对话原封不动丢进去,模型也容易头大。
更好的做法是整理一份“Bug 案卷”。控制在 500~1500 字,信息密度越高越好。
一份好案卷该包含什么?
## 目标行为
用户提交订单后,应创建订单、扣减库存,并返回支付链接。
## 实际现象
约 20% 的订单接口返回成功,但库存没有扣减。
## 稳定复现条件
并发 20 个请求时更容易出现;本地单请求暂未复现。
## 已确认事实
- 订单表中存在对应订单记录
- 接口 HTTP 状态码为 200
- 库存扣减日志偶尔缺失
- 数据库没有明显报错
## 当前猜测
怀疑是事务或异步队列问题,但未证实。
## 已尝试方案
- 增加事务注解:无明显变化
- 队列消费者重试:问题仍出现
- 在库存接口增加日志:发现部分请求没有进入该方法
## 关键代码
[贴订单创建、消息投递、库存扣减相关代码]
## 环境信息
Node.js 版本、框架版本、数据库、消息队列、部署方式、并发情况。
注意这里的表达方式。
“我觉得是事务问题”只能放在当前猜测里,不能写成结论。
这一步看着简单,实际能救命。很多人整理到这里,自己就发现了盲区:诶,库存方法根本没被调用,那还盯着 SQL 干嘛?
用“假设—验证”节奏,别让模型直接开刀
模型最容易犯的错,是看到报错就开始改。
你也别让它这么干。
正确节奏是:提出假设 → 设计验证 → 拿到结果 → 缩小范围 → 再修复。
一个实际对话示例
你可以这样问:
现象:接口返回 200,订单创建成功,但部分库存未扣减。
请不要提供修复方案。
请列出最可能的 4 个根因,并给出每个根因对应的一条验证命令、日志字段或断点位置。
要求:每个验证动作都要说明“看到什么结果就能排除该假设”。
理想的回答应该像这样:
| 假设 | 怎么验证 | 什么结果能排除 | | --- | --- | --- | | 库存消息未成功投递 | 记录消息 ID、投递结果、Broker 确认回调 | 每笔订单都有唯一消息 ID 且确认成功,可排除 | | 消费者处理失败后被吞掉 | 查询死信队列、失败日志、重试次数 | 无失败消息且消费者日志完整,可排除 | | 并发导致库存更新条件不成立 | 记录 SQL 影响行数、库存版本号 | 每次影响行数均为 1,可排除 | | 调用链分支提前返回 | 在库存调用前后记录订单 ID 和分支标记 | 所有订单都经过调用点,可排除 |
看到没?
这才叫排查。不是“试试加锁”“试试重启”“试试重构”。那种建议谁不会说啊。
多模型协作的正确分工
一个模型从头陪你写到尾,很容易形成思维惯性。
更稳的配置是让不同模型干不同的活:
- 主力模型:读代码、补实现、写单元测试、处理具体改动。
- 审计模型:挑战现有结论,找漏掉的边界条件。
- 文档模型:整理排查记录、输出复盘和变更说明。
如果你在测试 Grok 4.7,这类任务特别适合拿来测:
- 给它一份有噪音的 Bug 案卷。
- 故意放入一个看似合理、实际错误的判断。
- 看它会不会直接附和。
- 看它能否主动区分证据与推测。
- 看它给出的验证步骤能不能落地执行。
真正有价值的模型,不是每句话都夸你判断精准。
是它会在你跑偏时,直接把你拽回来。
避坑清单:这些操作会让 Bug 越修越大
1. 把“模型同意”当成“问题确认”
模型说得再笃定,也不等于代码事实成立。
没有日志、调用链、测试结果支撑的结论,都只是候选假设。
2. 一次改五个地方
你同时改事务、缓存、队列、重试和接口参数,跑通了也不知道是哪一处生效。
每轮只验证一个关键假设。慢一点,反而更快。
3. 把完整聊天记录当项目上下文
旧对话里混着过时信息、已废弃方案和错误判断。
喂给新模型前,重新整理事实。别把历史包袱也一起打包过去。
4. 只贴报错,不贴预期行为
“报错了,帮我看”这种问法,基本等于抽盲盒。
要告诉模型:你期望发生什么、实际发生什么、差异出现在哪一步。
5. 让模型直接重构
Bug 没定位时就大改架构,通常是在给未来的自己挖坑。
先拿到可复现路径,再谈优化和重构。
一个能让你早点下班的收尾动作
每解决一个顽固 Bug,都让模型帮你生成一份极短复盘:
请根据本次排查过程,输出一份 Bug 复盘:
- 根因
- 为什么之前没有发现
- 最关键的验证证据
- 修复内容
- 应补充的自动化测试
- 如何避免同类问题再次发生
控制在 300 字以内,写给下次接手这个项目的人看。
别小看这 300 字。
下周同类问题再来,你不需要重新翻半天聊天记录,更不用对着自己写过的“临时修复”发呆。
代码排错最怕的,从来不是 Bug 多。
最怕的是你和模型一起相信了一个错误方向,还越走越远。
卡住时,换个模型做独立诊断。让它质疑你、拆你的假设、逼你拿证据。这个动作,往往比再生成 500 行代码更值钱。