- 文档
- 教程
- Vibe Coding
- 示例工程
【免费下载链接】vibe-vibe
The First Systematic Vibe Coding Open-Source Tutorial | From Zero to Full-Stack, Empowering Everyone to Build Products with AI | Live at: www.vibevibe.cn ;首个系统化 Vibe Coding 开源教程 | 零基础到全栈实战,让人人都能用 AI 开发产品 | 在线地址:www.vibevibe.cn
本篇文章是 vibe-vibe 开源教程「进阶篇 · 第2章 AI 调教」中2.5 高效调试心法的完整展开。它回答一个每个 Vibe Coder 都会遇到的痛点:项目报错了,该怎么把问题描述给 AI,才能让它一次定位、快速修复?读完本文,你将掌握一套可复用的 AI 调试沟通公式(完整日志 + 操作步骤 + 预期结果)、循环修复模式、以及「让 AI 自己 Build」的终极大招,并学会用「常见错误模式速查表」快速判断错误类型、配合 vibe-vibe 仓库中的真实源码(如 demo-01-todo)理解错误在链路中的真实位置。
一、先建立三个前置概念
在进入调试方法之前,先统一三个术语,它们是看懂错误日志的基础:
- 调试(Debug):发现并修复代码错误的过程。在 Vibe Coding 语境下,"调试"不再是纯人工排查,而是「把错误信息组织好、交给 AI 分析、按反馈迭代」的人机协作过程。
- 错误日志(Error Log):程序崩溃或异常时输出的详细信息,包含错误类型、位置、堆栈等。日志的完整度直接决定 AI 能否一次定位问题。
- 堆栈(Stack Trace):错误发生时的函数调用链,显示错误是从哪一行代码、哪个函数、经过哪几层调用产生的。它能帮你(以及 AI)追溯错误的源头——哪怕堆栈有几十行,也不要裁掉它。
这三个概念背后有一个朴素的类比:调试是医生诊断的过程。医生需要看到完整的症状才能准确诊断;只报一句「我生病了」的模糊描述,医生只能靠猜,往往要反复试错很多次。
二、调试沟通公式:完整日志 + 操作步骤 + 预期结果
为什么「报错了,帮我看看」是低效的
场景:你运行项目时报错,不知道该怎么办。
❌ 低效做法——只复制最后一行错误信息发给 AI:
"报错了,帮我看看"结果就是:AI 反问你"什么报错?怎么操作的?"——来回 3 轮才进入正题。每一轮往返都是在消耗你的注意力,也消耗 Token(详见 2.1 AI 编程的经济学:上下文越大、往返越多,成本越高)。
✅ 高效做法——一次性给全信息:
我运行 pnpm dev 启动项目,终端报错: [完整错误日志] 我预期的结果是:开发服务器正常启动,能在 localhost:3000 访问 帮我分析并修复这个问题注意这段提示词的三个要素,它们恰好对应调试公式的三项:
| 你给的信息 | AI 能做的 | 节省的轮数 |
|---|---|---|
| 只说「报错了」 | 追问细节 | +2 轮 |
| 给最后一行 | 猜测上下文 | +1 轮 |
| 给完整日志 | 直接定位问题 | 0 轮 |
把三项合起来,就是本节的调试公式:
完整错误日志 + 操作步骤(你做了什么) + 预期结果(你想要什么) = 快速解决方案- 完整错误日志:不要删减,堆栈信息非常重要;
- 操作步骤:说明你做了什么才触发错误(比如"我运行了
pnpm dev"); - 预期结果:告诉 AI 你想要的最终状态(比如"开发服务器能在 localhost:3000 正常访问")。
从公式到模板:两条可直接复制的话术
首次提问模板:
我运行 [启动/构建命令] 时,终端报错: [完整错误日志] 我预期的结果是:[预期行为] 请帮我分析并修复这个问题补充信息模板(当需要提供更多上下文时):
数据库连接错误: 错误: connect ECONNREFUSED 127.0.0.1:5432 环境: - 开发环境 - PostgreSQL 应该在本地运行 - .env 中 DATABASE_URL="postgresql://localhost:5432/mydb" 可能的原因: 1. PostgreSQL 没有启动? 2. 端口不对? 3. .env 配置错误?值得注意的是,vibe-vibe 教程的基础篇也给出了几乎相同的「通用提问骨架」(见 附录 B:常见错误与"问 AI"流程):
我现在遇到的问题是:______ 现象:______ 我刚刚做了什么:______ 我原本期望发生什么:______ 如果有报错,这是完整报错: ______ 请先帮我判断最可能的原因,再告诉我下一步只先检查什么。这说明「现象 + 操作 + 预期 + 完整报错」这一套沟通骨架,是整个 vibe-vibe 教程从基础到进阶反复强调的通用排错原则,值得内化成肌肉记忆。
三、循环修复模式:2-3 轮解决是常态
第一轮没解决?这很正常,不要放弃。把 AI 给的方案执行后的新情况、新日志继续反馈回去:
按你的方法改了,现在出现新的错误: [新错误日志] 请继续分析这套循环的流程可以画成一张图:
通常 2-3 轮解决。为什么迭代如此重要?
- 错误往往有连锁反应:修好 A 错误,可能暴露出 B 错误;
- AI 每次修复基于的是它上一次看到的状态,你如果不反馈「修复后的新日志」,它就无法继续;
- 每一步「按你的方法改了,现在……」,都是给 AI 提供新的诊断输入,让它从「猜」变成「对症下药」。
这与 vibe-vibe 进阶篇 2.2 中「Trust but Verify(信任但验证)」的工作流理念一脉相承(见 2.2 VibeCoding 工作流详解):AI 生成 → 验证是否工作 → 不工作就把问题反馈回去 → 继续生成。调试只是这条闭环在「出错场景」下的具体应用。
四、终极大招:让 AI 自己 Build
场景与操作
报错一堆(比如构建失败、错误信息 50 行),你不想逐个排查、也不知道从哪开始?直接把构建任务甩给 AI:
"请帮我运行 pnpm install && pnpm build,如果遇到错误请自行修复,直到构建成功"然后,去喝杯咖啡。
为什么有效
- AI 直接看到真实错误:它自己运行命令、自己读完整输出,不依赖你的转述(转述本身就会丢失信息);
- 小问题 AI 能独立解决:版本冲突、缺失依赖这类问题,AI 完全可以自己处理;
- 你只需要看结果:把「过程」交给 AI,把「验收」留给自己。
适用场景
| 场景 | 为什么适合 |
|---|---|
| 接手新项目 | 不知道项目结构,让 AI 自己探索 |
| 报错太多 | 逐个排查太慢,让 AI 并行处理 |
| CI/CD 挂了 | 本地复现不了,让 AI 在本地跑 |
注意事项
- ✅先
git commit保存现场:AI 改坏了能随时回滚。这是 vibe-vibe 教程反复强调的安全底线——进阶篇序言中明确要求"每次完成独立功能或修好一个 Bug 并验证后,自动运行 git commit 提交代码"(见 第2章序言); - ✅第一次可能慢,耐心等待:AI 要自己探索、试错、验证,比直接回答慢是正常的;
- ⚠️AI 陷入死循环(来回改同一处)→ 及时打断:如果看到它在同一个位置反复改来改去,立刻用 Ctrl+C 之类的标准中断方式打断它,重新描述问题、收敛范围。
终极大招公式:
git commit 保存现场 + 让 AI 自己运行 build + 遇到错误让它自己修 = 省心省力五、三个实战案例拆解
案例 1:类型错误
错误日志:
Type error: 'user' is possibly 'undefined'. at App (app/page.tsx:15:10)❌ 错误描述:"类型错误了,帮我看看"—— AI 拿不到任何定位信息,只能从头问起。
✅ 正确描述:把文件、行号、报错原文、出错代码一并给出:
TypeScript 报错: 文件: app/page.tsx 行号: 15 错误: 'user' is possibly 'undefined' 代码: const user = await getUser(); return <div>{user.name}</div>; // line 15 如何处理可能为 undefined 的情况?AI 分析方向:user可能为 undefined,需要 ① 添加类型检查、② 提供默认值、③ 或使用可选链。
这类「possibly undefined」错误在 React + TypeScript 项目中极其常见。在 vibe-vibe 仓库的演示项目里,也能看到 TypeScript 严格模式下的同类约束:例如 demo-01-todo 的 API 路由 中,查询条件conditions数组在拼接前要先判空,db.select().from(todos)在有条件时走where(and(...conditions))、无条件时直接排序查询——这种分支写法正是为了让类型安全与运行行为一致。如果你在类似代码上报错,把出错的那几行代码原文(而不是只贴报错)一起发给 AI,定位会快得多。
案例 2:运行时错误
错误日志:
Error: connect ECONNREFUSED 127.0.0.1:5432 at Connection.<anonymous> (node_modules/pg/lib/client.js:89:17) at Socket.emit (events.js:315:13)❌ 错误描述:"数据库连接失败"—— 方向正确但信息为零,AI 只能给出泛泛的检查清单。
✅ 正确描述:给出错误、运行环境、配置、以及你怀疑的可能原因(上面第二节的「补充信息模板」就是这个案例)。
AI 分析方向:ECONNREFUSED表示目标端口没有服务在监听,即服务未运行。检查 ① PostgreSQL 是否启动、② 端口是否正确(默认 5432)、③ 运行命令检查——Mac/Linux 用brew services list,Windows 用sc query postgresql-x64-[version]。
这类「连不上外部服务」的错误,在 vibe-vibe 的数据库示例里同样会以显式报错的方式暴露出来:看 demo-01-todo 的数据库入口,它启动时就检查DATABASE_URL环境变量,未设置直接throw new Error('DATABASE_URL 环境变量未设置')——这正是"程序主动给出可读错误"的典型写法。反过来,如果你自己在.env里配了 Neon 的连接串(demo 使用的是@neondatabase/serverless,见 package.json),却仍然报连接错误,那排查方向就应该是:环境变量有没有被正确加载、连接串格式、网络是否可达——把这些背景写进提问,AI 就能直接给出针对性答案。
案例 3:构建错误
错误日志:
✘ [ERROR] Could not resolve "./components/Button" app/page.tsx:3:24: 3 │ import { Button } from "./components/Button"; ╩ ~~~~~~~~~~~~~~~~~~~~ This file does not exist.❌ 错误描述:"构建失败了"—— AI 只能反问"具体什么错"。
✅ 正确描述:给出报错、文件位置、导入语句,以及你对项目的了解(如"项目用 shadcn/ui,Button 应该在 components/ui/button.tsx"):
构建错误: Could not resolve "./components/Button" 文件位置: app/page.tsx:3:24 import { Button } from "./components/Button"; 实际情况: - 项目使用 shadcn/ui - Button 组件应该在 components/ui/button.tsx 如何修复导入路径?AI 分析方向:导入路径解析失败,说明./components/Button这个相对路径下没有可解析的模块——需要核对组件真实位置、修正导入路径或检查组件是否已创建。
这个案例在 vibe-vibe 的 demo 结构里有非常直观的对应:demo 项目都把 shadcn/ui 组件放在src/components/ui/目录(见 demo-01-todo 组件目录),页面通过@/components/ui/button之类的别名导入。如果你手写成了./components/Button而实际路径是@/components/ui/button,就会触发一模一样的 "Could not resolve" 构建错误。把项目的目录结构与导入别名约定告诉 AI,能让这类路径错误的修复从"猜"变成"确认"。
六、常见错误模式速查表
把上面三类错误放进更大的图景:绝大多数 AI 编码中遇到的错误,都可以归入下面 7 类。遇到报错时,先对照表格判断错误类型,再按「调试公式」组织提问:
| 错误类型 | 典型信息 | 解决方向 |
|---|---|---|
| 类型错误 | Type 'X' is not assignable to type 'Y' | 检查类型定义,使用类型断言或修改类型 |
| 空值错误 | Cannot read property 'X' of undefined | 添加空值检查、可选链、默认值 |
| 导入错误 | Module not found: Can't resolve 'X' | 安装依赖、修正路径、检查导出 |
| 网络错误 | ECONNREFUSED / ENOTFOUND | 检查服务状态、URL、网络连接 |
| 端口占用 | Address already in use :3000 | 关闭占用端口的进程或换端口 |
| 权限错误 | EACCES / Permission denied | 检查文件权限,使用 sudo 或更改权限 |
| 语法错误 | Unexpected token / SyntaxError | 检查语法拼写,注意括号引号匹配 |
七、从源码看:好项目如何"自带调试线索"
「调试心法」讲的是人与 AI 的沟通技巧,但好的工程实践能让错误更容易被定位。从 vibe-vibe 仓库的源码中可以提炼出四类"自带调试线索"的模式,它们也是你在让 AI 修复问题时可以主动提供的额外上下文:
1. 在入口处主动校验环境变量
demo-01-todo 的数据库入口 在初始化时就检查DATABASE_URL,缺失直接抛出可读错误。这比"启动后莫名其妙的 500"要容易定位得多。
2. 用 schema 校验把"脏数据"挡在业务逻辑之外
demo-01-todo 的校验层 用 zod 定义createTodoSchema:title非空且不超过 200 字、category限定枚举、dueDate为可选字符串。对应地,API 路由 用createTodoSchema.safeParse(body)做输入校验,校验失败返回 400 和第一个错误信息;数据库操作失败则捕获异常返回 500。这种"输入校验错误 400 / 服务端异常 500"的清晰分层,让错误日志一眼就能判断问题出在调用方还是服务端。
3. 错误边界 + 日志输出
demo-01-todo 的全局错误边界 是 Next.js 的error.tsx:它在useEffect里console.error('Page error:', error)把页面错误打到控制台,同时向用户展示可读的错误信息与"重试"按钮。这意味着——当你在浏览器里看到"出了点问题"时,完整堆栈其实在终端/浏览器控制台里,把它复制进提问即可。
4. 用自动化测试固化"预期结果"
调试公式里的"预期结果"最好能落到测试里。demo-01-todo 的 API 测试 用 Vitest 覆盖了 GET 列表、分类过滤、POST 创建成功、空标题返回 400、缺字段返回 400 等场景(运行命令见 package.json 中的pnpm test)。当 AI 修复完一个 Bug,你可以让它"运行pnpm test确认通过"——测试就是可重复验证的"预期结果",比口头描述可靠得多。
这些源码证据想说明的是:错误日志 + 操作步骤 + 预期结果这套公式不仅适用于"报错了问 AI",也应当贯穿到你的工程习惯里——好的错误信息、输入校验、错误边界和测试,本身就是给未来的 AI(和你自己)留下的调试线索。
八、核心理念:像医生一样诊断,像闭环一样迭代
把全文浓缩成一张图:
记住五条心法:
- 完整日志:不要删减,堆栈信息很重要;
- 操作步骤:说明你做了什么才触发错误;
- 预期结果:告诉 AI 你想要什么;
- 循环修复:不要放弃,通常 2-3 轮解决;
- 反馈结果:每次修复后告诉 AI 新情况。
配套两条公式:
调试公式: 完整错误日志 + 操作步骤(你做了什么)+ 预期结果(你想要什么)= 快速解决方案 终极大招公式: git commit 保存现场 + 让 AI 自己运行 build + 遇到错误让它自己修 = 省心省力最后补充一条基础篇也在强调的排错原则(见 附录 B):一次只改一个变量。不要一看到问题就同时改模型、改提示词、改布局、改接口、改环境变量——先判断更像哪一层的问题,从那一层开始查,你才知道到底是哪一步真的起了作用。这也是让 AI 的循环修复不陷入混乱的前提。
相关内容
- 前置:2.2 VibeCoding 工作流详解(Explore → Plan → Execute → Verify → Submit 五步流程与权限模式)
- 前置:2.1 AI 编程的经济学(为什么"精准上下文"能省钱)
- 基础篇:常见错误与"问 AI"流程(通用提问骨架 + 五类高频问题排查方向)
- 源码参考:demo-01-todo API 测试、demo-01-todo 校验层、demo-01-todo 错误边界
- 文档
- 教程
- Vibe Coding
- 示例工程
【免费下载链接】vibe-vibe
The First Systematic Vibe Coding Open-Source Tutorial | From Zero to Full-Stack, Empowering Everyone to Build Products with AI | Live at: www.vibevibe.cn ;首个系统化 Vibe Coding 开源教程 | 零基础到全栈实战,让人人都能用 AI 开发产品 | 在线地址:www.vibevibe.cn
相关推荐
Vibe Coding 高效调试心法:用「完整日志 + 循环修复」把 Bug 交给 AI,一次说清问题
Vibe Coding 高效调试心法:用「完整日志 + 循环修复」把 Bug 交给 AI,一次说清问题 本篇技术指南来自 vibe vibe 开源教程的「AI
文档教程Vibe Coding示例工程终极忙碌模拟器:用genact让终端假装工作的艺术
终极忙碌模拟器:用genact让终端假装工作的艺术 在技术世界中,有时候"看起来忙碌"和"真正忙碌"同样重要。想象一下这样的场景:你需要向同事展示复杂的系统调试
CLIViolentmonkey终极指南:用浏览器脚本定制你的网络世界
Violentmonkey终极指南:用浏览器脚本定制你的网络世界 你是否曾想过,为什么每次浏览网页都要忍受那些烦人的广告弹窗?为什么视频网站总是限制你的播放体验
前端插件系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考