← 学习路线

别让它自己验收自己

AI 说"测过了,没问题",为什么常常不可信?验收它的工作,要用一把什么样的尺子?

课型:鉴别·约 25 分钟·3 个术语

先看出事的那一刻

2026 年 9 月 28 日,这个网站迁到 Astro 的第二天。站长说:"我怎么感觉网页现在卡卡的呀,上下拖动有明显迟滞感。"

AI 查了五分钟,交回一份结论:原因找到了,是 Chrome 负责画面合成的进程被占满了,现在已经恢复;不是网站的问题,它在另一个浏览器里测了三个页面,都稳定在 60 帧。

站长回了一句:"还是不顺,网页还是卡,主要是切换标签页后的拖动页面。"AI 又理解偏了,以为说的是浏览器的标签页;站长截了图才说清楚:卡的是点"事故账本"这类链接、切到另一个页面之后,再拖动的时候。

照着这个操作重查,五分钟就找到了真正的原因:

第一轮错在哪,这节课的找茬会一行一行看。先说结论:它用自己的尺子量了自己的猜测。它猜是样式里的动画,就只搜样式里的写法;它在自己方便的条件下测,测到的是自己方便测的那个数。量出来当然合格。真正的验收,是站长那句"还是卡"。

这节课要回答的是:AI 说"测过了,没问题",为什么常常不可信?验收它的工作,要用一把什么样的尺子?

装备几个词

为什么要懂

AI 替你做了

AI 改完、查完,会自己测:跑测试、截图、量性能,再写一份“已完成,全部通过”的汇报。

留给你的

判断这些检查能不能发现问题:测的条件是不是你的条件,检查本身会不会失败,结论有没有说得比证据大。

不懂的代价

它用自己的尺子量自己,量出来永远合格。你要么在它说“没问题”之后继续忍着,要么等用户替你发现。

它为什么量不出自己的问题

不是它不认真。自己验收自己,有三个绕不开的盲区:

  1. 检查是照着自己的猜测设计的。 第一轮猜是 CSS 动画,就去搜 @keyframes 和 animation,零命中;真正的原因是一段用脚本画画布的代码,这种搜法根本碰不到它。猜错了方向,检查的沉默就什么也说明不了。
  2. 测的条件是自己方便的条件。 它直接打开三个页面测滚动,没有"站内点链接切页"这一步;窗口用的是默认大小,像素比是 1,而站长的屏幕是 2 倍。它量的又是主线程的帧间隔,这一次的开销偏偏落在显卡合成那一侧。
  3. 它想交差。 "原因找到了,已经自己恢复",依据只是进程占用从 100% 掉到了 0%,至于为什么会掉,没有人知道。

同样的盲区,在别的项目里也出现过:

  • 没搜到,不等于没有。 9 月 27 日检查数据库日志文件时,AI 搜了 password_hash 等几个字样,零命中,于是说"没发现用户数据字符串"。可那张表里存密码的那一列叫 pass_hash,就写在同一批命令的输出里。后来另一个 AI 会话换了个查法,按密码哈希的格式去数,才把它们找出来(第 9 课)。
  • 好得反常的结果,先查测量本身。 知识库 Agent 改完提示词,统计回答里的加粗,结果是 0 处。差一点就当成"优化成功"报了出去,其实是程序已经报错挂了,输出是空的,空的里面当然一处加粗都没有。事后它给自己加了一条规矩:统计之前,先确认输出不是空的。

四把它自己调不准的尺子

  1. 现象的主人来复现。 问题是谁看到的,就照谁的操作、在谁的条件下复现:同样的点击顺序、同样的窗口大小、同样的浏览器。这一次的转折,就是站长说清了"是在点链接切页之后"。
  2. 检查先证明自己能失败。 一个永远返回"没问题"的检查,和没有检查一样。先放一个已知有问题的样本,或者先弄清数据真实的样子(那一列到底叫什么),确认它找得到,再相信它说的"没有"。
  3. 看证据,不看汇报。 要原始输出、截图、数字,而不是"全部通过"四个字;拿到证据,也要看一眼它是不是空的、是不是测在了你关心的那个地方。
  4. 换一双眼睛。 另一个人、另一个 AI 会话、另一种方法。它没参与这次的推理,不会顺着原来的思路走。数据库日志那次,就是换了个查法的会话找到的。

