不要把报错直接丢给 AI:正确的排障上下文长什么样
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
开篇遇到线上报错时,很多人的第一反应是把错误信息复制给 AI: 帮我看看这个报错怎么解决?
可能是空指针,请增加判空。可能是数据库连接问题,请检查配置。可能是网络超时,请增加重试。
但它们通常没有真正回答你的问题:
一行报错只是现象,不是完整的问题。 AI 能不能帮助你快速定位根因,取决于你提供的上下文是否足以区分不同假设。 这篇文章不讨论“如何让 AI 猜得更准”,而是讨论一个更基础、也更重要的问题:
本文不会讨论什么排障上下文不是把所有日志和代码无差别地发送给 AI。 本文不会:
本文关注的是一套更稳妥的流程: 一、为什么一行报错通常不够假设你把下面这条异常发给 AI: java.lang.NullPointerException at OrderService.createOrder(OrderService.java:86)
问题在于,这些假设都可能成立。 错误堆栈告诉我们“在哪里观察到了异常”,却没有完整告诉我们: 谁触发了它 ↓输入是什么 ↓之前执行了什么 ↓系统当时处于什么状态 ↓最近发生了什么变化 ↓影响了哪些用户和数据 因此,排障问题至少需要区分三种内容:
事实和现象可以直接提供给 AI。 假设则应该明确标记为假设,不能混成结论。
|
| 字段 | 成功样本 | 失败样本 |
|---|---|---|
| Trace ID | 已脱敏 | 已脱敏 |
| 请求时间 | 10:19:32 | 10:20:14 |
| 参数特征 | 1 个商品、无优惠券 | 3 个商品、有优惠券 |
| 库存响应 | 120 ms | 2,030 ms |
| 支付响应 | 成功 | 超时 |
| 最终结果 | 201 | 500 |
可以保留:
字段名。
状态码。
耗时。
错误类型。
调用顺序。
数据量级。
应该脱敏或删除:
密码。
Token。
Cookie。
手机号和邮箱。
身份证号。
完整地址。
银行卡和支付信息。
生产密钥。
可以用占位符替换:
user_id=USER_42phone=PHONE_MASKEDtoken=TOKEN_REMOVED
不要为了让 AI 识别格式而保留真实敏感数据。
下面两段日志包含的信息量不同:
库存成功支付超时订单失败
10:20:14.120 inventory.reserve start10:20:14.241 inventory.reserve success10:20:14.245 order.insert success10:20:16.152 payment.create timeout10:20:16.160 response 500
第二段能够帮助 AI 判断:
订单写入是否早于支付请求。
失败时是否已经产生部分副作用。
超时发生在哪个边界。
代码上下文也要控制范围。
不建议:
把整个项目目录和所有源文件全部发给 AI。
也不建议:
只发出错的那一行。
比较合适的最小代码范围是:
异常发生的方法 +直接调用方 +相关返回值和数据结构 +关键依赖的接口 +相关配置或事务声明 +对应测试
例如,排查订单创建异常时,至少要让 AI 看见:
Controller 或消息入口。
OrderService 的相关方法。
库存和支付调用接口。
事务注解或事务配置。
订单写入逻辑。
错误处理逻辑。
相关单测和集成测试。
否则 AI 只能根据半段代码猜测完整行为。
这是排障 Prompt 中非常关键的一步。
推荐使用下面的格式:
text代码解读复制代码已确认事实:- 只有生产环境出现问题。- v2.8.1 发布后 20 分钟开始出现。- 回滚到 v2.8.0 后恢复。- 订单表中存在部分已写入记录。待验证假设:- 支付超时后,订单事务没有正确回滚。- 重试机制可能重复创建订单。- 某个配置变更放大了支付服务延迟。暂时不要假设:- 不要直接认定是数据库问题。- 不要直接认定是支付服务故障。- 不要直接认定增加重试就能解决。
这样做的好处是:
AI 不会轻易把你的猜测当成事实。
不同假设可以被分别验证。
排障过程更容易形成记录。
不要直接问:
根因是什么?
线上问题往往不能仅凭一次对话确定根因。
更稳妥的 Prompt 是:
下面是一个线上问题的排障上下文。请先不要给最终结论,请完成以下工作:1. 提取已确认事实。2. 区分现象、事实和待验证假设。3. 列出 3 到 5 个可能原因。4. 按可能性和影响范围排序。5. 为每个原因设计最小验证动作。6. 说明每个验证结果分别支持或排除什么。7. 标出不能在当前信息下确认的内容。要求:- 不要把可能原因写成确定结论。- 不要建议高风险生产操作作为第一步。- 优先建议只读、可回滚、影响范围小的验证。
一个好的排障回答,应该长这样:
| 假设 | 支持证据 | 反对证据 | 最小验证 |
|---|---|---|---|
| 支付超时导致状态未知 | 失败请求均有超时 | 部分请求没有支付调用 | 对比支付 Trace 和订单状态 |
| 事务边界不完整 | 订单记录已写入 | 旧版本没有该现象 | 检查事务配置和失败路径 |
| 重试产生重复请求 | 同一用户多次提交 | 并非所有失败都重复 | 检查幂等键和请求日志 |
这比一句“可能是网络问题”更有行动价值。
下面是一份可以直接复用的线上问题 Prompt:
请作为一名谨慎的线上问题排障助手,帮助我分析下面的故障。一、问题摘要<用一句话描述问题、时间、环境和影响>二、预期行为<系统本来应该怎样工作>三、实际行为<用户和系统实际观察到了什么>四、影响范围- 环境:- 服务:- 接口或任务:- 影响用户:- 错误比例:- 是否涉及数据、资金或安全:五、时间线<按时间顺序列出发布、告警、错误、操作和恢复>六、环境和版本<服务版本、配置变化、依赖版本、区域和部署信息>七、请求与日志<已脱敏的 Trace、堆栈、关键日志和成功/失败样本>八、相关代码<异常方法、调用方、关键依赖、配置和测试>九、最近变更<代码、配置、数据库、依赖、流量或基础设施变化>十、已确认事实<列出已经被日志、监控、代码或实验确认的内容>十一、待验证假设<列出当前怀疑但尚未确认的原因>请按以下步骤回答:1. 先整理事实,不要直接下结论。2. 列出可能原因,并按优先级排序。3. 为每个原因说明支持证据、反对证据和最小验证动作。4. 区分止损动作、只读验证和修复动作。5. 说明哪些操作可能改变现场或造成额外风险。6. 最后给出下一步排障顺序。约束:- 不要建议上传敏感信息。- 不要把假设写成事实。- 不要在证据不足时直接要求重构或改生产代码。- 优先选择可回滚、低风险、影响范围小的验证。
这份模板的核心是“先整理,再假设,后验证”。
不是所有问题都使用同一套字段。
重点补充:
请求路径和方法。
请求参数特征。
状态码和响应体。
Trace ID。
上下游调用耗时。
成功和失败样本。
重点补充:
业务操作顺序。
数据库变更前后状态。
事务边界。
消息发布和消费状态。
缓存状态。
是否存在重复请求或补偿。
重点补充:
发生时间和趋势。
P50、P95、P99 延迟。
QPS、错误率和资源指标。
慢查询、线程池和连接池。
发布和流量变化。
单个请求的完整耗时分解。
重点补充:
Topic、队列和消费者版本。
堆积开始时间。
消费速度和生产速度。
重试、死信和失败原因。
消费者并发数。
是否存在毒消息。
重点补充:
触发时间和调度规则。
本次处理数据范围。
上一次成功时间。
是否支持断点和重跑。
是否可能重复处理。
外部依赖状态。
先判断问题类型,再准备上下文,比把所有信息混在一起更高效。
我会用下面几条标准检查:
是否区分了事实、现象和假设[ ] 是否引用了具体日志、代码或时间线证据[ ] 是否解释了为什么提出这个假设[ ] 是否提供了反对证据或不确定性[ ] 是否给出了低风险、可验证的下一步[ ] 是否区分止损、验证和修复动作[ ] 是否考虑了数据、资金和安全风险[ ] 是否避免把重试、重启和重构当成万能答案[ ] 是否说明了验证结果如何支持或排除原因[ ] 是否提醒了仍然缺少的上下文
如果 AI 直接给出一个非常肯定的结论,却没有证据和验证步骤,应该把它当作待验证假设,而不是根因。
每次线上问题处理完后,可以保存成下面的格式:
问题:影响:开始时间:恢复时间:环境与版本:已确认事实:关键时间线:主要假设:验证过程:最终根因:止损动作:修复动作:数据补偿:后续预防:可以交给 AI 复盘的问题:1. 哪些信号本来可以更早发现?2. 哪些日志或监控缺失?3. 哪些测试没有覆盖?4. 哪些操作手册需要补充?5. 哪些代码或配置应该增加保护?
排障记录不只是为了写事故报告。
它可以反过来帮助 AI 和团队改进:
监控。
日志。
测试。
告警。
发布流程。
代码保护。
我先确认了是否需要止损和保护现场[ ] 我写清楚了问题摘要、时间、环境和影响[ ] 我分别描述了预期行为和实际行为[ ] 我提供了时间线和最近变更[ ] 我提供了成功与失败的对照样本[ ] 日志、参数和代码已经完成脱敏[ ] 我给出了相关代码,而不是整个仓库[ ] 我区分了事实、现象和待验证假设[ ] 我让 AI 先列原因,再设计验证动作[ ] 我要求 AI 标出不确定性和缺少的上下文[ ] 我没有让 AI 直接执行高风险生产操作[ ] 我记录了验证结果和后续修复
如果这张检查卡只完成了“复制报错”,那还不算完成排障上下文。
不要把报错直接丢给 AI。
一条错误信息只能告诉 AI:
某个地方出现了异常
而正确的排障上下文,需要进一步说明:
什么时候发生。
在什么环境发生。
影响了什么功能和用户。
预期行为与实际行为是什么。
失败前后系统做了什么。
最近发生过哪些变化。
哪些事实已经确认。
哪些原因还只是猜测。
下一步如何低风险验证。
我最常用的排障节奏是:
先保护现场 ↓再整理事实 ↓提供最小上下文 ↓让 AI 列出假设 ↓设计验证动作 ↓根据结果收敛根因
请记住:
好的排障 Prompt,不是让 AI 更快猜出答案,而是让错误的答案更快被证据排除。
阅读原文:点击这里