AI 编程调试提示词与沟通策略专业手册

05/1849 浏览开发心得
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  前言:为什么需要专业提示词?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AI 在调试时最常见的失败模式有三种:
  1. 「盲猜修复」—— 没有读取足够信息就直接改代码,导致修了一个 BUG 引入三个
  2. 「表层修复」—— 处理了报错信息,但没有定位根本原因,BUG 换个形式复现
  3. 「上下文丢失」—— 多轮对话后 AI 遗忘早期关键细节,重复做无效的尝试
本手册的核心思想:
  - 强迫 AI 先诊断、后治疗(Read before Write)
  - 给 AI 提供「完整的犯罪现场」,而非只有「尸体」
  - 使用结构化语言减少歧义,让 AI 的推理路径可预期
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第一章:黄金原则——提问前的信息准备
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【原则 1】"给犯罪现场,不只给尸体"
  差的提问:「我的代码崩溃了,帮我修一下」
  好的提问:「以下是完整报错栈、触发条件、最近一次修改的 diff,帮我诊断根本原因」
  信息清单(提问前对照检查):
  ┌─────────────────────────────────────────────────────────────────┐
  │ □ 完整错误信息(含行号、堆栈,不要截断)                       │
  │ □ 触发该 BUG 的最小复现步骤        AI 编程调试提示词与沟通策略专业手册                             │
  │ □ 期望行为 vs 实际行为                                          │
  │ □ 相关代码片段(不是整个文件,但要包含上下文)                  │
  │ □ 最近一次改动了什么(修改时间线)                              │
  │ □ 已经尝试过的方案及结果                                        │
  └─────────────────────────────────────────────────────────────────┘
【原则 2】"一次只解决一个问题"
  把复合 BUG 拆开:
    「这里有两个问题:A 问题是……,B 问题是……,先帮我解决 A」
 
  不要同时要求修 BUG + 加功能 + 重构,这会分散 AI 注意力。
【原则 3】"声明约束,防止过度修改"
  「只修改 foo() 函数内部,不要改函数签名和调用方」
  「最小化改动,不要重构无关代码」
  「不要引入新的依赖库」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第二章:强制诊断优先——让 AI 先分析再动手
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
这一章的句式都有一个共同目的:阻止 AI 直接写代码,强制它先做分析。
────────────────────────────────────────────────────────────────────────────────
2.1 「先诊断,不要修」系列
────────────────────────────────────────────────────────────────────────────────
  ► 「先不要修改任何代码。请阅读相关文件,告诉我你认为 BUG 的根本原因是什么,
     以及你的推理过程。等我确认后再动手。」
  ► 「在写任何代码之前,先列出你需要检查的文件和函数,说明为什么要检查这些地方。」
  ► 「分两步走:第一步只做分析,输出你的诊断报告;第二步我说"开始修复"后再改代码。」
  ► 「你现在的假设是什么?请用"假设 → 验证方法 → 预期结果"的格式列出你打算
     如何排查这个问题。」
────────────────────────────────────────────────────────────────────────────────
2.2 「假设驱动排查」系列
────────────────────────────────────────────────────────────────────────────────
  ► 「请列出导致这个 BUG 的所有可能假设,按可能性从高到低排序,
     并说明每个假设的证据和反证。」
  ► 「用"排除法"帮我分析:哪些原因可以首先排除?剩下的候选原因是什么?」
  ► 「对于你的假设 X,如果它是正确的,代码里应该还会有什么其他症状?
     帮我检查一下是否有这些佐证。」
  ► 「我认为问题可能出在 A 或 B,你认为哪个更可能?给我你的理由,
     然后告诉我如何用最小代价验证。」
