它明明刚才还写得行云流水,怎么一转眼就开始“编造”不存在的函数了?
你有没有过这样的体验?
凌晨三点,你盯着屏幕,看着AI助手帮你重构一个模块。最初十分钟,它简直像个天才:代码结构清晰,注释完美,你甚至觉得可以提前下班了。
但渐渐地,你开始发现不对劲。它引用了一个你从未见过的类,把两个无关的接口强行拼接在一起,甚至为了修复一个小bug,顺带“重写”了半个项目。
当你质问它时,它却用最流利的语言、最自信的语气,向你解释那个根本不存在的函数。
这场景像极了酒桌上的朋友:越喝越自信,越说越离谱,逻辑开始断片,最后活在自己构建的幻觉里。
这不是AI在故意摆烂,也不是模型变傻了。这是它的“生理结构”决定的必然结果。今天,我们从第一性原理出发,剖析LLM的底层机制,看看它为什么会在编程时“失控”,以及我们该如何驾驭这头能力强大但思维模式独特的“巨兽”。
01 真相:LLM 其实是个“单字接龙”高手
在讨论“失控”之前,我们必须先搞懂LLM的本质。它的工作方式可以用一句话概括:
预测下一个词(Token)。
这真的不是比喻。当你向它提问时,它的大脑里没有完整的蓝图,只有当下的“续写任务”。它做的事情是:
- 看着你输入的话,以及它刚才说过的话。
- 计算概率,找出“最可能出现的下一个字”。
- 把这个字贴上去,然后重复。
这被称为自回归生成。这个机制决定了它有三个致命的“性格缺陷”:
- 没有独立的“思考”空间:它没法像人类一样“三思而后行”。它的推理过程就是输出过程,也就是“边说边想”。这就是为什么“思维链(Chain-of-Thought)”有效——你在逼它把思考过程写出来,相当于给它争取了“思考时间”。
- 上下文即全世界:它没有长期记忆。在当前窗口里能看到的东西,就是它的全部宇宙。窗口之外,就是虚无。你把它关进一个房间,它就只能看到房间里的东西。
- 概率即真理:它每次生成都是概率抽样。同样的输入,因为概率波动,可能产生完全不同的结果。所以,它自己也不确定哪次说得对。
02 为什么一写代码,AI 就“上头”了?
搞懂了LLM的“生理结构”,我们就能理解,为什么它在面对软件开发这种任务时,特别容易“失准”。
软件开发是一个典型的 “长链路、强约束、强验证” 任务。而LLM的天性,恰恰和这三点相克。
问题 1:局部最优,全局崩盘
LLM擅长“续写”,但它没有“全局规划”的能力。
场景:重构一个跨多个文件的模块。
典型行为:它看到第一个文件,改得挺好;看到第二个文件,顺着逻辑继续改;等到第三个文件时,发现和第一个文件冲突了。于是它开始打补丁,修修补补,代码债务瞬间爆炸。
类比:就像装修房子没有图纸。工人先铺好了卧室的木地板,然后去铺客厅,发现客厅地砖和卧室地板接不上,最后只能砸了重来。
问题 2:偏差“滚雪球”
一旦第一步走偏,AI会沿着错误的方向,极其自信地越走越远。
场景:修复一个Bug时,它误判了代码库的底层逻辑。
典型行为:它误以为存在一个 getUserInfoV2 函数,于是后续所有的代码都基于这个“幻觉”构建。在它的世界观里,这个函数是真实存在的,直到编译报错把它打醒。在一个错误的假设下,它能构建出一个逻辑自洽的“平行宇宙”。
问题 3:重写容易,修改太难
LLM的输出是流式的,它没法像人类一样“撤销”或者“精准定位修改”。
场景:在几千行的复杂代码中,改一行核心逻辑。
典型行为:它不喜欢做“外科手术”,它更喜欢做“器官移植”。它倾向于把整个文件重写一遍,只为了改一个变量名。这导致代码审查(Code Review)时,你看到的是几百行的Diff(差异),根本看不出它到底改了哪。
类比:你想修改文章里的一个错别字,但它直接把整篇文章重写了一遍。
问题 4:无法承受“精确”之重
代码是强语法、强语义的,而LLM处理的是概率和文本。
场景:处理并发、边界条件、内存释放。
典型行为:代码看起来“人模人样”,但一运行就崩溃。它分不清 = 和 == 在特定语境下的区别,也搞不懂为什么这里要加 mutex(互斥锁)。对于依赖AST(抽象语法树)的复杂重构(如重命名变量),它纯靠文本模式推断,错一个引用就全盘皆输。
问题 5:单线程思维,无法并行验证
人类排查Bug时可以提出多个假设并行验证,但AI不行。
场景:面对一个复杂的线上故障。
典型行为:它会沿着第一条推理路径深挖到底,哪怕那条路是错的。它不会像人类一样说:“会不会是A问题?或者是B问题?我们来跑个测试排除一下。”它更像一个“单线程”的推理机器。
03 为什么要懂这些“废话”?
你可能会想:“我只是个用户,我干嘛要懂这些原理?直接找个最强的工具不就行了?”
这恰恰是“使用者”和“驾驭者”的分水岭。
- 不懂原理的使用者:遇到AI犯傻,只能干瞪眼。拼命换模型、清空上下文、反复重试,纯靠“抽卡”式碰运气。把AI当黑盒,遇到问题束手无策。
- 懂原理的驾驭者:知道AI的“性格弱点”。看到它开始“幻觉”时,知道该切断对话重启; 遇到大任务时,知道手动拆解成多个小任务喂给它;知道什么时候该给例子,什么时候该强制它“一步步思考”。
核心差异在于:前者被工具推着走,后者在驾驭工具。
04 总结:从“猜谜”到“掌控”
AI编程不是魔法,它是一系列技术原理的集合。当你理解了LLM只是在做“文字接龙”时,你就能预判它的行为模式:
- 预判陷阱:当任务跨越多文件、逻辑链路长时,你知道它容易“失准”,你会提前介入,主动拆解任务。
- 优化工作流:你不会在一个对话里让它干完所有活,因为你知道“上下文就是它的全部记忆”,长对话会让它记忆混乱。
- 驾驭而非服从:你不会再盲目相信它给出的完美代码,而是把它当作一个“打字飞快、思路清奇但偶尔会陷入幻觉的实习生”。你需要设定明确的检查点和验证步骤。
理解底层原理,是高效使用任何工具的前提。在 云栈社区 的讨论中,我们经常看到开发者分享如何根据AI的特性来设计更有效的工作流。这不再是盲目的试错,而是基于理解的主动构建。
在后续的探讨中,我们可以继续深入几个关键方向:
- 上下文窗口:为什么它是最大的约束?如何像管理关键资源一样管理它?
- Agent工作流:如何让AI不仅会“说”,还会根据反馈“做”?
- 短对话策略:为什么“长对话”常常是AI表现失准的开始?
思考题
你在使用AI编程助手时,遇到过哪些让你印象深刻的“迷惑行为”?是它强行编造了不存在的库?还是在修复问题时,意外地引入了更复杂的逻辑?