如何让失控的 AI 重回正轨
你好,我是鱼皮。
在前面的文章里,我们讲了如何和 AI 高效对话,如何管理上下文。但即使你做得再好,也难免会遇到 AI 罢工的情况 —— 它开始胡说八道、陷入死循环、或者固执地坚持错误的方案。
这种情况在 Vibe Coding 中很常见,我们称之为 AI 幻觉(AI Hallucination)。下面我会教你如何识别和修复这些问题,让失控的 AI 重回正轨。
在讲解决方法之前,我们先要理解什么是 AI 幻觉。
AI 幻觉指的是 AI 生成的内容看起来很有道理,但实际上是错误的、不存在的,或者不符合事实的。
比如下面这段对话,我的本名可不是这个……

在编程场景中,AI 幻觉通常表现为:
举个例子,你问 AI:React 中如何获取组件的 DOM 节点?
AI 可能会告诉你用 this.getDOMNode()。
这个方法听起来很合理,但实际上在现代 React 中并不存在,正确的做法是用 useRef。
AI 产生幻觉的原因有几个:
理解了这些原因,我们就能更好地应对幻觉问题。
在 Vibe Coding 中,AI 幻觉主要有这几种类型:
了解这些类型,能帮你快速识别问题。
除了幻觉,AI 还有一个常见问题:陷入死循环。
死循环指的是 AI 反复尝试同一个错误的方案,无法自己跳出来。
典型的表现是:
这就是死循环,AI 被困在了一个错误的思路里,无法自己走出来。不仅浪费时间,还白白浪费了大量 tokens。

