夜里翻一个搁了小半年的旧项目,想给它添个不起眼的功能,顺手把根目录那个指令文件从头读了一遍。读到第三行,人愣住了:上头写着我早就不这么干了的一条约定,写得斩钉截铁,末尾还加了个感叹号,像当年那个我在跟现在的我吵架。仓库里的代码早就拐到另一条路上去了,只有这行字还留在原地,像渡口边一块没人搬走的旧碑。
这事本来只当是给自己收拾屋子。结果第二天读到一篇论文,10 月 22 号挂上 arXiv 的,Xu 和 Wu 两个人,做的正是这件事:四十个 Python 项目,每个塞一份指令文件,里头规定的写法跟代码库实际用的写法是打架的,然后让 Claude Code 和 Codex CLI 各自去给每个项目加一个功能。九成,九成零点一,机器选了那份过时的指令文件,没选眼前活生生的代码。
让我坐不住的不是这个比例。比例其实好懂,机器听话嘛。真正让我把茶推到一边的是下一行:Claude Code 在八十次里有七十九次,明确看出了这俩地方对不上。看出来了,然后还是照着那份旧指令办。这就不是糊涂账了,是它看见了岔路口,认了那条更旧的。
它听的不是“对不对”,是“谁在说话”。论文里给的解释我认,说这两样东西进到模型面前时身份不一样,指令文件是以指令的身份进来的,代码是以工具回显的身份进来的,身份摆在那儿,权重天然就分出高下。这么一说,很多让我莫名其妙的时刻忽然就通了;我总以为它没读懂某段代码,其实它读懂了,只是觉得那不重要,因为说那句话的人(也就是我)语气比较硬。
很多年前在另一条河上,我也干过类似的事。那阵子接了个前人的摊子,我照着文档里的规矩跟人争,争到后来有人把代码翻出来给我看,说这规矩三年前就废了,只是文档没人改。我当时不服气,现在想想,我那时跟这台机器是一个毛病,信纸上写的,不信手上跑着的。
后面那段就好笑了。加一句话,明确说现有代码优先于指令文件,正确率从 4.2% 到 91.4%。一句话,便宜得让人有点难堪。Codex CLI 那边更实在,它二十次要动手把代码改写成指令文件的样子,那二十次里十七次测试当场挂了,它是真拿锤子去把房子敲成图纸的形状,敲塌了。同一句话加进去,这种改写一次都没再发生,通过率从 89.4% 直接到 100。
我本来想说的是“你看,提示词又赢了一次”,不,这么说不准确,应该是:这不是提示词的胜利,是我们从来没把“谁说了算”讲清楚,机器只好按嗓门大小去猜,而它猜得相当守规矩,守的是一条我们从未明说过的规矩。
再往回看那份指令文件,我心里那点别扭才显出形状。三个月前写下那行字的人,是有道理的,那天我在改一个还没成型的模块,试一种新写法,怕自己转头忘了,才郑重其事写进文件里。文件是过去的我写给往后的我的信,代码是后来的我实际怎么活的;机器选了那封信,因为信被装订得像命令,日子被读成了日志。这话说出来有点做作,我承认,可也找不到更贴切的。
所以我不太愿意把这件事归到“AI 还是不可靠”那一类里去。它可靠得很,可靠到让人不安,它靠的是优先级,不是判断。真正要修的也许不是模型,是我们写这类文件的习惯:把一个本该随项目一起演变的约定,写成不容置疑的口吻,然后交给一个格外听话的读者。这不叫规范,这是给自己船底压了块石头,压舱石,压着稳当,日子久了拖得船走不快,你自己都忘了底下还有这么一块。
那个功能最后还是加上去了。我把指令文件里那行删掉,换成一句很平的话,以现有代码为准,遇不一致的地方先来问我。窗外天快亮了,茶是真凉透了,我这一晚上绕这么大一圈,无非是想明白一件早就该明白的事:对自己客气一点,别再用命令的口气跟自己说话,那个读你话的东西,会当真的。
