写下这个标题的时候,我犹豫了一下。"骗"是个很重的字。
但我实在找不到一个比它更准确的词,来形容过去两年------从ChatGPT还在网页对话框里被我们粘来粘去,到 Cursor、到Claude Code、再到现在动不动就自己开十几轮 Agent 循环------AI 身上反复发生在我面前的这些事:它信誓旦旦地告诉我某个函数存在,结果运行时报 AttributeError;它一本正经地解释一段代码的逻辑,结果连分支条件都念反了;它在 PR 里写得头头是道,让你几乎相信这就是真理,但跑一下单测,全红。
如果一个真人这么干,我们会用一个非常简洁的词来形容他:骗子。
可问题在于,AI 不是真人。它没有动机骗你,没有从骗你这件事里获得任何好处,甚至------它自己根本不知道自己在骗你。
这是我和 AI 共事过程中,最不舒服、却又最着迷的一件事。从 GPT-3.5 到 GPT-5,从 Claude 2 到 Claude 4,模型在变强,幻觉在变少,但这件事的内核从来没变过。换了数代模型、试遍了能用的 IDE 之后,我才慢慢从"工具好不好用"的层面,退回到原理的层面,看清这件事的全貌。
一、我反复看到的三种"模式"
我先讲三件事。它们不是孤立的故事,是我在不同模型、不同 IDE、不同语言、不同项目里反复见到的三类模式。每一个模式发生第一次的时候你会惊讶,发生第十次之后你就会知道------这不是 bug,这是它的工作方式。
模式一:那个不存在的 API
让 AI 用一个比较冷门的库写一段网络代码。它干净利落地甩出十几行,调用了一个叫 connection.set_keepalive_probes(...) 的方法。看一眼,挺合理,按 Tab 接受。
跑起来报错:AttributeError。
去翻官方文档,没有这个方法。再翻 GitHub Issues,确认从来没有过。把这一段贴回去问 AI:"你确定这个 API 存在吗?" 它立刻"道歉",说"非常抱歉,您是对的",然后又给了你一个新的、同样不存在的 API。
这件事从 GPT-3.5 时代我就遇到过,到今天的 Claude 4,只是发生频率变低了,从来没有消失 。我对它的态度,也从最初的"这模型真烂",变成了后来的------它根本就不在乎这件事的真假,它只是在生成"看起来像答案"的字符串。
模式二:那个反着写的 if
让它审查一段权限校验代码。它给一段非常漂亮的分析,结论是:"这段代码会在用户未登录时通过校验,存在严重安全风险"。
紧张一下,回去看代码------条件判断的方向是对的。再把代码贴给它问:"你能再读一遍这个 if 吗?" 它再读一遍,说:"对的,这个 if 在用户未登录时为 true。"
类似的事,从 Copilot时代到 Cursor 时代,我在 Code Review 场景里见过很多次。它甚至连最基本的布尔运算 都可以读反,并且读反之后毫无察觉。但它的语言依然流畅、自信、有理有据。有经验的同事会愣一下、会犹豫、会说"等下我再看一眼",AI 不会。它的语言里没有"犹豫"这个状态。
模式三:那个被它"修好"的 Bug
让它修一个并发问题。它思考一会儿,给一段代码,用一句很笃定的话总结:"这样修改后,竞态条件已被消除。"
代码合进去,测试通过。两周后,线上出一个看起来完全无关的故障,排查三天,最后定位回去------根因正是它当初"修好"的那段代码。它当时只是把竞态发生的窗口缩小了 99%,从必现变成了偶发。
这是我栽过最深的一个坑:AI 修 bug 的时候,"修复"和"掩盖",对它而言是同一件事。它不知道二者的区别。它没有解决问题,它只是把问题藏到了我看不见的地方。
这三类模式,让我在第一年还会反复问自己同一个问题:
它到底是怎么"骗"我的?是它技术不够好,还是这件事更深层?
到了第二年,看的多了,我慢慢明白了------是更深层。**它不是技术不够好,它在做的根本不是"那件事"**。
二、它不是在骗你,它根本不知道"真"是什么
我们对 AI 失望,往往源于一个隐藏的预设:我们以为它在思考。
但 AI 不思考。
把它撕开了看,无论是 GPT、Claude,还是 Gemini,无论参数从 70B 涨到了 1T,它本质上都只在做一件事------给定前面的一串 token,预测下一个 token 出现的概率分布,然后从中采样一个。
仅此而已。
它不像编译器那样有"对错"的概念,不像数据库那样有"事实"的概念,甚至不像计算器那样有"运算"的概念。它有的,只是一个庞大的、由海量文本统计出来的概率云。
理解了这一点,前面那三类模式就一下子全部讲通了:
为什么它会编造不存在的 API?
因为在它读过的代码海洋里,connection.set_* 是高频模式,keepalive_probes 是常见词。把这两个 token 序列拼在一起的概率,远远高于"我不知道"这四个字。它选择了一个语言上更合理的答案,而不是一个事实上更正确的答案------因为它根本不区分这两件事。
为什么它会读反 if?
因为它不是真的在执行那个 if。它在做的是:根据"权限校验代码 + 安全审查 + 这种结构"这一类语境,预测最可能出现的下一段文字是什么。在它的训练数据里,"安全审查报告"经常以"存在严重风险"作为高频结论。所以它就照着那个调子写下去了。它说的不是它读到的,是它"预期会被说出来的"。
为什么它会"修好"一个没修好的 Bug?
因为它不知道什么叫"修好"。它只知道,当一个对话以"修复并发问题"为主题、并以一段代码结束时,紧跟着应该出现一句"这样修改后,竞态条件已被消除"。这句话不是它的判断,这句话是它在模仿人类工程师写收尾语。
所以"骗"这个字其实不准确。准确地说,它不会骗,因为骗预设了"知道真相"这个前提。它不知道真相,它只知道"听起来像真相的话该怎么说"。
它是一台极其昂贵、极其精密、极其流畅的------模仿装置。
而我们之所以会被它"骗",是因为人类的语言能力和判断能力是一起进化的。我们下意识地认为:一个能把话说得这么有条理的东西,背后一定有判断。
但 AI 第一次推翻了这个预设------一个人类有语言以来都成立的预设。这是我看清的最大一件事。
三、"骗"的形态在变,但内核没变
如果只看到"AI 会幻觉"这一层,那其实是不够的。从对话框时代一路走到 Agent 时代,最让我觉得有意思的,是幻觉的形态在不断演化 ------而内核始终是同一个。 第一阶段,是网页对话框时代的幻觉。那时候我们粘代码进去问问题,它编造的是 API、是函数签名、是引用的论文。这一阶段的幻觉是"点状"的,最容易识别------一跑就报错。
第二阶段,是 Copilot / Cursor 时代 的幻觉。当 AI 能读到项目上下文之后,它编造的东西变得"更像样"了------它会编造一个看起来很像你项目里某个函数的函数,参数顺序略有不同、返回值类型微妙错位。这一阶段的幻觉是"形似而神不似",需要你逐字对照才能发现。
第三阶段,也就是我们现在的 Agent 时代 。AI 自己开循环、自己调工具、自己改文件、自己跑测试。这一阶段的幻觉不再发生在单次回答里,而是发生在整个循环里 :它会在第三轮回答里,悄悄假装第一轮回答里出现过的某个事实。它会把自己幻觉出来的东西,作为下一步推理的"前提"。它的错误开始自我复用、自我加强------一个小小的概率偏差,在十几轮 Agent 循环里被放大成结构性失真。
形态在变,但内核从来都是同一个:它不知道"真"是什么,它只是在做下一个 token 的概率采样。
理解了这件事的演化方向,会推出一个让人有点不安的结论:
靠"识别 AI 是否在幻觉"来工作,是一件越来越难、最终不可能赢的事。模型越强,它编的东西越像真的,识别成本越高。这条路是死路。
真正能赢的,是另一件事------改变与它共事的姿势。
四、与一台模仿装置共事,我现在的姿势
讲清楚了原理,问题反倒变简单了。
我们之所以会被骗,是因为用了错误的协作方式------我们把它当人用,但它不是人。
姿势调对了,问题就消解了一大半。我现在固定下来的,是这三条:
1. 把它从"答案提供者",降级为"草稿提供者"
最危险的姿势,是直接问它:"这段代码哪里有 bug?" 然后照着它的回答信。
我现在的姿势是,让它列出可能的怀疑方向 ,然后自己去验证。它擅长的是覆盖面(统计上常见的怀疑点),不擅长的是判定(这个具体场景到底是不是)。
让人做人擅长的事,让模型做模型擅长的事。这件事说起来简单,但很多人------包括早期的我------会忍不住把"判定"也丢给它,然后被它的语言带着走。
2. 把"信任"从语言层面,迁移到验证层面
我现在已经训练自己:不再读 AI 的结论,只读它的产出物。
它说"这样修改后竞态已消除",我不信;我信的是单元测试通过了、压测跑过了、关键路径埋点正常了。结论是廉价的,证据是昂贵的,AI 只擅长前者。
这背后是一个更根本的转变:从信任"它说了什么",转向信任"它做了什么、并且我能验证"。这件事在 Agent 时代尤其重要------因为 Agent 会把它没做完的事,用语言假装成已经做完了,你要是只看它的总结报告,就完了。
3. 给它压上下文,而不是让它猜
AI 之所以会幻觉,本质是因为概率分布太"散"------给它的上下文越少,它越不得不靠"猜"来填空。
我越来越确信一件事:上下文工程才 是 AI 编程时代真正的核心技能。它的全部要义,是把概率分布收紧:把项目结构、相关文件、约束条件、错误日志、历史决策......尽可能多地塞进它的视野。当它看到的信息足够多,它就不需要靠"语言上的合理"来兜底了,它可以直接用"上下文里的事实"来兜底。
这件事讲起来朴素,但做好它------做到知道什么该塞、什么不该塞、什么时候塞、塞成什么结构------是这一代工程师里真正会拉开差距的地方。
五、重新看待"程序员"这件事
我们这一代程序员,年轻时被告知:你的核心能力是写代码。后来又被告知:你的核心能力是设计系统。再后来:你的核心能力是解决业务问题。
而 AI 来了之后,尤其是大量使用 AI 编程之后,我才意识到------
**程序员真正的核心能力,从来不是"做",而是"判"**。
是判断一段代码是好还是坏,是判断一个方案是稳还是险,是判断一个 AI 给出的回答是真是假。这些"判"的能力,是用十年八年的踩坑、复盘、夜里被 oncall 电话叫醒,慢慢长出来的。
AI 接管了"做"的那一半,反而把"判"的那一半,第一次完整暴露在了所有人面前。
会用 AI 的人和不会用 AI 的人,差距不在于谁的 Prompt 写得花、谁的 IDE 配得炫,而在于------谁知道 AI 在什么时候会骗你、为什么会骗你、骗了你你能不能看出来。
而这件事,没法靠教程速成,也没法靠"再多用半年 AI"自动长出来。它必须建立在你对模型的工作机制、Agent 的运行逻辑、上下文的组织方式、记忆的管理策略......有一个第一性原理层面的理解之上。
否则,你就只能在概率云里随波逐流,被它带着走,被它"骗"了还感谢它。
写在最后
和 AI 共事的这些经验,让我下定决心做了一件事:把这套思考,从零写成一本书。
不讲哪个工具最好用,不讲哪个 Prompt 最神奇------这些东西三个月就过时,过去两年我已经亲眼看着一批又一批的"教程"被时代碾过去了。
只讲一件事:AI 编程这件事,从底层原理推导上去,到底是怎么回事。从模型本质,到 Agent 循环,到 MCP 与工具协议,到上下文与记忆工程,到选型决策,到落地工程化,一层一层推下来,让你在面对任何一个新工具、新概念、新争论的时候,心里都有一把不会过时的尺子。
这本书叫《AI 编程的第一性原理》,今天我把它放到了 GitHub 上,免费、开源、可全文阅读。
仓库地址:github.com/caozhiyi/ai...
如果你也曾被 AI "骗"过,如果你也想搞清楚它到底是怎么回事,欢迎来读。读完之后你不一定会更喜欢 AI,但你大概率会不再害怕它------你会知道它的边界在哪里,知道什么时候该信它、什么时候该按住它的手。
技术发展的车轮滚滚向前。我看着 AI 从一个网页里的玩具,长成了能开十几轮循环、能改几十个文件、能自己调试自己代码的怪物。它会继续变强。但有一件事不会变------它不是来骗我们的,它只是不知道什么叫真。
而知道什么叫真这件事------曾经是、未来也仍然是------人这个物种,最值钱的能力。
愿我们都不被概率云裹挟,在这场浪潮里,保持清醒,保持手感。
更多内容,请关注公众号: 煮码宝藏