它说“我查一下”,可它根本上不了网|Agent 内部 02

#Agent 内部发生了什么#AI 产品#Agent

上一篇 Tenon 里那个助手 Neva,到现在还只会一件事:你说一句,它答一句。

假设你正在 Tenon 里整理一份 AI 工具对比的笔记,写到一半,顺口问 Neva:「ChatGPT Plus 现在多少钱一个月?」

这种问题,一个纯粹的聊天机器人很难答好。它的知识停在训练那一刻,价格、版本号、今天的新闻这类东西,训练完之后随时在变。它要么拿一个可能过时的旧数字硬答,要么老实说”我不确定最新价格”。

但你大概也见过更利落的:它说一句”我查一下”,停顿一下,然后给你一个像是刚核对过的回答。看起来,它上网搜了一圈。

可问题是——模型根本上不了网。

它不会动手,只会开口

模型被训练出来之后,就是一个封闭的引擎:会读你给的字、会写出回答,但没有手、没有网线,碰不到外面的世界。那句”我查一下”,它到底是怎么做到的?

靠的是产品给它配的一个工具(Tool),比如搜索。但关键在于:模型不会自己去执行工具,它只会”开口请求”。

具体到一轮里,事情是这样的:你问了一个需要最新信息的问题,模型这一轮没有直接作答,而是吐出一个请求——“我要用 search,去查 ‘ChatGPT Plus 价格’“。它能做的,到这儿就为止了。

接着轮到系统出场——就是你所用产品背后那套代码。系统看到这个请求,替它去真的执行搜索,把搜到的结果写成文字,放回模型眼前。下一轮,模型读到这些结果,才给出最终回答。

所以”它帮我查了”的真相是:它开口,系统动手,结果再回到它眼前。 它自己始终没碰过网络。

每一轮,都是一个全新的请求

这一来一回,看起来像 Neva 在”连续地想、连续地做”。但拆开它内部,会撞见一个反直觉的事实:模型并没有”连续”。每一轮,都是一个从头组装的全新请求。

每一轮,都是系统重新组装出来的全新请求
第 1 轮请求 Messages system: Neva 的设定… user: ChatGPT Plus 现在多少钱?
第 1 轮之后 模型回应 assistant: 我要查 → web_search 系统执行 tool result: 搜索结果
第 2 轮请求(全新) 系统重新组装后的 Messages system: Neva 的设定… user: ChatGPT Plus 现在多少钱? assistant: web_search tool result: 搜索结果
最终回答 基于第 2 轮这份完整材料给出

第 1 轮,发给模型的请求里只有 System Prompt 和你的问题;模型读完,吐出一个 web_search 请求就停了。然后系统执行搜索,拿到结果。

到第 2 轮,模型并不是”接着上一轮往下想”——上一轮对它来说已经结束了,它什么都没记住。是系统把 System Prompt、你的原始问题、上一轮那个 web_search 请求、还有搜来的结果,整个重新打包成一个全新的请求,再发一次。模型这才像是”看到了搜索结果”,给出回答。

如果第 2 轮模型觉得还不够(比如想再核一个细节),它会再吐一个请求,于是有了第 3 轮——同样是系统把前面的一切重新组装好,从头发一遍。一轮、两轮、三轮……每一轮都是独立的、全新的请求。

所谓”循环”,就是这么转起来的:模型负责”想下一步干嘛”,系统负责”动手、并把发生过的一切重新组织进下一轮”。Neva 看起来在连续地干活,其实它每次睁眼,面前都是一份系统刚替它码好的新材料。

这一圈,就是 agent 的分界线

上一篇结尾说过,聊天机器人和 agent 的差别,在于 agent 能”自己动手、看结果、再继续”。现在你看到了这个”动手”具体长什么样:它不是真的动手,而是开口请求 → 系统执行 → 结果回到眼前 → 它接着想,这一圈转完,才有了最终回答。

业界给这个圈起了个名字:ReAct(Reason + Act,想一步、做一步,做完再想)。名字不重要,重要的是那个形状——会转圈的,才是 agent;只会一来一回的,还是聊天机器人。

而所谓”最简单的 agent”,配方就这么点:上一篇那个聊天机器人,加一个工具,加上这个”做了再看、看了再想”的循环。仅此而已。

接着往下拆

这一篇里,模型只用了一个工具、转了一两圈。可现实的问题往往没这么轻:你给它的不是一个搜索词,而是一份两百页的文件、一整个文件夹;它要做的也不只是”查一查”,还可能是动手改、动手建。工具一多、材料一大,新的麻烦就跟着来了——那是后面几篇的事。

但无论转多少圈、用多少工具,都跑不出这一篇的这句话:

它自己不动手,只开口请求;系统替它做、把结果递回,它再接着想。这一圈一圈,就是 agent。

← 返回文章列表