前面的章节讲了如何和 AI 高效对话,如何管理上下文。但即使你做得再好,也难免会遇到 AI 罢工的情况 —— 它开始胡说八道、陷入死循环、或者固执地坚持错误的方案。
这种情况在 Vibe Coding 里很常见,我们叫它 AI 幻觉(AI Hallucination)。下面我来教你如何识别和修复这些问题,让失控的 AI 重回正轨。
一、什么是 AI 幻觉?
在讲解决方法之前,我们先要理解什么是 AI 幻觉。
AI 幻觉的定义
AI 幻觉指的是 AI 生成的内容看起来很有道理,但实际上是错的、不存在的,或者不符合事实的。
在编程场景里,AI 幻觉通常表现为:
- 编造不存在的 API 或函数
- 给出看似合理但实际跑不起来的代码
- 坚持使用已经被证明错误的方案
- 混淆不同技术栈的用法
举个例子,你问 AI:React 中如何获取组件的 DOM 节点?
AI 可能会告诉你用 this.getDOMNode()。
这个方法听起来很合理,但实际上在现代 React 中并不存在,正确的做法是用 useRef。
为什么会产生幻觉?
AI 产生幻觉的原因有几个:
- 训练数据的局限:AI 的知识来自训练数据,如果数据中有错误或过时信息,AI 就会学到错误的知识。
- 上下文混淆:当对话太长或信息太杂时,AI 可能会混淆不同的上下文。
- 过度自信:AI 被训练成要给出"确定"的答案,即使它不确定,也会表现得很自信。
- 模式匹配错误:AI 可能会把相似但不同的概念混在一起。
理解了这些原因,我们就能更好地应对幻觉问题。
扩展知识 - AI 幻觉的常见类型
在 Vibe Coding 里,AI 幻觉主要有这几种类型:
- API 幻觉:编造不存在的函数、方法或属性
- 语法幻觉:混淆不同语言或框架的语法
- 逻辑幻觉:代码逻辑看起来对,但实际上有问题
- 版本幻觉:使用已废弃的 API 或过时的写法
- 依赖幻觉:引用不存在的库或错误的包名
了解这些类型,能帮你快速识别问题。
二、AI 陷入死循环的表现
除了幻觉,AI 还有一个常见问题:陷入死循环。
什么是死循环?
死循环指的是 AI 反复尝试同一个错误的方案,无法自己跳出来。
典型的表现是:
- 第一次:AI 给你一段代码,但有 bug。
- 第二次:你告诉它有问题,它改了一下,但还是同样的问题。
- 第三次:你再次指出问题,它又改了一下,但还是在同一个地方打转。
- 第四次:你开始怀疑人生……
这就是死循环,AI 被困在了一个错误的思路里,无法自己走出来。不仅浪费时间,还白白浪费了大量 tokens。
死循环的常见场景
死循环经常出现在这些场景:
- 复杂的状态管理:AI 在处理复杂的状态更新时容易混乱
- 异步操作:涉及 Promise、async/await 时容易出错
- 类型系统:TypeScript 的复杂类型定义容易让 AI 困惑
- 性能优化:AI 可能会陷入"优化 => 出错 => 回退 => 再优化"的循环
- 跨文件修改:修改多个文件时容易顾此失彼,尤其是项目文件较多的时候
怎么识别死循环?
我个人识别死循环的一些信号:
- AI 连续 3 次给出的方案本质上是一样的
- 每次修改只是换了个写法,但核心问题没解决
- AI 开始道歉,并说"让我重新尝试"
- 你发现自己在重复说同样的问题
一旦发现这些信号,就要立刻打断,不要继续下去。
三、如何切断上下文并重新开始
当 AI 陷入死循环或产生严重幻觉时,最有效的方法就是切断上下文,重新开始。
为什么要切断上下文?
继续在混乱的上下文中对话,就像在泥潭里越陷越深。AI 会被之前的错误信息影响,很难给出正确的答案。
切断上下文相当于给 AI 一个重启的机会,让它从干净的状态开始。
切断的正确方法
不要直接开一个空白对话就开始问问题。正确的方法是:
1)总结当前的问题
在新对话开始前,先整理一下:
- 你想实现什么功能
- 已经尝试了哪些方案
- 遇到了什么具体问题
- 当前的代码状态
2)开始新对话
在新对话里,先提供完整的上下文:
我在开发一个博客系统,技术栈是 Next.js 16 + TypeScript + Supabase。
我想实现文章的自动保存功能,但遇到了问题。
我尝试过用 useEffect 监听内容变化,但会导致频繁保存。我也试过用 debounce,但有时候会丢失数据。
这是我当前的代码:【贴上相关代码】
请帮我分析问题并给出解决方案。
3)明确要求不同的思路
告诉 AI 之前的方案不行,要换个思路:
之前的方案都有问题,请给我一个完全不同的实现思路。
这样 AI 就不会重复之前的错误。
或者先利用其他的 AI 模型给出不同的方案,再直接把方案贴给 AI 让它执行。
什么时候应该切断?
不是所有问题都需要切断上下文。如果只是小问题,在当前对话中纠正就行。但如果遇到这些情况,就要果断切断:
- 对话轮数太多了(超过 20 轮),上下文已经很长,继续下去只会更费钱更混乱
- AI 开始混淆概念了,比如把你的技术栈搞错,或者把不同功能的代码混在一起
- 你自己都觉得乱了,说不清楚当前的状态,这时候继续下去只会越来越乱
- 还有前面提到的"死循环"情况
简单来说,当你发现对话已经失控了,就该切断。与其在泥潭里挣扎,不如重新开始。
四、如何给 AI 喂入报错信息
很多时候,AI 生成的代码有 bug,但它不知道。这时候,你需要把报错信息准确地喂给它。
完整复制错误信息
不要只说"代码报错了"或者"不工作",而是要把完整的错误信息复制给 AI。
你的代码有问题,运行不了。
代码运行时报错了,错误信息如下:
TypeError: Cannot read property 'map' of undefined
at NoteList (NoteList.tsx:15)
at renderWithHooks (react-dom.development.js:14985)
这是第 15 行的代码:
{notes.map(note => <NoteItem key={note.id} note={note} />)}
完整的错误信息能让 AI 快速定位问题。
提供上下文代码
除了错误信息,还要提供相关的代码上下文。
这是出错的组件完整代码,错误发生在第 9 行:
```tsx
export function NoteList() {
const [notes, setNotes] = useState();
useEffect(() => {
fetchNotes().then(data => setNotes(data));
}, []);
return (
<div>
{notes.map(note => <NoteItem key={note.id} note={note} />)}
</div>
);
}
这样 AI 就能看到完整的上下文,给出准确的修复方案。
---
### 说明复现步骤
如果是和用户交互相关的 bug,要说明如何复现。
```markdown
这个错误只在特定情况下出现:
1. 用户首次进入页面时正常
2. 点击'刷新'按钮后正常
3. 但如果用户先删除一条笔记,再点击"刷新",就会报错
错误信息是:【贴上错误信息】
毕竟 AI 是看不到用户动作的,详细的复现步骤能帮助 AI 理解问题的本质。
使用浏览器控制台
如果是网页的前端出现了问题,那么一定要利用好浏览器控制台。
按 F12 打开开发者工具,切换到 Console 控制台标签,你会看到:
- 错误信息(红色)
- 警告信息(黄色)
- 日志信息(白色)
把这些信息截图或复制给 AI,它能更快地找到问题。
如果你不知道是不是前端出了问题,或者根本不知道什么是前端,那大概率就是前端出了问题。
五、判断问题来源
有时候,问题不在 AI,而在你的需求或逻辑本身。
如果是 AI 的问题,一般有这些特征:
- 代码语法错误或无法运行
- 使用了不存在的 API
- 逻辑明显不符合你的描述
- 代码风格和之前的完全不一致
这些问题可以通过更好的提示或切断上下文来解决。
但如果是逻辑问题,一般有这些特征:
- 代码能运行,但结果不对
- 边界情况没有处理
- 性能有问题
- 用户体验不好
这些问题需要你重新思考需求,而不是盲目责怪 AI。
怎么判断问题来源?
一个简单的方法是问自己:如果我把这个需求给一个真人开发者,他能做对吗?
如果答案是"不确定"或者"可能也会有问题",那很可能是需求本身不够清晰。
这时候,你需要先:
- 重新梳理需求
- 明确边界条件
- 画出流程图或状态图
- 写出详细的测试用例
然后再和 AI 讨论实现方案。
有同学说:我怎么知道真人开发者能不能做对啊?!
这其实也是缺少专业知识的问题,如果你本身懂技术,会更好地驾驭 AI 和判断问题。即使你不知道这个问题的答案,也可以试着换种方式描述你的需求,或者借助其他 AI 来润色需求、帮你做判断。
六、实战案例:修复失控的项目
让我用一个真实的案例,展示如何修复一个失控的项目。
场景描述
你在做一个待办事项应用,想实现拖拽排序功能。你和 AI 对话了十几轮,但功能还是不对:
- 第一次:AI 用了一个不存在的库
- 第二次:改用了 react-beautiful-dnd,但代码报错
- 第三次:修复了报错,但拖拽后数据没有更新
- 第四次:数据更新了,但界面没有刷新
- 第五次:界面刷新了,但顺序不对
- 你开始怀疑人生……
接下来你会怎么做呢?
1、暂停并分析
不要继续下去了!先暂停,分析一下问题:
- 核心问题是什么?(拖拽排序)
- 为什么一直不对?(可能是 AI 对状态管理理解有误)
- 有没有更简单的方案?(也许不需要用库)
2、切断上下文
开一个新对话,但这次换个方式问:
我想实现一个简单的拖拽排序功能。不要用第三方库,用原生的 HTML5 Drag and Drop API
需求:
1. 用户可以拖动列表项
2. 拖动时显示占位符
3. 放下时更新顺序
4. 数据用 useState 管理
请先给我一个最简单的实现,只要能拖动就行,不需要动画。
3、逐步完善
AI 给了一个简单的版本,你测试后发现能用,爽爽爽。
然后再逐步添加功能:
- 很好,现在加上拖动时的视觉反馈:被拖动的项半透明。
- 再加上占位符:拖动时在目标位置显示一个虚线框。
- 最后加上平滑的动画效果。
每一步都很小,每一步都能测试,这样就不会失控。
4、总结经验
问题解决后,让 AI 帮你总结:
我们刚才实现了拖拽排序功能。请总结一下:
1. 为什么之前的方案不行?
2. 这个方案的关键点是什么?
3. 如果以后要实现类似功能,应该注意什么?
这些总结可以加入你的项目文档,避免以后重复踩坑。
七、预防幻觉的技巧
除了修复问题,我们还可以提前预防。
1、要求 AI 解释
不要盲目接受 AI 的答案,让它解释为什么这样做。
- 你为什么选择用 useCallback 而不是 useMemo?
- 这个方案的优缺点是什么?
- 有没有其他实现方式?
通过解释,你能发现 AI 是否真的理解了问题。
2、要求提供文档链接
如果 AI 提到了某个 API 或库,让它提供官方文档链接。
你提到了 react-query 的 useInfiniteQuery,能给我官方文档的链接吗?
如果 AI 给不出链接,或者链接是错的,那这个 API 可能是它编造的。
3、分步验证
不要一次性实现整个功能,而是分步验证。
- 先帮我实现最核心的部分,其他的暂时用假数据
- 这一步能运行了,我们再做下一步
小步快跑,每一步都验证,能及早发现问题。
4、使用类型系统
建议在项目中使用 TypeScript 技术,它是一种给 JavaScript 加上类型检查的编程语言,可以充分利用它的类型系统来预防问题。
什么是类型系统?
简单来说,就是给每个变量、函数都标注清楚它是什么类型的数据。比如这个变量是数字、那个变量是字符串、这个函数返回的是用户对象等等。有了这些标注,编辑器就能在你写代码时就发现问题,而不是等到运行时才报错。
看个例子:
// ❌ 没有类型定义:AI 可能生成错误的代码
function calculateTotal(items) {
return items.reduce((sum, item) => sum + item.price, 0);
}
// 如果传入的数据格式不对,只有运行时才会报错
calculateTotal([{ name: '商品' }]); // 运行时报错:price is undefined
// ✅ 有类型定义:编辑器立刻提示错误
interface Item {
name: string;
price: number;
}
function calculateTotal(items: Item[]): number {
return items.reduce((sum, item) => sum + item.price, 0);
}
// 编辑器会立刻用红色波浪线提示:缺少 price 属性
calculateTotal([{ name: '商品' }]); // 编写时就发现错误
如果生成的项目比较复杂,AI 应该会默认使用 TypeScript 技术。你也可以主动要求 AI:请给所有函数和组件加上完整的 TypeScript 类型定义。
这样,如果 AI 生成的代码有类型不匹配的问题,编辑器会立刻用红色波浪线提示你,你就能马上发现并修复。这比等到运行时才发现问题要高效得多。
5、写测试
让 AI 帮你写测试用例:
请为这个函数写单元测试,覆盖正常情况和边界情况。
测试能帮你发现逻辑问题。
6、让 AI 自主验证工作
不要光让 AI 干活,还要让它知道怎么验证自己的工作。
比如在开发 Web 应用时,可以让 AI 打开浏览器来测试 UI,发现问题后自动迭代,直到功能正常运行。这样能形成一个自动化的反馈循环:
请实现这个功能,并且在完成后自动打开浏览器测试。如果发现问题,请自动修复并重新测试,直到功能正常工作。
这种方式能让 AI 更自主地工作,减少人工干预,特别适合处理需要多次迭代的任务,也是 Claude Code 创始人强烈建议的技巧。
八、常见幻觉场景和应对方法
基于我的经验,这里总结了一些常见的幻觉场景和应对方法。
场景一:编造的 API
表现:AI 使用了一个听起来很合理,但实际不存在的 API。
应对:
这个 API 在官方文档中找不到,你确定它存在吗?请给我文档链接。
如果 AI 承认错误,让它给出正确的 API:
那正确的做法是什么?请用官方推荐的方式实现。
场景二:过时的写法
表现:AI 使用了已废弃的 API 或旧版本的写法。
应对:
这个写法是旧版本的。我用的是 React 19,请用最新的写法。
然后明确要求:
请用 Hooks 而不是 Class 组件。
场景三:混淆技术栈
表现:AI 把不同框架的用法混在一起。
应对:
等等,你给的是 Vue 的写法,我用的是 React。请用 React 的方式重写。
然后重新强调技术栈:
我的项目用的是 React 19 + TypeScript,请确保代码符合这个技术栈。
场景四:逻辑漏洞
表现:代码能运行,但有明显的逻辑问题。
应对:
这个方案有问题:如果用户在加载过程中关闭页面,数据会丢失。请考虑这个边界情况。
然后要求改进:
请加上错误处理和数据持久化。
场景五:性能问题
表现:代码能用,但性能很差。
应对:
这个方案在数据量大时会很慢。请优化性能,比如用虚拟滚动或分页。
然后要求分析:
请分析一下这个方案的时间复杂度,并给出优化建议。
写在最后
AI 幻觉和死循环是 Vibe Coding 中不可避免的问题,但它们并不可怕。只要你掌握了正确的应对方法,就能快速解决。
让我总结一下本文的要点:
- 理解幻觉的本质:AI 不是故意犯错,而是受限于训练数据和上下文。
- 识别死循环信号:连续三次相同的错误方案,就要警惕了。
- 勇于切断上下文:不要在泥潭里越陷越深,及时重新开始。
- 提供完整信息:错误信息、代码上下文、复现步骤都要给 AI。
- 区分问题来源:判断是 AI 的问题还是逻辑的问题。
- 预防胜于治疗:通过解释、验证、测试来提前发现问题。
记住,AI 是你的助手,不是魔法。它会犯错,但只要你掌握了调试的方法,就能让它成为可靠的伙伴。