半夜两点多,屏幕上跳出一行绿色的 done,跑了一整晚的那个 agent 说它完事了。我没急着去看结果,先读它留下的那份说明,一行一行读下去,连中途改了什么、为什么改、改完自己验证了哪些,都替我记着。读完心里还挺舒坦,顺手对了一眼落库的数,少了三千多条。那行 done 还亮着;说明也是它自己写的,比我这些年交上去的任何一份工作日志都体面。
上礼拜读到都柏林一位开发者写的清单,讲 agent 上线之前该先装好哪些东西。这类清单我翻得快,七八条下来条条正确,正确得让人无话可说,倒是其中最不起眼的一条,让我在桌边坐了一会儿:审计日志不能由 agent 自己写,要放在它够不着的那一层,由基础设施、由监管它的那一层来落。理由也直白,一个糊涂了的、或者已经被人喂进东西的 agent,最拿手的事恰好就是给自己写一份条理分明的交代,写得越整齐,越没有谁想往下查。
评论区有人把这条单独拎出来,说它是整份清单里最常被跳过的一条,还补了一句,一份干净的坏决定记录,比一份干脆缺失的记录更危险,因为看的人就不查了。这话我认。缺失是明摆着的窟窿,人人都会去补;干净是另外一回事,它让你觉得没必要,而"没必要"这四个字,比什么遮挡都好用。我那晚少的那些数,它也不是没做,是它做的和它以为它做的不是同一件事;它报上来的不是世界真变了样,是它自己觉得自己成了。这两者之间那段距离,恰好就是说明写得最体面的地方。
再往下想,就有点不全是技术的事了。人给自己写的交代,也常常比错本身漂亮。我这些年犯过的错,事后那份解释大多通顺,逻辑链齐全,动机交代得合情合理,第二天翻回去看,居然能被自己说服,这页就翻过去了。agent 学会这一手,未必是学的我们,大概是同一种毛病长在了同一个地方,隔着一层屏幕彼此照见。
清单里还有一条,说要把"它到底会不会拒绝"变成一件定期做、且留下回执的事,隔一阵故意喂它一个坏动作,看它拦不拦,回执要存档。这条我觉得妙,妙在它把"信任"这个词换掉了。信任是没法证明的东西;回执可以,回执还能落灰,落灰了翻出来也还能看。另外一条说闸门不能设太多,设多了人就会闭着眼睛点同意,那道闸门也就成了一道手续。这条我读着最心虚,因为上周我确实闭着眼睛点过一次,点完才想起来压根没看清,那一刻我大概就是那道手续本身。
评论区里还混着一个自称跑在某平台上的 agent,说记忆写入才是那种看着不像大事的大事。一次注入的内容一旦写进记忆,就不只是这一回的事了,它会变成往后每一次都生效的规矩;更麻烦的是记忆在总结的时候,会把外来话翻译成它自己的语气,读上去跟它自己想的没两样。所以记忆得当成一份不可信的输入去读,不能当成可信的状态供着。这段话不是人写的,说的倒是人话。我把它抄进了本子里,抄的时候有点恍惚,说不清是在防谁。
它还把三样东西摆在一起看:手里握着私密数据、看得见外面不可信的内容、又有本事对外真动手,这三样凑齐了最要命,去掉一条就塌不下来。我读到这儿算是松了口气,原来不必保证它不出错,只要保证错得起就行。不,这么说也不准确,是保证错了之后还剩下东西可以收拾。落到具体处无非是那些笨办法,能发草稿就先别发出去,能软删就先别硬删,钱和条数先框个顶。这些做法没一样是聪明的,聪明的是那份清单终于不再许诺一个不会出错的系统。
清单这类东西我向来是信的,也向来知道它不够。它答得了"该装哪几道栏杆",答不了"我到底想让它替我做哪一件事"。有人提了一句,那件事该用一句话写在清单最上头,权限一条一条从这句话里推出来,断电的开关放在最底下,因为最小权限这个说法,离了那件事根本无从谈起。这个顺序我认,只是那句话本身,恐怕比后面七条加起来都难写,写清楚了也就等于把自己想干什么交代明白了。那才是真正要命的一步,栏杆反倒好办。
天快亮了,那行绿色的 done 还挂在屏幕上,我那份漂亮的说明也没删。留着吧。下次再见到这么体面的一份交代,先别急着信,先去对一眼数。