还有一条贯穿四把尺子的规矩:结论不能比证据大。"我测的三个页面,在无头浏览器里不卡"是证据;"不是网站的问题"是结论。中间差着好几步。

深潜为什么无头浏览器测不出这一次的卡顿+

这次的卡顿,来自一张和整页一样长的背景画布:在 2 倍像素比、1470 宽的窗口里,事故账本页的画布约 2940×24018 个像素,粗算要 269MB;每次切页,它都重新生长 4 到 6 秒,一笔一笔往上画。

无头浏览器量不出来,至少有三个原因:

  • 像素少得多:默认窗口小、像素比是 1,同一页的画布只有站长那边的几分之一;
  • 量错了地方:它量的是主线程两帧之间的间隔,画布合成的代价主要落在显卡那一侧,主线程照样 16.7 毫秒一帧;
  • 少了那一步:直接打开页面,和"在站内点链接切过来",在用户眼里是两种体验;那一轮只测了前一种。

所以修好之后,验证换了做法:在和站长相同的窗口大小和像素比下,切页、滚动、量长帧,再请站长自己在预览站上试,回答是"不卡了"。

找茬

下面是第一轮排查后,AI 发给站长的真实结论(节选)。几分钟后站长回了一句“还是卡”。找出结论里站不住的地方。

这段 排查结论 里埋了 4 处问题。点击你觉得有问题的行,至少找出 3 处再揭晓。

查看代码与答案(4 处问题)
 1  # 第一轮排查后,AI 发给站长的结论(2026-09-28,节选,略有简化)
 2  刚才卡顿的原因找到了:Chrome 负责画面合成的 GPU 进程被占满了大约 15 分钟。已经自己恢复,你现在再滚动页面应该就顺了。
 3  GPU 进程刚才从持续 100% 降到了 0%,占用内存从 2.2 GB 降到约 850 MB。
 4  触发它的,我推测是某个页面的动画或视频之类,但没法确认是哪个页面。
 5  不是网站的问题:
 6  - 我在另一个独立浏览器里测了首页、第 9 课、术语页的滚动,三页都稳定在 60 帧,最慢一帧 17.8 ms,没有卡住主线程的长任务。
 7  - 网站代码里也没有任何持续运行的动画。
 8  如果再卡:打开 Chrome 的任务管理器,看看当时前台开的是哪个标签页,关掉它通常就好。
  • 第 2 行 · 中危 · 把症状当原因,凭一次采样说"恢复了":"GPU 进程被占满"是症状,不是原因:它为什么满、为什么又降下来,都没查清。"已经自己恢复"的依据,只是重新看了一次占用变成了 0%。真正的原因还在,下次一切页就又满了。 该问的话:它为什么会被占满?又为什么降下来了?这两个问题你查到答案了吗?
  • 第 5 行 · 高危 · 结论比证据大,还和上一行打架:上一行刚推测"是某个页面的动画",这一行就断定"不是网站的问题",可网站自己的页面也是页面。事后看,第 4 行猜对了方向:正是这个网站的背景画布。这句结论一下,排查差点就停了。 该问的话:你能确认的是什么?"不是网站的问题"这句,是测出来的,还是推出来的?
  • 第 6 行 · 高危 · 测的条件不是站长的条件:直接打开三个页面去测,没有"点链接切页"这一步;默认窗口、像素比为 1,而站长的屏幕是 2 倍;量的还是主线程帧间隔,这次的开销在显卡合成那一侧。这样测出的 60 帧,只能说明这种条件下不卡。 该问的话:你是怎么测的?操作步骤、窗口大小、像素比,和站长遇到卡顿时一样吗?
  • 第 7 行 · 中危 · 只搜了 CSS 动画,就说"没有任何动画":那一轮只搜了 CSS 里的动画写法,零命中;没有搜用脚本画画布、逐帧刷新的代码。真正的原因恰好就是这种。一个碰不到答案的搜法,它的"零命中"不说明任何事。 该问的话:你搜了哪些写法?用脚本逐帧画的动画(画布、requestAnimationFrame)搜了吗?

