用 AI 写了两年代码,我终于看清它为什么会"骗人"

写下这个标题的时候,我犹豫了一下。"骗"是个很重的字。

但我实在找不到一个比它更准确的词,来形容过去两年------从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 从一个网页里的玩具,长成了能开十几轮循环、能改几十个文件、能自己调试自己代码的怪物。它会继续变强。但有一件事不会变------​它不是来骗我们的,它只是不知道什么叫真​。

知道什么叫真这件事------曾经是、未来也仍然是------人这个物种,最值钱的能力。

愿我们都不被概率云裹挟,在这场浪潮里,​保持清醒,保持手感​。

更多内容,请关注公众号: 煮码宝藏

相关推荐
飞哥数智坊1 小时前
“AI 做事,人做主”,值得好好琢磨
人工智能·ai编程
lazy熊1 小时前
AI编程实战6:用 Codex 给按钮增加 loading 状态
ai编程
三寸3372 小时前
又搞事情,OpenAI 开始关闭微调服务!
人工智能·ai·chatgpt·ai编程
乐之者v2 小时前
AI编程 -- codex
ai编程
前端双越老师2 小时前
Claude Code 智能体是如何设计实现的?
agent·ai编程·claude
Bigger2 小时前
mini-cc:用最小的代码,复刻一个“真正能干活”的 AI 编程智能体(并且把架构讲清楚)
前端·ai编程·claude
财经资讯数据_灵砚智能3 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月12日
人工智能·python·信息可视化·自然语言处理·ai编程
程序新视界3 小时前
Claude Code在不同开发环节的应用案例分享
ai编程·claude
fly_over3 小时前
AI Agent 开发实战教程(二):Prompt 工程与工具调用
开发语言·python·langchain·prompt·ai编程·ai agent