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