← Blog
·9 blog.minutes

利用 AI 助手调试完整指南

AI 助手在发现 bug 方面表现出色——只要你知道如何提问。本指南涵盖将 AI 从代码生成器转变为调试伙伴的技巧。

调试是软件开发中最耗时的部分。研究一致表明,开发者花费 30% 到 50% 的时间在查找和修复 bug 上。AI 助手在帮助完成这项工作方面出奇地擅长,但前提是你以正确的方式使用它们。让 AI 调试你的代码与让它编写代码不同,适用于生成的技术通常在调试中失效。

本指南涵盖了使 AI 在调试中有效的具体技术。每种技术针对不同类型的 bug 和调试过程的不同阶段,从初步诊断到根因分析再到修复验证。

技术 1:隔离提示词

开发者在用 AI 调试时最常见的错误是转储整个文件或错误堆栈并问「哪里出错了」。AI 接收了数百行上下文,其中大部分与 bug 无关,然后产生模糊或误导性的答案,因为它无法判断输入的哪些部分是重要的。

隔离提示词通过在让 AI 诊断之前缩小范围来解决这个问题。提取出能够复现 bug 的最小代码,剥离所有其他内容,只呈现相关的函数或组件以及具体的错误或不正确行为。

// 低效——上下文过多
"Here is my entire authentication module. It throws an error sometimes. What is wrong?"

// 高效——隔离的上下文
"This function throws 'Cannot read properties of undefined (reading role)' when called with a user object that has no organization field:

function hasAccess(user) {
  return user.organization.role === 'admin';
}

The error reproduces when user.organization is undefined. Should this function check for the existence of organization before accessing role?"

隔离提示词之所以有效,是因为它消除了 AI 关于什么相关的歧义。通过隔离出问题的代码并精确描述症状,你给 AI 提供了一个集中的问题来解决,而不是一个需要搜索的草堆。这一单一技术能显著提高调试响应的质量。

技术 2:假设生成器

当你被一个 bug 困住且已经用尽自己的想法时,AI 可以充当假设生成器。与其问哪里出错了,不如问可能的原因。这将 AI 的角色从诊断者重新定位为头脑风暴伙伴,发挥其作为模式匹配引擎的优势。

要使用这项技术,呈现症状并让 AI 生成潜在根因的列表。然后自己测试每个假设。AI 更擅长生成可能性而非验证它们,因此你在保持对调试过程的控制的同时,受益于模型对 bug 模式的广泛知识。

"I have a React component that re-renders twice on every state change, even when the state does not affect the component's output. The component uses useState and useEffect. What are five possible causes I should check?"

假设生成器对于间歇性 bug、竞态条件和平台相关问题尤其有价值。这些是最难复现和诊断的 bug,而 AI 从其训练数据中回忆晦涩失败模式的能力可以揭示你根本想不到的可能性。

技术 3:有记忆的橡皮鸭

橡皮鸭调试——向一个无生命物体解释你的代码来澄清思路——是一种众所周知的技术。AI 助手使其效果显著提升,因为鸭子会回话并且对对话有完美的记忆。

要使用这项技术,逐步走一遍你的调试过程,边进行边向 AI 解释每个假设和每个测试结果。AI 跟踪完整的上下文,并能指出矛盾、遗漏的步骤或与证据不符的假设。这对于涉及多个组件或数据流的复杂 bug 尤其强大。

关键是将 AI 视为一个有耐心的听众,会记住你调查的完整叙事。描述你期望发生什么、实际发生了什么、以及你已经测试了什么。AI 常常在你还没说完解释就能发现你推理中的缺陷。

技术 4:差异对比分析

当一个 bug 是由最近的变更引入时,工作版本和损坏版本之间的 Git 差异对比是你能够给 AI 的最有价值的输入。与需要在脑中重构变更的人类审查者不同,AI 可以分析确切修改的行,并识别哪个修改导致了回归。

这项技术需要一份干净的差异对比。只暂存相关的变更,生成差异对比,并连同症状一起呈现。AI 会分析每个修改的行,并标记潜在问题,噪音远少于粘贴整个文件。

"This diff introduced a bug where the payment form submits twice when the user clicks the Pay button. The form worked correctly before this change.

[Diff output here]

Which change in this diff is most likely causing the double submission?"

差异对比分析之所以有效,是因为 AI 比较两个状态——之前和之后——这与人类审查者执行的心理操作相同。区别在于 AI 可以同时处理整个差异对比,并考虑不同修改之间的交互,而人类逐行阅读时可能会忽略这些。

技术 5:单元测试调试器

用 AI 调试最可靠的方法之一是让它编写一个复现 bug 的失败测试,然后让它修改代码以使测试通过。这分离了诊断和修复,并给了你一个关于问题所在的可验证产物。

这个过程分三步。首先,描述 bug 并让 AI 编写一个在当前行为下会失败的测试。其次,运行测试确认它按预期失败——这验证了 AI 正确理解了 bug。第三,让 AI 修改实现使测试通过。

这项技术之所以强大,是因为测试成为了 bug 的文档。未来的开发者阅读这个测试时会确切理解缺少了什么边界情况以及为什么需要修复。它同时也让你对修复确实有效充满信心,因为之前失败的同一个测试现在通过了。

技术 6:基于约束的调试器

有些 bug 出现在你未编写的代码中——库、框架或第三方服务。当问题不在你的控制范围内时,AI 可以通过推理约束而非阅读源代码来帮助你理解行为。

向基于约束的调试器呈现你所知道的信息:库版本、你调用的 API、你期望的行为和你观察到的行为。让 AI 根据库的文档化行为推理可能导致差异的原因。AI 通常可以识别已知问题、特定版本的怪癖或解释该 bug 的配置要求。

"I am using Prisma v5.14 with PostgreSQL 16. A findMany query with include and where on a relations field returns duplicate results when the relation has multiple matching records. This is the query:

const results = await db.user.findMany({
  where: { active: true },
  include: { posts: { where: { published: true } } },
});

Is this a known behavior, a version-specific bug, or am I misunderstanding the query?"

基于约束的调试器实际上是通过 AI 训练数据的交互式搜索。AI 无法访问库当前的 issue 追踪器,但它可以回忆起其训练期间常见的错误、文档化的限制和社区讨论。这通常比手动翻查 GitHub issue 更快得到答案。

构建 AI 辅助的调试工作流

这些技术在组合成系统化的调试工作流时效果最佳。从隔离提示词开始缩小问题空间。卡住时使用假设生成器。用有记忆的橡皮鸭来走一遍你的推理。涉及回归时使用差异对比分析。用单元测试调试器编写一个失败测试。当问题可能出在依赖项而非你自己的代码中时,使用基于约束的调试器。

最重要的一点是记住,AI 是加速你调试的工具,而非替代。AI 生成假设并分析模式,但你验证结果并做出最终决定。一次好的 AI 辅助调试会话是一种协作,双方各自做自己最擅长的事——AI 处理大量潜在原因,你运用判断力和领域知识来缩小范围。

随着时间的推移,你会培养出在哪种情况下使用哪种技术的感觉。AI 会学习你的调试风格,同时你也会了解它的优势和局限。这种不断发展的伙伴关系才是真正的生产力提升所在——不在于任何单一的提示词,而在于一个将 AI 集成到查找和修复 bug 的每个阶段的工作流中。