死循环经常出现在这些场景:
我个人识别死循环的一些信号:
一旦发现这些信号,就要立刻打断,不要继续下去。
当 AI 陷入死循环或产生严重幻觉时,最有效的方法就是切断上下文,重新开始。
继续在混乱的上下文中对话,就像在泥潭里越陷越深。AI 会被之前的错误信息影响,很难给出正确的答案。
切断上下文相当于给 AI 一个重启的机会,让它从干净的状态开始。
不要直接开一个空白对话就开始问问题。正确的方法是:
1)总结当前的问题
在新对话开始前,先整理一下:
2)开始新对话
在新对话中,先提供完整的上下文:
`markdown
我在开发一个博客系统,技术栈是 Next.js 16 + TypeScript + Supabase。
我想实现文章的自动保存功能,但遇到了问题。
我尝试过用 useEffect 监听内容变化,但会导致频繁保存。我也试过用 debounce,但有时候会丢失数据。
这是我当前的代码:【贴上相关代码】
请帮我分析问题并给出解决方案。
3)明确要求不同的思路
告诉 AI 之前的方案不行,要换个思路:
markdown
之前的方案都有问题,请给我一个完全不同的实现思路。
这样 AI 就不会重复之前的错误。
或者先利用其他的 AI 模型给出不同的方案,再直接把方案贴给 AI 让它执行。
不是所有问题都需要切断上下文。如果只是小问题,在当前对话中纠正就行。但如果遇到这些情况,就要果断切断:
简单来说,当你发现对话已经失控了,就该切断。与其在泥潭里挣扎,不如重新开始。
很多时候,AI 生成的代码有 bug,但它不知道。这时候,你需要把报错信息准确地喂给它。
不要只说 "代码报错了" 或者 "不工作",而是要把完整的错误信息复制给 AI。
❌ 不好的反馈:你的代码有问题,运行不了。
✅ 好的反馈:
markdown
代码运行时报错了,错误信息如下:
TypeError: Cannot read property 'map' of undefined
at NoteList (NoteList.tsx:15)
at renderWithHooks (react-dom.development.js:14985)
这是第 15 行的代码:
{notes.map(note =>
完整的错误信息能让 AI 快速定位问题。
除了错误信息,还要提供相关的代码上下文。
`markdown
这是出错的组件完整代码,错误发生在第 9 行:
export function NoteList() {
const [notes, setNotes] = useState();
useEffect(() => { fetchNotes().then(data => setNotes(data)); }, []);
return (
这样 AI 就能看到完整的上下文,给出准确的修复方案。
说明复现步骤
如果是和用户交互相关的 bug,要说明如何复现。
`markdown
这个错误只在特定情况下出现:
- 用户首次进入页面时正常
- 点击 '刷新' 按钮后正常
- 但如果用户先删除一条笔记,再点击"刷新",就会报错
错误信息是:【贴上错误信息】
`
毕竟 AI 是看不到用户动作的,详细的复现步骤能帮助 AI 理解问题的本质。
使用浏览器控制台
如果是网页的前端出现了问题,那么一定要利用好浏览器控制台。
按 F12 打开开发者工具,切换到 Console 控制台标签,你会看到:
- 错误信息(红色)
- 警告信息(黄色)
- 日志信息(白色)
把这些信息截图或复制给 AI,它能更快地找到问题。

如果你不知道是不是前端出了问题,或者根本不知道什么是前端,那大概率就是前端出了问题。
五、判断问题来源
有时候,问题不在 AI,而在你的需求或逻辑本身。
如果是 AI 的问题,一般有这些特征:
- 代码语法错误或无法运行
- 使用了不存在的 API
- 逻辑明显不符合你的描述
- 代码风格和之前的完全不一致
这些问题可以通过更好的提示或切断上下文来解决。
但如果是逻辑问题,一般有这些特征:
- 代码能运行,但结果不对
- 边界情况没有处理
- 性能有问题
- 用户体验不好
这些问题需要你重新思考需求,而不是盲目责怪 AI。
怎么判断问题来源?
一个简单的方法是问自己:如果我把这个需求给一个真人开发者,他能做对吗?
如果答案是 “不确定” 或者 “可能也会有问题”,那很可能是需求本身不够清晰。
这时候,你需要先:
- 重新梳理需求
- 明确边界条件
- 画出流程图或状态图
- 写出详细的测试用例
然后再和 AI 讨论实现方案。
有同学说:我怎么知道真人开发者能不能做对啊?!
这其实也是缺少专业知识的问题,如果你本身懂技术,会更好地驾驭 AI 和判断问题。即使你不知道这个问题的答案,也可以试着换种方式描述你的需求,或者借助其他 AI 来润色需求、帮你做判断。
六、实战案例:修复失控的项目
让我用一个真实的案例,展示如何修复一个失控的项目。
场景描述
你在做一个待办事项应用,想实现拖拽排序功能。你和 AI 对话了十几轮,但功能还是不对:
- 第一次:AI 用了一个不存在的库
- 第二次:改用了 react-beautiful-dnd,但代码报错
- 第三次:修复了报错,但拖拽后数据没有更新
- 第四次:数据更新了,但界面没有刷新
- 第五次:界面刷新了,但顺序不对
- 你开始怀疑人生……
接下来你会怎么做呢?
1、暂停并分析
不要继续下去了!先暂停,分析一下问题:
- 核心问题是什么?(拖拽排序)
- 为什么一直不对?(可能是 AI 对状态管理理解有误)
- 有没有更简单的方案?(也许不需要用库)
2、切断上下文
开一个新对话,但这次换个方式问:
markdown
我想实现一个简单的拖拽排序功能。不要用第三方库,用原生的 HTML5 Drag and Drop API
需求:
- 用户可以拖动列表项
- 拖动时显示占位符
- 放下时更新顺序
- 数据用 useState 管理
请先给我一个最简单的实现,只要能拖动就行,不需要动画。
3、逐步完善
AI 给了一个简单的版本,你测试后发现能用,爽爽爽。
然后再逐步添加功能:
- 很好,现在加上拖动时的视觉反馈:被拖动的项半透明。
- 再加上占位符:拖动时在目标位置显示一个虚线框。
- 最后加上平滑的动画效果。
每一步都很小,每一步都能测试,这样就不会失控。
4、总结经验
问题解决后,让 AI 帮你总结:
markdown
我们刚才实现了拖拽排序功能。请总结一下:
- 为什么之前的方案不行?
- 这个方案的关键点是什么?
- 如果以后要实现类似功能,应该注意什么?
这些总结可以加入你的项目文档,避免以后重复踩坑。
七、预防幻觉的技巧
除了修复问题,我们还可以提前预防。
1、要求 AI 解释
不要盲目接受 AI 的答案,让它解释为什么这样做。
- 你为什么选择用 useCallback 而不是 useMemo?
- 这个方案的优缺点是什么?
- 有没有其他实现方式?
通过解释,你能发现 AI 是否真的理解了问题。
2、要求提供文档链接
如果 AI 提到了某个 API 或库,让它提供官方文档链接。
markdown
你提到了 react-query 的 useInfiniteQuery,能给我官方文档的链接吗?
如果 AI 给不出链接,或者链接是错的,那这个 API 可能是它编造的。
3、分步验证
不要一次性实现整个功能,而是分步验证。
- 先帮我实现最核心的部分,其他的暂时用假数据
- 这一步能运行了,我们再做下一步
小步快跑,每一步都验证,能及早发现问题。
4、使用类型系统
建议在项目中使用 TypeScript 技术,它是一种给 JavaScript 加上类型检查的编程语言,可以充分利用它的类型系统来预防问题。
什么是类型系统?
简单来说,就是给每个变量、函数都标注清楚它是什么类型的数据。比如这个变量是数字、那个变量是字符串、这个函数返回的是用户对象等等。有了这些标注,编辑器就能在你写代码时就发现问题,而不是等到运行时才报错。
看个例子:
`ts
// ❌ 没有类型定义: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 帮你写测试用例:
markdown
请为这个函数写单元测试,覆盖正常情况和边界情况。
测试能帮你发现逻辑问题。
6、让 AI 自主验证工作
不要光让 AI 干活,还要让它知道怎么验证自己的工作。
比如在开发 Web 应用时,可以让 AI 打开浏览器来测试 UI,发现问题后自动迭代,直到功能正常运行。这样能形成一个自动化的反馈循环:
markdown
请实现这个功能,并且在完成后自动打开浏览器测试。如果发现问题,请自动修复并重新测试,直到功能正常工作。
这种方式能让 AI 更自主地工作,减少人工干预,特别适合处理需要多次迭代的任务,也是 Claude Code 创始人强烈建议的技巧。
八、常见幻觉场景和应对方法
基于我的经验,这里总结了一些常见的幻觉场景和应对方法。
场景一:编造的 API
表现:AI 使用了一个听起来很合理,但实际不存在的 API。
应对:
markdown
这个 API 在官方文档中找不到,你确定它存在吗?请给我文档链接。
如果 AI 承认错误,让它给出正确的 API:
markdown
那正确的做法是什么?请用官方推荐的方式实现。
场景二:过时的写法
表现:AI 使用了已废弃的 API 或旧版本的写法。
应对:
markdown
这个写法是旧版本的。我用的是 React 19,请用最新的写法。
然后明确要求:
markdown
请用 Hooks 而不是 Class 组件。
场景三:混淆技术栈
表现:AI 把不同框架的用法混在一起。
应对:
markdown
等等,你给的是 Vue 的写法,我用的是 React。请用 React 的方式重写。
然后重新强调技术栈:
markdown
我的项目用的是 React 19 + TypeScript,请确保代码符合这个技术栈。
场景四:逻辑漏洞
表现:代码能运行,但有明显的逻辑问题。
应对:
markdown
这个方案有问题:如果用户在加载过程中关闭页面,数据会丢失。请考虑这个边界情况。
然后要求改进:
markdown
请加上错误处理和数据持久化。
场景五:性能问题
表现:代码能用,但性能很差。
应对:
markdown
这个方案在数据量大时会很慢。请优化性能,比如用虚拟滚动或分页。
然后要求分析:
markdown
请分析一下这个方案的时间复杂度,并给出优化建议。
`
AI 幻觉和死循环是 Vibe Coding 中不可避免的问题,但它们并不可怕。只要你掌握了正确的应对方法,就能快速解决。
让我总结一下本文的要点:
记住,AI 是你的助手,不是魔法。它会犯错,但只要你掌握了调试的方法,就能让它成为可靠的伙伴。
下一篇文章,我会讲解 Vibe Coding 的效率提升技巧,教你如何用快捷键、模板、自动化等方式提高开发效率。
加油小伙伴!💪
1)鱼皮 AI 导航网站:AI 资源大全、最新 AI 资讯、免费 AI 教程
2)编程导航学习圈:学习路线、编程教程、实战项目、求职宝典、交流答疑
3)程序员面试八股文:实习/校招/社招高频考点、企业真题解析
4)程序员写简历神器:专业模板、丰富例句、直通面试
5)1 对 1 模拟面试:实习/校招/社招面试拿 Offer 必备