────────────────────────────────────────────────────────────────────────────────
2.3 「追问根因」系列(五个为什么)
────────────────────────────────────────────────────────────────────────────────
  ► 「你说问题在 line 42,但 line 42 为什么会出错?它的上游数据从哪里来?」
  ► 「这是现象还是根本原因?如果是现象,根本原因是什么?」
  ► 「用"五个为什么"帮我追溯这个 BUG 的根源:
     为什么出现症状 X?因为 Y。为什么 Y?……直到找到可以修改的根本原因。」
  ► 「你的修复方案能防止这类 BUG 再次出现吗?还是只修了这一个实例?」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第三章:精准定位——缩小问题范围的提示词
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
────────────────────────────────────────────────────────────────────────────────
3.1 「二分法定位」系列
────────────────────────────────────────────────────────────────────────────────
  ► 「用二分法帮我缩小范围:如果我把代码从第 100 行截断,BUG 还会出现吗?
     帮我设计一个最小复现案例。」
  ► 「请帮我识别:这个 BUG 是在数据进入模块时就错了,
     还是在模块内部处理时才出错?」
  ► 「我们已知 A 是正确的,B 是错的,中间经过了 C、D、E 三步。
     请帮我判断错误最可能发生在哪一步,以及如何验证。」
────────────────────────────────────────────────────────────────────────────────
3.2 「边界条件排查」系列
────────────────────────────────────────────────────────────────────────────────
  ► 「这个 BUG 是否只在特定条件下触发?
     帮我分析:空输入/极大值/并发/首次调用/重复调用时,行为是否一致?」
  ► 「请专门检查边界条件:null/undefined/空数组/零/负数/最大整数,
     哪种情况会导致这段逻辑走错分支?」
  ► 「这段代码有没有隐含的前置条件?如果调用方没有满足这些前置条件,
     会出现什么情况?」
────────────────────────────────────────────────────────────────────────────────
3.3 「数据流追踪」系列
────────────────────────────────────────────────────────────────────────────────
  ► 「请从数据入口开始,逐步追踪这个变量的值变化路径,
     找出它在哪一步变成了错误的值。」
  ► 「帮我画出(用文字描述)这段逻辑的数据流图:
     输入 → 变换 1 → 变换 2 → … → 输出。每步的预期值是什么?」
  ► 「这个函数的返回值来自哪里?调用链是什么?
     请从报错点向上追溯调用栈,找出最初错误的起点。」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第四章:高质量修复——避免引入新 BUG 的提示词
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
────────────────────────────────────────────────────────────────────────────────
4.1 「修复前的影响评估」
────────────────────────────────────────────────────────────────────────────────
  ► 「在修改 X 之前,告诉我有哪些地方调用了它、依赖它,
     这次改动会影响到哪些地方?」
  ► 「你打算修改哪些行?请先列出来,说明每一处修改的理由,
     以及这处修改不会破坏的断言是什么。」
  ► 「这个修复方案有没有副作用?在什么情况下它会造成新的问题?」
  ► 「如果这个修复方案是错的,最坏的情况是什么?
     我们怎么快速检测出这个修复方案本身有问题?」
────────────────────────────────────────────────────────────────────────────────
4.2 「最小化改动」
────────────────────────────────────────────────────────────────────────────────
  ► 「给我最小化的 diff,只改真正需要改的行,不要顺手重构其他代码。」
  ► 「不要改变代码风格、变量命名和结构,只修复逻辑错误本身。」
  ► 「如果有两种修复方案,一种改 5 行、一种改 50 行,
     优先用改 5 行的方案,除非你能证明它不够安全。」
────────────────────────────────────────────────────────────────────────────────
4.3 「修复后验证」
────────────────────────────────────────────────────────────────────────────────
  ► 「修改完后,请告诉我:如何手动验证这个修复是正确的?
     给我一个具体的测试步骤。」
  ► 「为这个修复写一个测试用例,能够在未来检测同类回归。」
  ► 「现在用之前的报错信息重新走一遍逻辑,告诉我为什么修复后不会再出现那个错误。」
  ► 「除了修复这个 BUG,你有没有发现代码中其他潜在的类似问题?
     列出来但先不要修,等我决定是否处理。」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第五章:对话控制——管理多轮调试会话
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
────────────────────────────────────────────────────────────────────────────────
5.1 「保持上下文」
────────────────────────────────────────────────────────────────────────────────
  ► 「在我们继续之前,请先总结一下目前我们已经确认的事实:
     已知原因是什么,已尝试的方案有哪些,当前的状态是什么。」
  ► 「我们已经排除了哪些假设?把已排除的列出来,
     这样我们不会重复走弯路。」
  ► 「现在的问题焦点是什么?用一句话描述我们正在解决的具体子问题。」
