首页 / 正文

代码修到崩溃时,别再让同一个模型“点头”了:用 Grok 做一次 Bug 复盘

Mooko
发布于 2026-08-31 · 5分钟阅读
1302 浏览
0 点赞 暴击点赞!

代码修到烦了?换个模型当“审计员”,别再让它陪你一起绕圈

项目跑了几天,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,这类任务特别适合拿来测:

  1. 给它一份有噪音的 Bug 案卷。
  2. 故意放入一个看似合理、实际错误的判断。
  3. 看它会不会直接附和。
  4. 看它能否主动区分证据与推测。
  5. 看它给出的验证步骤能不能落地执行。

真正有价值的模型,不是每句话都夸你判断精准。

是它会在你跑偏时,直接把你拽回来。


避坑清单:这些操作会让 Bug 越修越大

1. 把“模型同意”当成“问题确认”

模型说得再笃定,也不等于代码事实成立。

没有日志、调用链、测试结果支撑的结论,都只是候选假设。

2. 一次改五个地方

你同时改事务、缓存、队列、重试和接口参数,跑通了也不知道是哪一处生效。

每轮只验证一个关键假设。慢一点,反而更快。

3. 把完整聊天记录当项目上下文

旧对话里混着过时信息、已废弃方案和错误判断。

喂给新模型前,重新整理事实。别把历史包袱也一起打包过去。

4. 只贴报错,不贴预期行为

“报错了,帮我看”这种问法,基本等于抽盲盒。

要告诉模型:你期望发生什么、实际发生什么、差异出现在哪一步。

5. 让模型直接重构

Bug 没定位时就大改架构,通常是在给未来的自己挖坑。

先拿到可复现路径,再谈优化和重构。


一个能让你早点下班的收尾动作

每解决一个顽固 Bug,都让模型帮你生成一份极短复盘:

请根据本次排查过程,输出一份 Bug 复盘:
- 根因
- 为什么之前没有发现
- 最关键的验证证据
- 修复内容
- 应补充的自动化测试
- 如何避免同类问题再次发生

控制在 300 字以内,写给下次接手这个项目的人看。

别小看这 300 字。

下周同类问题再来,你不需要重新翻半天聊天记录,更不用对着自己写过的“临时修复”发呆。

代码排错最怕的,从来不是 Bug 多。

最怕的是你和模型一起相信了一个错误方向,还越走越远。

卡住时,换个模型做独立诊断。让它质疑你、拆你的假设、逼你拿证据。这个动作,往往比再生成 500 行代码更值钱。

OpenClaw
木瓜AI - 中转平台
木瓜AI - 大模型中转平台上线啦
注册即送免费tokens
聚合 全球顶尖大语言模型,支持 GPT, Claude, Gemini 等。
立即领取tokens