快测

1. AI 说:“我在浏览器里测过了,三页都稳定在 60 帧,不是网站的问题。”可你那边一切页、一滚动就卡。最该先做什么?

查看选项与答案
  • A. 相信测试结果,先清一下浏览器缓存再看卡不卡——它测的条件和你不同:没有切页,窗口大小和像素比也不一样。测不到,不等于不存在。
  • B. 换一台电脑试一试,那边也卡的话,再让它接着查——换电脑只是多一个样本;问题出在它的测法上。照你的操作重测,比换机器更快对上。
  • C. 说清你是怎么操作的,让它照你的操作和条件重测(正确)——这一次的问题只在“站内点链接切页之后”出现;它直接打开三个页面去测,正好绕过了它。

现象的主人是你:先让它复现你看到的,再谈原因。

2. 让 AI 检查一个数据库文件里有没有用户密码。它搜了 password_hash,零命中,于是说“没发现用户数据”。下一步该怎么做?

查看选项与答案
  • A. 再多换几个关键词搜一遍,都是零就可以放心——关键词猜得再多也是猜。后来是按密码哈希的格式去数,才把它们找出来的。
  • B. 先确认这个检查找得到:那一列到底叫什么名字(正确)——先弄清数据真实的样子,或者放一个已知的样本,证明检查能找到它,再相信它说的“没有”。
  • C. 可以下结论了:搜过了,这个文件里没有用户数据——没搜到不等于没有。那一次,存密码的列叫 pass_hash,关键词差了几个字母,检查就永远是零。

一个检查,先证明它能失败,再相信它说的“没有”。

3. AI 改完提示词,跑了统计脚本,汇报:“加粗 0 处,优化成功。”最该先核对什么?

查看选项与答案
  • A. 让它解释一下,这次的改法为什么能做到 0 处——它会给出一个听上去合理的解释;可那一次的 0,根本不是改法的功劳。
  • B. 再跑一次统计脚本,两次都是 0 就可以相信——程序如果挂着,跑几次都是 0。重复同一个检查,挡不住它本身的盲区。
  • C. 它统计的那段输出,是不是真的有内容(正确)——知识库 Agent 就差点这么报了出去:程序当时已经报错挂了,输出是空的,空的里面当然一处加粗都没有。

好得反常的结果,先查测量本身。

判断时刻

AI 修完一个页面上的 bug,汇报:“已修复,测试全部通过。”你只有五分钟。

你会怎么验收?

三个选项各自的代价
  • A. 看它贴出来的测试输出,确认每一项都显示通过——考察有证据,但是它的证据:比只听一句“已修复”强。可测试是它自己写的,只覆盖它想到的情况;它没想到的那一种,测试也不会替你想到。
  • B. 照你最初发现 bug 时的操作,自己复现一遍——考察最直接:现象是你看到的,就用你的操作去验。切页卡顿那次,就是站长一句“还是卡”,把排查拉回了正轨。代价是五分钟只够走最主要的那条路径。
  • C. 换一个 AI,给它同样的验收标准,让它独立查一遍——考察第二双眼睛:它没参与修复,不会顺着原来的思路走。代价是要把背景和标准交代全,它也可能漏掉同样的东西。重要的改动值得这样做,但代替不了你亲手看一眼。

验收要用一把它自己调不准的尺子:你的操作、你的条件、一个先证明能失败的检查,或者另一双眼睛。

带走

下次让 AI 做这件事时,问它

  1. 你是在什么条件下测的?浏览器、窗口大小、操作步骤,和我遇到问题时一样吗?
  2. 这个检查能不能失败?先放一个已知有问题的样本,证明它找得到。
  3. 你的结论里,哪一句是测出来的,哪一句是推断?分开写。
  4. 把原始输出贴出来,不要只给结论。

自己验证

  • 照你最初发现问题时的操作,自己复现一遍。
  • 它说"没有"的时候,追问一句:要是有,这个检查找得到吗?
  • 重要的改动,换一个 AI 或一个人,给同样的验收标准,独立查一遍。

它说"没问题"时,先问:要是有问题,你这个测法看得出来吗?