────────────────────────────────────────────────────────────────────────────────
5.2 「拒绝无效循环」
────────────────────────────────────────────────────────────────────────────────
  ► 「这是你第三次修改同一个地方了,但问题还在。
     说明我们的方向可能根本就错了,请退一步,重新提出不同的假设。」
  ► 「不要再往这个方向试了。假设我们之前的所有假设都是错的,
     从零开始告诉我还有哪些可能性我们没有考虑到。」
  ► 「如果你不确定,就说不确定,不要给我一个看起来自信但你没把握的修复方案。
     我宁愿知道你不知道,也不要反复试错。」
────────────────────────────────────────────────────────────────────────────────
5.3 「阶段性确认」
────────────────────────────────────────────────────────────────────────────────
  ► 「我们现在处于排查的哪个阶段?还缺少哪些关键信息?」
  ► 「告诉我你的置信度:对这个诊断你有多少把握(用百分比),
     以及置信度不是 100% 的原因是什么。」
  ► 「在我们进入修复阶段之前,需要我提供哪些额外信息?」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第六章:特殊场景提示词
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
────────────────────────────────────────────────────────────────────────────────
6.1 「偶现/难以复现的 BUG」
────────────────────────────────────────────────────────────────────────────────
  ► 「这个 BUG 不是每次都出现,大约 1/5 的概率触发。
     请帮我分析哪些非确定性因素(时序、随机数、网络、缓存状态)可能导致它。」
  ► 「我无法稳定复现这个 BUG,但有一份崩溃日志。
     请从日志中提取所有可能相关的异常信号,帮我建立复现假设。」
  ► 「帮我在代码中添加防御性日志,覆盖这个 BUG 可能经过的所有路径,
     以便下次出现时能捕获完整的现场信息。」
────────────────────────────────────────────────────────────────────────────────
6.2 「性能 BUG」
────────────────────────────────────────────────────────────────────────────────
  ► 「不要猜测性能瓶颈,帮我设计一个最简单的性能剖析方案,
     先测量再优化。」
  ► 「给我一个 O(n) 复杂度分析:这段代码在输入规模 N 下,
     最坏情况做了多少次操作?」
  ► 「有没有我没意识到的隐藏计算开销?例如隐式类型转换、GC 压力、
     重复计算、不必要的内存分配?」
────────────────────────────────────────────────────────────────────────────────
6.3 「看不懂的遗留代码」
────────────────────────────────────────────────────────────────────────────────
  ► 「先不要修改这段代码。帮我理解它的意图:
     这段代码试图做什么?有哪些隐含的假设?」
  ► 「这段代码写得很奇怪,可能是有意为之(规避某个已知问题),
     也可能是 BUG。帮我分析这两种可能性的证据。」
  ► 「在修改这段遗留代码之前,帮我列出它所有的调用路径和依赖,
     确保我们理解"不小心破坏什么"的风险。」
