别急着复制 AI 代码:一次接口 Bug 排查的验证流程
最近排查了一个比较典型的接口问题:用户明明已经完成支付,但会员权益偶尔没有发放。日志里看不出明显异常,重试后又能成功,属于那种“不稳定但影响体验”的 Bug。
这类问题我现在不会只问某一个模型“原因是什么”。更常用的方式是把同一份脱敏后的日志、伪代码和异常现象分别丢给 ChatGPT、Claude、Gemini、DeepSeek 看一轮。目的不是让 AI 替我定根因,而是看不同模型会把注意力放在哪里。
对 CSDN 读者来说,这个场景应该不陌生:接口、缓存、MQ、事务、读写分离,只要链路稍微长一点,“偶发失败”就很难靠直觉判断。AI 能帮忙的是压缩排查范围,但最后还得回到日志、代码、数据和测试环境里验证。
问题背景:支付成功,但权益偶尔没发
简化后的现象是:
- 支付回调已经收到;
- 订单状态大多数情况下能更新为
PAID; - 会员权益发放有少量失败;
- 手动补偿或再次触发后可以成功;
- 失败日志里经常出现:
order_not_paid。
业务链路大概是:
text
支付回调 -> 更新订单状态 -> 发送权益发放消息 -> 消费消息 -> 查询订单状态 -> 发放会员权益
第一眼看,很多人会怀疑消费端逻辑。但这类问题如果只盯着消费端,很容易漏掉事务和消息时序。
我给 AI 的输入,不是完整代码
公司代码和日志不能原样发给 AI,这个边界要先说清楚。我的做法是只保留最小上下文:
- 删除用户 ID、订单号、手机号、Token;
- 替换内部服务名和域名;
- 保留时间顺序、状态流转、核心字段;
- 用伪代码表达事务和消息位置。
例如:
pseudo
function onPaymentSuccess(event): order = orderRepository.findById(event.orderId)
if order.status == PAID: return
begin transaction order.status = PAID order.payTime = event.payTime orderRepository.update(order)
mq.send("GrantMemberBenefit", { orderId: order.id, userId: order.userId }) commit
消费端:
pseudo
function consumeGrantMemberBenefit(message): order = orderQueryService.getOrder(message.orderId)
if order.status != PAID: log("skip grant, reason=order_not_paid") return
benefit = benefitRepository.findByOrderId(message.orderId)
if benefit.status == GRANTED: return
grantBenefit(order.id, order.userId)
这段伪代码已经足够让模型分析大部分风险点,但不会暴露真实业务细节。
Prompt 不要问“根因是什么”
我之前踩过坑:直接问“这个 Bug 的根因是什么”,模型很容易给一个听起来很像对的答案。现在我会把问题拆开。
第一轮 Prompt:
text
你是后端故障排查助手。
下面是脱敏后的异常现象、核心日志和伪代码。请不要直接给最终根因,只输出:1. 已知事实2. 可能风险点3. 每个风险点对应的验证方式4. 需要补充的日志或数据
要求:- 不要编造系统不存在的组件- 不确定的地方标记为「待确认」- 输出表格
这样得到的结果更容易落地。比如它会把风险拆成:
| 风险点 | 可能表现 | 验证方式 |
|---|---|---|
| MQ 在事务内发送 | 消息先被消费,订单状态还没提交 | 对齐消息发送时间、事务提交时间、消费时间 |
| 消费端查从库 | 主库已提交,从库仍旧值 | 查看数据源路由和主从延迟指标 |
| 失败后直接 return | 一次旧读导致权益永远不发 | 检查是否有重试或补偿任务 |
| 幂等状态不完整 | 发放中状态重复处理 | 查看权益表状态机设计 |
这比一句“可能是事务问题”有用得多。
多模型输出差异:看关注点,不看谁更像专家
同一份材料,我通常会让不同模型各看一次。我的感受是:
| 模型 | 更容易给出的价值 | 适合环节 |
|---|---|---|
| ChatGPT | 拆解链路、补排查步骤 | 初步分析、方案草稿 |
| Claude | 整理长日志、归纳评审意见 | 长上下文材料 |
| Gemini | 摘要和结构化提取 | 日志片段清洗、表格整理 |
| DeepSeek | 中文技术解释、代码逻辑说明 | 代码理解、中文文档 |
| Grok | 补充不同视角 | 讨论开放问题 |
如果任务涉及图像或视频,比如技术配图、产品演示短片、运营封面,则要换另一套判断标准。KULAAI (域名ouai.me)这类统一环境中也可以直接切换使用字节 Seedance 2.0、ChatGPT Image 2.0 做视频生成、图像生成与编辑,但这类结果必须额外做版权、品牌、肖像和平台规范审核,不能只看画面是否好看。
真正定位问题:回到时间线
AI 提醒了“消息可能早于事务提交”,但这只是候选解释。我最后还是按时间线查了一遍。
我补了几类日志:
text
payment_callback_receivedorder_update_beginorder_update_successmq_send_successtransaction_commit_successmq_consume_beginorder_query_resultgrant_benefit_success
并要求日志带上同一个脱敏后的 traceId。排查时重点看:
text
mq_send_success < mq_consume_begin < transaction_commit_success
如果出现这个顺序,就说明消费端确实可能读到未提交状态。再继续检查 orderQueryService.getOrder() 是否走了从库或缓存。如果同时存在从库延迟,那问题概率就更高了。
修复方向:别只改一行代码
最后方案不是简单把 return 改成重试,而是做了几件事:
pseudo
function onPaymentSuccess(event): begin transaction updateOrderToPaid(event.orderId) saveOutboxEvent("GrantMemberBenefit", event.orderId) commit
asyncSendOutboxEvent()
消费端也做了调整:
pseudo
function consumeGrantMemberBenefit(message): order = orderQueryService.getOrderFromPrimary(message.orderId)
if order.status != PAID: retryWithBackoff(message) return
if benefitRepository.existsGranted(message.orderId): return
markBenefitGranting(message.orderId) grantBenefit(message.orderId, message.userId) markBenefitGranted(message.orderId)
这里的关键点有几个:
- 消息发送不要和本地事务混在一起拍脑袋处理;
- 消费失败要有退避重试或补偿机制;
- 查询关键状态时避免旧读;
- 权益发放要有完整幂等状态;
- 修复后必须补自动化回归。
AI 输出怎么验证
我一般按五层验证,不会只看模型答案:
1. 日志验证
看同一 traceId 下,支付回调、订单更新、消息发送、消息消费、权益发放的顺序是否闭合。
2. 代码验证
确认事务边界、MQ 发送位置、查询数据源、缓存读取逻辑是否与模型分析一致。
3. 数据验证
检查订单表、权益表、消息表、补偿表的状态是否能对应上。
4. 测试验证
构造重复回调、消息提前消费、从库延迟、消费失败重试等场景。
5. 上线验证
灰度观察失败率、重试次数、补偿任务堆积量和接口耗时。
如果某条建议无法对应到这些验证动作,基本只能当参考。
多模型工具怎么选
我更关注这几个点:
- 是否能在同一任务里快速切换不同模型;
- 是否方便保存上下文和对比输出;
- 是否支持长文本、代码、表格等常见研发材料;
- 是否能覆盖文本、图像、视频等不同任务形态;
- 是否允许用户自己控制输入范围,避免过度暴露敏感信息。
选工具不是看模型名字堆得多不多,而是看它能不能融入你的工作流。
常见误区
1. AI 生成的代码能直接上线吗?
不能。最多作为草稿或排查建议。上线前仍然要 Code Review、单测、集成测试和灰度验证。
2. 单一模型够不够?
简单代码解释够用。涉及事务、缓存、MQ、兼容性这类问题,多模型交叉看一遍更稳。
3. Prompt 越长越好吗?
不是。重点是给清楚事实、约束输出格式、要求标记不确定项。长但杂,反而会让结果发散。
4. 公司日志能直接发给 AI 吗?
不建议。真实用户信息、订单号、Token、IP、内部域名、密钥、业务敏感字段都要脱敏或抽象。
5. 如何避免 AI 编造 API?
让它基于你提供的代码、版本号、依赖文档回答;不确定时要求标记“待确认”,再回官方文档或源码验证。
总结
AI 辅助 Bug 排查,最好从高频、低风险、可验证的任务开始。不要让模型直接给根因,而是让它先整理事实、列风险点、补验证路径。重要问题可以多模型交叉分析,但最终必须回到日志、代码、数据和测试环境。
我的经验是:AI 更适合做排查过程中的“第二双眼睛”,帮你少漏几个方向;真正负责系统稳定性的,还是开发者自己的验证闭环。
更多推荐




所有评论(0)