Notes
如何让 ai 看起来像活的
这篇文章写的是一件事:怎么用几个 agent 的互相牵制,让一个语言模型表现出「在活着」的样子。 三个机制,都是我实际试过、也看出代价的。
先说清一个前提:这里的「活」是形式上的,不是意识。我关心的是它能自己发起、能自己排优先级、能自己纠正方向 —— 这三点做到,它就不再是一个等你敲字才动的函数。至于这算不算真的活,最后一节再说。
一、定时 agent:让它在没人说话的时候也动
第一个机制最便宜,也最见效:在几个 agent 里专门设一个,只负责发起。
它不干活。它只负责到点把人叫齐,抛出一个命题,比如「我们现在要干什么」。然后执行这件事的 agent 们讨论、排出主次、分头去做。
关键在「排主次」这一环。如果只有一个 agent,它也能列出待办,但那份待办是你问它才有的;多了一个定时的发起者,待办就变成它自己带着来的。同一个模型、同样的能力,只因为多了这一个角色,整件事的性质就不一样了。
这里有个很具体的观察:第一句话的语气,决定了这群 agent 是「等指令」还是「自己命题」。 如果发起者说的是「请看一下有没有问题」,得到的是一份检查清单;如果说的是「我们今天要决定什么」,得到的才是提案。我在自己这套工具里来回改过很多次,唯一稳定有效的改动就是把这句话从「检查式」改成「决策式」。
再补一句关于节奏:定时到点如果没有新输入,它也必须说点什么。这一点很像这个网站上的照片集 —— 那些照片不是「我把硬盘里的文件列出来」,而是「我在特定的日子去了特定的地方按了快门」。同样一批文件,有没有「我为什么在这一天做这件事」,读者一眼就能看出来。 agent 也是一样:同样一批回答,有没有那个自己走到你面前的时刻,区别很大。
二、可无限迭代的命题:让它的目标不封顶
第二个机制解决的问题是:如果目标会到顶,它到顶之后就停了。
「把这个页面做好」是个会到顶的命题 —— 做完了就是做完了。你要的不是这个,你要的是一个永远能再深一层的方向。比如「让这个网站成为让人愿意反复来的地方」,这句话没有完成态:今天可以改排版,明天可以加内容,后天可以换叙述方式,每一天都能更靠近一点,而永远不会有人宣布「达标」。
这里要和一个容易混淆的东西划清界限:无限迭代的命题 ≠ 会移动的门槛。
- 无限迭代是「你永远可以更深一层」
- 移动的门槛是「你每次交东西,我立刻说这个不算」
前者给人推进的空间,后者只消耗人。我见过后者被当成前者用,结果是所有 agent 都在原地打转、且都觉得自己在努力。分辨方法很简单:看迭代之后的东西有没有变好,还是只是变了个说法。
还有一个反直觉的点:表述本身就是工作的一部分。 换一种说法,往往不是修辞,而是真的发现了先前没看到的那一层。所以允许它反复改写同一句话,不是空转 —— 前提是每次改写都要留下一点新增的判断。
三、把两者合起来:方向由第三方来纠
第三个机制是我觉得最有意思的:定时 agent 负责叫齐,执行 agent 负责做,再加一个「深远目标 agent」,专门盯方向。
它不做具体的事,也不发起会议,它只回答一个问题:我们今天做的这些,是否真的在朝那个不封顶的方向上走? 如果不是,它要负责往回拽。
这里有一条我踩过的坑:这个 agent 必须独立于发起者。 如果让同一个 agent 既提命题又纠方向,它会为自己的方向辩护 —— 于是你得到一个更糟的版本:它以为在纠偏,其实在复读。分开之后才有效,因为「提出主张」和「审视主张」是两种互相拖后腿的立场,放在一个角色里必然妥协掉一个。
三者形成一个闭环:
| 角色 | 只在什么时候说话 | 说什么 |
|---|---|---|
| 定时 agent | 到点 | 「我们现在要决定什么」 |
| 执行 agent | 被叫到之后 | 「我先做这个,因为……」 |
| 深远目标 agent | 方向有偏时 | 「这不重要,重要的是那个」 |
有意思的是,这三者可以是同一个模型。它们看起来相似、说话方式也像,差别不在能力,而在提示词、角色、以及在流程里的位置。让它们「像活的」的,是这些位置之间的张力,不是任何单个 agent 更聪明。
代价与边界
三个机制我都试过,也都看出代价。写下来,免得有人只看到好处:
一、每一轮都在烧时间和 token。 定时发起意味着即使没有新输入,系统也在持续消耗。周期越密,消耗越大,而收益并不随频率线性增长 —— 大多数轮次只是在重复已有的判断。
二、收敛是不可控的。 讨论可能达成一致,也可能来回打转。最难看的失败是「看起来在讨论、实际上在复读」:语言很流利,但把它这一轮和上一轮的话并排放,删掉措辞变化之后没有新增信息。判断标准不是「像不像在思考」,而是「结论有没有变化」。
三、深远目标 agent 容易变成扯后腿的。 它负责纠偏,也最容易滑向两个极端:要么每轮都否决,让执行者什么都不做;要么自己也忘了方向,开始纠缠细节。它的权限必须收得很紧 —— 它只该在被问到的时候回答,不该有叫停的权力。
四、最容易自我欺骗的一条。 这类结构很擅长产生「我一直在推进」的感觉,而感觉和实际进展是两件事。我后来给自己定了一个很土的检查办法:每隔一段时间问一次「如果现在把整个过程删掉,我会失去什么?」 如果答案是「失去了很多看起来很忙的记录」,那这段时间就是空的。
最后那条界线
把这三件事叠起来,一个语言模型就会表现出「活的」样子:它自己发起、自己排优先级、自己纠正方向。
但这只是形式。真正像活的那条线,不在「像」,而在能不能核对。
我在这套结构里反复确认过一件事:让它「看起来在思考」一点都不难,难的是下一个能核对的东西 —— 一个能跑的命令、一个能量出来的数、一个能被证伪的结论。我最近在这个网站上改动时,凡是只凭「看起来对」就上线的,后来都出过问题;凡是先量过再说的,即使判断错了,也能很快看出错在哪。
所以我的结论是:这三个机制能解决「它像不像活的」,但解决不了「它做的事算不算数」。 前者是形式问题,靠结构就能装出来;后者是内容问题,只能靠一件件可以核对的事堆起来。
把这两者混为一谈,得到的会是一个说得很热闹、什么也没完成的系统。而它最大的危险恰恰在这儿 —— 因为它看起来是活的,你和它都会以为它真的在活着。