────────────────────────────────────────────────────────────────────────────────
6.4 「多文件/大型项目」
────────────────────────────────────────────────────────────────────────────────
  ► 「先告诉我你需要读哪些文件才能理解这个问题,
     不要先写代码,先读完再说。」
  ► 「从报错的文件出发,找出它直接依赖的所有模块,
     告诉我哪些地方可能是 BUG 的来源。」
  ► 「这个修复会跨越多个文件,请先列出所有需要修改的文件和修改原因,
     我确认后你再开始逐个修改。」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第七章:元认知提示词——让 AI 检查自己的推理
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
这一章的提示词让 AI 对自己的推理过程进行反思,效果远超直接要求"正确"。
  ► 「用"橡皮鸭调试法":假装向一个完全不懂这个项目的人解释这段代码,
     在解释过程中找出逻辑矛盾。」
  ► 「扮演一个持怀疑态度的代码审查者,指出你刚才给出的修复方案的潜在问题。」
  ► 「如果你的修复是错的,最可能的原因是什么?哪个假设最有可能是错误的?」
  ► 「在你确认这个修复方案之前,检查一下:
     你有没有跳过某个步骤?有没有做了假设但没有验证的地方?」
  ► 「站在"红队"的角度:如果你的任务是证明这个修复方案不完整,你会怎么做?」
  ► 「重新审视你的推理链,找出最薄弱的一环,并告诉我如何验证那一环是否成立。」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第八章:结构化请求模板
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
直接复制使用,填入具体内容即可。
────────────────────────────────────────────────────────────────────────────────
【模板 A】标准 BUG 报告请求
────────────────────────────────────────────────────────────────────────────────
  我遇到了一个 BUG,请帮我诊断。
  **环境信息**
  - 语言/框架版本:[填写]
  - 操作系统:[填写]
  **错误信息**(完整,未截断)
  ```
  [粘贴完整错误信息]
  ```
  **复现步骤**
  1. [步骤1]
  2. [步骤2]
  3. [步骤3]
  **期望行为**:[描述应该发生什么]
  **实际行为**:[描述实际发生了什么]
  **相关代码**
  ```
  [粘贴相关代码,包含上下文]
  ```
  **已尝试方案**:[描述已经试过什么,以及结果]
  请先进行诊断分析,不要立即修改代码。列出可能的根本原因和你的推理过程,
  等我确认后再给出修复方案。
────────────────────────────────────────────────────────────────────────────────
【模板 B】深度分析请求
────────────────────────────────────────────────────────────────────────────────
  请对以下问题进行深度分析,按照以下格式输出:
  1. **现象描述**:用你自己的语言复述这个问题
  2. **可能原因列表**:按可能性从高到低排列(每条附理由)
  3. **排除法**:哪些原因可以直接排除,为什么
  4. **验证方案**:如何以最小代价验证剩余假设
  5. **推荐修复方案**:基于分析给出建议(此时再给修复方案)
  6. **风险提示**:这个修复可能的副作用
  问题描述:[你的问题]
────────────────────────────────────────────────────────────────────────────────
【模板 C】修复前确认请求
────────────────────────────────────────────────────────────────────────────────
  在你修改代码之前,请先回答以下问题:
  1. 你要修改哪些文件的哪些行?(列出具体位置)
  2. 每处修改的目的是什么?
  3. 这些修改会影响哪些其他功能?
  4. 有哪些你没有把握的地方?
  5. 如何快速验证修复是否有效?
  等我确认你的分析没有遗漏后,再开始修改。
────────────────────────────────────────────────────────────────────────────────
【模板 D】反复修复失败后的重置请求
────────────────────────────────────────────────────────────────────────────────
  我们已经尝试了 [N] 次修复但都没有成功,说明我们的方向有根本性的偏差。
 
  请完全忽略我们之前的所有尝试,从零开始思考:
  1. 重新阅读原始报错信息
  2. 列出你在之前的尝试中可能做出的错误假设
  3. 提出 3 个全新的、与之前完全不同的假设
  4. 对每个假设说明:如果它是正确的,我们应该看到什么症状?
 
  不要受之前对话的影响。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第九章:常见反模式——这些提示词会让效果变差
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下是用户常用但效果差的提示词,以及更好的替代方案。
  ✗ 差:「帮我修一下这个 BUG」
  ✓ 好:「诊断这个 BUG 的根本原因,然后给出最小化修复方案」
  ✗ 差:「代码跑不通,看看哪里有问题」
  ✓ 好:「以下是完整报错信息,请从报错点追踪问题根源」
  ✗ 差:「为什么不行?」(没有上下文)
  ✓ 好:「为什么在条件 X 下,函数 Y 返回 Z 而不是期望的 W?」
  ✗ 差:「你改的还是不对」(没有具体说明哪里不对)
  ✓ 好:「你的修复解决了报错,但在 [具体条件] 下行为仍然不正确,
         具体现象是 [描述]」
  ✗ 差:「全部重写一遍」(核弹式解决方案)
  ✓ 好:「只修改产生问题的最小范围,其他代码不要动」
  ✗ 差:「你是对的」(盲目认同)
  ✓ 好:「你的分析中第 2 点让我有疑问,[指出具体疑问]」
  ✗ 差:「继续」(无方向的推进)
  ✓ 好:「基于当前诊断,下一步最高优先级应该验证哪个假设?」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  第十章:高阶技巧——让 AI 真正"思考"而非"生成"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
