AI 听不懂「之前那个」
最近在李飞飞的自传《我看见的世界》中看到这样一个问题:
如果一个人从未见过红色,要怎么向他解释红色?
想了想,可以通过类比的方式表达视觉效果,比如苹果、火、血液的颜色,也可以通过形容感受、寓意等偏抽象的维度表达红色给人带来的感觉,比如热情、喜庆、温暖等。
可细想又觉得不对。就算这些都讲清楚了,对方也只是知道了很多关于红色的概念,还是没有真的「看见」红色。
沿着这个问题继续想,延伸到了一些形而上的路径上,越想越抽象,也很难说清楚,暂时没有答案,索性先放到一边。
不过在想这些的时候,联想到之前在播客中听到的一种观点,大致意思是「语言并不是载体」、「你所说的并不是你真正想表达的」之类,例如工作场景里很常见的沟通:
还是之前那个方案比较好…lol。
如果是刚加入项目的人,听完可能一头雾水。哪个方案?什么时候聊的?为什么要用它?
参与过前几次讨论的同事却很容易听懂。他知道「之前」指哪次讨论,也记得当时为什么放弃另外几个选项。有时候连下一步先做什么、该找谁确认,都不用再说。
同一句话,对一个人信息量很大,对另一个人几乎什么都没说。
一句话里没说的东西
程序员可能会联想到 diff。
diff 可以很小,是因为两边已经有一份差不多的 base。base 对不上,那几行改动就很难看懂。人与人交流也有点像这样。我们生活在同一个世界里,用着相近的语言,再加上一起工作留下的经历,很多内容不用每次从头解释。
「还是按之前那个方案」只是一个小小的增量。真正让它变得有意义的,是那段双方都知道的「之前」。
这件事和红色看起来离得挺远,但其实有点像。一个词本身装不了那么多东西。它更像一个线索,或一个 hook,听到它的人会用自己的经验把剩下的部分补出来。
这样来看,那个新加入项目的人的「一头雾水」,是不是很像现在和 AI 沟通时产生的「幻觉」?
AI 知道很多,却不知道项目怎么走到这里
与 AI 协同办公的这两年,写代码、做产品、改文档,它懂的东西确实很多,产品规划、可行性分析、原型设计、UI/UX、开发实现,随便挑一个都能聊,聊得头头是道,以至于我感觉自己只是在花式赞同,yes/go ahead/proceed/ok…
但我如果顺手说一句「还是按之前那个方案」,麻烦就来了。
它不确定「之前」是 3 分钟前还是 3 小时前,3 小时前为什么放弃方案 A,也不知道某个看起来合理的建议其实已经在另一个 session 中试过了。甚至「把页面做得再简洁一点」这种话,它理解的也可能和我预期的不一样。
我说的简洁,通常不是少放几个按钮。我潜在的想法可能涵盖信息层级、页面密度,还有半年后继续加功能时会不会崩。这些偏好并不是一句话形成的,而是在一次次讨论和取舍中慢慢变得具体。
前面的过程如果没有留下来,AI 只能按它对「简洁」的一般理解重新猜一次。
这时候它看起来像突然变笨了。实践还是最佳实践,推理也没消失,它只是没跟上这个项目怎么一步步走到了这里。
以前碰到这种情况,我会觉得是 prompt 没写好或者 context 不够大,然后把需求写得更详细一些。解释得多了才发现,我反复补的经常不是新需求,而是旧历史。
哪些路试过了,哪些方案放弃了,我说的某个词在这个项目里到底是什么意思。这些东西散在旧对话、文档和脑子里,每开一个新 session,就得重新拼一次(不过目前各种 agent 运行时已经可以相对好地处理跨 session context 和 memory 了)。
这种负担,或者说小麻烦,就像小刀乱划,伤害不高,但时不时地烦你一下。
所以现在看到 Context Engineering,我已经不太会把它简单理解成多塞几份文档。文档当然有用,但它通常只记录现在是什么样,不一定会写清楚为什么变成这样。那些没采用的方案、反复磨出来的偏好,还有交流时默认的语气,也会影响 AI 怎么理解眼前这句话。
这些想法,琢磨来,琢磨去,后来又从产品协作绕回了写作。
AI 对红色的了解从哪里来
不过顺着这个思路继续想,又有一点好像说不通。
AI 没有像人一样长大,没有在路口等过红灯,也没有因为碰到火焰而缩回手,但如果问它红色是什么,它可以讲波长,讲血液和危险,也知道红色在春节、宗教或者政治中可能代表什么,讲得甚至比大多数人都全面。
如果就此便说它懂/不懂红色,似乎也有点武断。
细想一下,AI 读到的文本本来就是人写下来的。人看过火焰,被烫过,知道受伤是什么感觉,再把这些经验变成语言。模型没有亲身经历这些事情,但它读过大量由亲历者留下来的描述,也能从中学到火焰、温度、疼痛和危险之间的映射关系。
有点像看了很多旅行攻略,虽然没去过,但也不能说对那个地方一无所知。当然,攻略看得再多,和真的站在那里还是两回事(旅行的意义,又是一个 AI get 不到的难以言说的点)。
这么看,AI 拿到的更像是一份庞大且复杂的二手经验。
「红色」这类公共概念,无数人解释过、使用过,也在不同场景里反复修正过它的含义。模型可以从这些内容中慢慢拼出一个大致的结构。
但「之前那个」只存在于我和项目的历史里,公开资料里没有,模型训练时不可能见过,新的 session 里也未必存在。除非把之前的讨论和决策重新放进 context,否则它确实很难猜准。
于是就出现了一种挺奇怪的反差:它能说清楚人为什么看到红色会紧张,却不知道我为什么不想再用 3 小时前刚刚否掉的方案。
「之前」要怎么留下来
既然缺的是历史,最直接的办法好像也很简单:写下来呗。
但真正做过项目就会发现,这事没有听起来那么轻松。文档通常更关心最后定了什么,很少完整记录中间经历了什么,维护 devlog 容易,维护 thinklog 难。方案 A 为什么被放弃,某个妥协是在什么限制下做的,「简洁」这个词经过几轮讨论后到底指什么,这些内容很容易散在聊天记录和参与者的脑子里。
等到换了成员,或者重新开一个 session、切换一个 agent runtime,看到的通常只剩一个结果,至于为什么是这个结果,已经找不到了。
比如只记一句:
用户喜欢简洁的 UI。
看起来没什么问题,实际上又好像什么都没说。下一次改页面时,AI 还是不知道这里的「简洁」到底是少放几个按钮、理清信息层级、降低页面密度,还是不要为了眼前的需求破坏后续扩展。
如果只保存最后的结论,很多词很快又会退回到一种模糊的通用解释。能把当时的取舍也留下一点,后面接着做事时可能会省下不少重复沟通。
当然,也不能因此把所有聊天记录都永久保存下来。信息太多会变成另一种噪音,半年前的判断在今天也可能已经过期,AI 要是抱着旧 context 不放,估计比完全不记得还让人头疼。
所以难点可能不只是怎么记住,还包括该留下什么、什么时候应该忘掉,以及怎么让后来的人或者 AI 看懂当时为什么这么选。这个边界我目前也没想清楚。
但相比一个什么都记得的「超级记事本」,我更想要的可能只是让项目能够接着往下想。换个人,换个模型,或者过段时间再回来,不需要先把散落一地的背景重新拼一遍。
回头再看「红色」和「之前那个」,两者依赖的背景并不一样。
我们能聊红色,是因为人类有相近的感官和身体,也长期生活在差不多的物理世界和文化环境里。那些共同经验从很早就开始积累,平时几乎感觉不到,像是大家各自完成了一轮很漫长的「预训练」。
而「之前那个」只依赖一小段局部历史。同事参与过,所以能顺手补出来。AI 没参与过,那段历史又没有被留下,它自然只能重新猜。
下次再遇到这种情况,我大概还是会补充 prompt 和 context,但在动手写一大段说明之前,应该先看看过去的决定和取舍,是不是存在某个它能找到的地方。
不然 prompt 写得再详细,也只是又一次把「第一次见面」说得更完整而已。