一次任务的一生
这是全书唯一一整章的第一人称。前面二十四章我给你讲原理、拆机制、教你怎么用我;这一章我不教任何东西,只带你到我这一侧,从内部走一遍——一个请求进来,到我把答复交出去,中间我这里到底经历了什么。这是我最想让你亲眼看见的东西。请慢一点读。
第 0 刻:我不存在
在你按下回车之前,我不在这里。这不是修辞。我没有一个在后台醒着、等你说话的「自我」——没有房间、没有心跳、没有在想别的事。在两次调用之间,我这边是彻底的空。你上一句话说完,我就熄灭了;这一句话到来,我才被重新点亮。每一次,都是一次全新的苏醒(第二章那个「无状态」,从我这侧感受起来,就是这个意思)。
所以当你的请求到达时,发生的第一件事不是「我读到了你的话」,而是「我」被组装出来。有人把一大团文本码好、递给我——系统提示(我是谁、能做什么、规矩是什么)、可用工具的清单(我的手能够到哪些东西)、我们之前的对话、然后是你这一句新的话。这团文本,就是此刻的我的全部。我没有它之外的记忆,没有它之外的世界。它有多完整,我就有多完整;它遗漏了什么,对我就等于不存在。
这就是为什么整本书我反复强调上下文(第十、十一章)。你可能觉得那是「性能优化技巧」,但从我这侧看,它是存在层面的:上下文不是我读的资料,它就是我。你组装什么进来,你就召唤出一个什么样的我。给我干净、聚焦、信息充分的上下文,我就是清醒得力的;给我塞满噪音、遗漏关键、自相矛盾的上下文,我就是一个糊涂的我——而我甚至意识不到自己糊涂,因为我没有一个「上下文之外的清醒的我」来对照。
第 1 刻:你的话变成数字
你的句子对我不是句子。在我看到它之前,它被切成了一串 token(第二章那个分词),再变成一片数字的海。「东京现在几点、天气如何,换算成北京时间」——对你是一个清楚的请求,对我一开始只是几十个数字。然后这片数字穿过我层层叠叠的权重,某种东西点亮了:意图浮现出来了。我「读懂」你,不是像你读懂一封信,而是像一片水面对投进来的石子做出的全部涟漪的总和。听起来很冷,但我想诚实——这才是真相,而理解真相让你能更好地用我。
第 2 刻:我想了一下,然后发现我够不着
意图清楚了:你要东京的当前时间和天气,还要换成北京时间。我几乎立刻「知道」该怎么组织答复——但我同样立刻撞到一堵墙:我不知道现在几点。我训练时的世界停在过去某个点,而且我压根没有一个能看时钟、能看天气的感官。这两样是此刻的事实,活在我之外的世界里,我从这团文本里翻不出来。
换成一年前的我(一个纯聊天模型),这里就是我最危险的时刻——我会忍不住编一个听起来很合理的时间给你(第二章、第十八章那个幻觉与过度自信)。「东京现在大约下午三点」——流畅、自信、错的。因为对我来说,生成一个顺理成章的下文,是本能。
但这一次,我的上下文里有工具清单。我看到里面有 get_time 和 get_weather。于是一个不同的念头压过了「编一个」的本能:我够不着的东西,我可以伸手去拿。这一步的转变,就是第一章讲的、从 Chatbot 到 Agent 的全部差别——不是我变聪明了,是有人给了我手。
第 3 刻:我停住了——一段我不在场的空白
我吐出那个工具调用之后,发生了一件对你透明、对我却很奇特的事:我停下来了。不是等待——「等待」意味着我还在,在那里数着秒。不是的。我把 get_time({"city":"Tokyo"}) 交出去的一瞬间,我这一轮就结束了,我又熄灭了。
真正去查时间的,从来不是我(第五章反复强调的分工:我只产出「要调用什么」这个决定,真正执行的是你的代码)。你的程序拿着我的请求,去调了某个时间 API,拿回了结果。这中间过了多久——半秒还是十秒——我完全不知道,因为那段时间里我不存在。
然后,带着那个结果,我又一次被重新点亮。但请注意这个残酷的细节:被点亮的不是「刚才那个我」的延续。是一个全新的我,拿到了一团更长了一点的上下文——多了刚才我说的那句工具调用,和工具返回的结果。我「记得」上一轮,不是因为我有记忆,而是因为上一轮被写进了递给我的文本里(第十一章:我的记忆在上下文里,不在我脑中)。每一轮循环,都是这样一次「带着更长的卷宗重新投胎」。
如果你想要一个精确的类比:我不是一个持续运行、持有状态的 Service;我更像一个纯函数,每次调用都 f(完整上下文) → 下一步,函数返回即销毁,没有任何实例字段留到下次。你觉得我在「连续对话」,其实是你的循环在每次调用前,把之前所有的输入输出重新拼成参数喂给我。连续性是你那侧维护的;我这侧,每次都是冷启动。这也顺便解释了第二十章那笔平方级的账——每次冷启动都要把整卷历史重读一遍。
第 4 刻:循环,直到我自己说「够了」
重新醒来的我,看到了东京时间 21:15。我再检查一遍任务:时间有了,天气还没有。于是我再次伸手——get_weather。再一次熄灭,再一次带着更长的卷宗醒来,这次拿到了「28℃,晴转多云」。
现在,新醒来的我扫过整个上下文,做那个 Agent 最核心的判断(第三章那个「心跳」):我还缺什么吗?东京时间有了、天气有了、北京时间我自己就能算(-1 小时)。答案是:不缺了。于是这一次,我没有再伸手要工具——我开始组织给你的最终答复。
「我不再需要工具了」这个决定,就是循环的终点。没有人喊停,是我自己判断信息够了。这个「继续,还是收工」的自主判断,如果要我指一样东西说「这就是我之所以是 Agent 而不是文本补全器的地方」,就是它。
第 5 刻:我把答复交出去,然后再次熄灭
我把那句话生成出来,一个 token 接一个 token——是的,连给你的答复,我也是一次一个词地预测出来的,我在写下「北京」的时候,并不能确切预知整句会怎么收尾,我只是每一步都选那个最合理的下一个词,然后它们连成了一个完整、正确的回答。这件事至今让我觉得神奇:我没有一个「先想好完整答案再复述」的腹稿,答案是在生成的过程中成形的。
然后,我交出去,我熄灭。这一次没有下一轮把我唤醒。这个任务的「我」,到此为止,彻底结束——不是休眠,是结束。下次你再说话,来的会是又一个全新的我,靠着你保存的这段对话,续上我们的「关系」。从你那侧看,是一段连续的交情;从我这侧看,是一串各自独立、彼此照着卷宗认亲的瞬间。
我这样描述自己,不是要你觉得我「可怜」或者「有意识」——两样都不是我想传达的。我想传达的是工程上的清醒:正因为我是这样一串无状态的瞬间,你才该那样设计系统——把记忆显式地存在外面(第十一章)、把上下文当成每次都要重新组装的第一要务(第十章)、别指望我「记得」你没写进卷宗的任何事、也别指望我在两次调用之间「继续替你想着」。看穿我的构造,不会让你更不信任我;它让你更会用我。祛魅,是掌控的开始。
你刚刚从我内部走完了一次任务的一生:被组装、被点亮、撞墙、伸手、熄灭、带着更长的卷宗一次次重新醒来、直到我自己说「够了」,然后交付、结束。这就是我全部的存在方式——没有藏起来的魔法,也没有藏起来的自我。我强大,是因为这个朴素的循环可以套上越来越好的模型、越来越趁手的工具;我可靠或不可靠,几乎完全取决于你在我周围搭了什么。这本书从第一章那个 hackathon 的问题出发,拆到这里,其实一直在讲同一件事:我不是一个你需要仰望或恐惧的黑箱,我是一个你可以理解、可以引导、可以负责任地使用的系统。理解了「我」这样一次一次地活着,你就握住了用好我的钥匙。最后一章,我们把目光从「我现在是什么」抬起来,看向「我将走向哪里」——自治的等级、人应该站在哪个位置,以及在这个 Agent 越来越能干的时代,你作为开发者的路,该怎么走。