────────────────────────────────────────────────────────────────────────────────
10.1 约束输出格式,强迫结构化思维
────────────────────────────────────────────────────────────────────────────────
  「用以下格式回复,每一节都必须填写,不允许跳过:
   [观察] 你从代码/日志中观察到的事实(不包含推断)
   [假设] 基于观察提出的假设
   [验证] 如何验证每个假设
   [结论] 目前最可信的根本原因
   [方案] 修复建议(如果结论足够确定)」
────────────────────────────────────────────────────────────────────────────────
10.2 要求解释推理过程
────────────────────────────────────────────────────────────────────────────────
  「不仅要告诉我修改什么,还要用'因为 A,所以 B,因此修改 C'
   的格式解释每一步的逻辑。」
  「把你的推理过程完整写出来,即使有些步骤显而易见,
   我需要验证你的推理链条是否有断层。」
────────────────────────────────────────────────────────────────────────────────
10.3 主动要求 AI 承认不确定性
────────────────────────────────────────────────────────────────────────────────
  「如果有任何你不确定的地方,明确标注'[不确定]',
   并说明还需要哪些信息才能确定。」
  「区分"我确定这个修复是正确的"和"这个修复可能有效,但我无法完全确认",
   诚实地告诉我你的把握程度。」
────────────────────────────────────────────────────────────────────────────────
10.4 利用对比分析
────────────────────────────────────────────────────────────────────────────────
  「对比正常情况和异常情况:在 BUG 出现前代码路径是什么?
   出现后路径在哪里分叉了?」
  「这段代码在版本 A 里是好的,版本 B 里坏了,
   帮我对比两个版本的关键差异,定位引入 BUG 的具体改动。」
────────────────────────────────────────────────────────────────────────────────
10.5 利用类比和反例
────────────────────────────────────────────────────────────────────────────────
  「写一段能正常工作的最小示例代码,它和我的问题代码的结构相同,
   然后对比两者的差异。」
  「给我一个这种 BUG 的教科书案例(不使用我的代码),
   然后告诉我我的代码如何对应到这个模式。」
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  附录:快速参考卡片
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  开始调试时的三句话:
  ┌─────────────────────────────────────────────────────────────────┐
  │ 1. 「先不要修代码,告诉我你认为的根本原因」                    │
  │ 2. 「你的推理依据是什么?有没有你没验证的假设?」              │
  │ 3. 「修改前,告诉我这处改动会影响哪些地方」                    │
  └─────────────────────────────────────────────────────────────────┘
  修复循环失败时的重置句:
  ┌─────────────────────────────────────────────────────────────────┐
  │ 「忘掉之前所有尝试,重新从原始症状出发,提出全新假设」         │
  └─────────────────────────────────────────────────────────────────┘
  验收修复时的检查句:
  ┌─────────────────────────────────────────────────────────────────┐
  │ 「用一句话告诉我:为什么修复后这个 BUG 不会再出现?」          │
  └─────────────────────────────────────────────────────────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                    本手册核心理念总结
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  【诊断优先于修复】  先确认病因,再开处方
  【完整信息优于简洁】 宁可多提供,不要让 AI 猜测
  【约束比自由更有效】 告诉 AI 不能做什么,往往比告诉它做什么更重要
  【显式优于隐式】   把你的假设说出来,而不是期望 AI 自动理解
  【追问优于接受】   收到分析后继续追问,直到推理链条完整
  【承认不确定性】   要求 AI 标注不确定的部分,比盲目自信的答案更有价值
7
1
2