好久没写技术文章了,最近在学习一些智能体相关的内容,想着可以正好边学边梳理,写个智能体的系列。
还是先梳理下大背景:2023年底,ChatGPT突然爆火,宣告着LLM进入大跨越的发展时代。而近一年来,智能体的概念则开始悄然兴起(如OpenClaw),并以一种新的形态进入人们的日常生活。

在这个过程中,各种新概念也如雨后春笋般涌现,如:工具调用、Skills、MCP、记忆治理等等,令人目接不暇。
对于这些新概念,也是众说纷纭。有的人觉得这些概念是换汤不换药,有的则认为各个概念背后都对应了一套细分场景。
但可以说的是,在现在的主流智能体架构中,确确实实是都用上了这些概念。
要理解智能体的架构、运作原理以及未来发展,我们就需要先去梳理一下这些个概念,他们究竟是什么含义,为了满足什么需求,这背后的进化路线又是怎样的。


我们先从LLM(大语言模型)说起。LLM是Agent的里的模型部分,它就像是一个超强大脑,你向它提问,它给你回答。
你问他为什么鳗鱼被视为一种特殊的生物,它会告诉你是因为它极端的生命周期和至今未被破解的生殖谜团,还能向你介绍从亚里士多德到弗洛伊德是怎么在鳗鱼研究上遭遇滑铁卢的。
你问他中国历史上的贵族跟欧洲历史上的贵族有何不同,他能从欧洲的封建制聊到中国的科举制。

所以LLM是非常强大的,但是它有两个非常突出的特点:
1.没有记忆:其实把LLM比喻成超级大脑还不太贴切,因为超级大脑都是记忆力超群的,而它不但不超群,甚至是完全没有记忆。
你刚问完鳗鱼的问题,觉得它回答得挺好,然后你说刚才说得不错,你把刚才说的这些总结成一篇800字的论文吧,它说不好意思,我刚说什么了来着?(当然现在大家使用上感觉不到这一点,因为用户其实不是直接接触模型)
2.无法行动:它是个超强大脑,但它没有四肢,只有思考能力,没有行动能力。你说你写一篇鳗鱼的论文,通过邮件发给我导师吧。那对不起,做不到。
它可以把论文内容返回给你,但你得自己手动打开Office文件,把答案贴进去,再打开邮件,贴上附件,再手动点击按钮发送。

那么基于这两个特点,就会产生这些现象:
昨天刚把问题描述了一遍,好几百字,不小心关了窗口,今天再想问,又得描述一遍,感觉自己上班是来练打字的。
解决问题所需的核心内容已经拿到了,但自己非得手动去点开各种app,复制、粘贴、发送,感觉好像是自己在给它打工。

如果说各种眼花缭乱的概念是春笋,这些使用上的问题就是一场连绵不绝的大雨,正是这场大雨催生了这一系列的概念。
我们在网页上用大模型的时候,有时候感觉不到我上面说的那种记忆问题。比如下面这样,我第二次提问也没给前情提要,但是它也知道我前面说了什么。

这个实际上是网站服务端去做了这种聊天记录的管理。(如果你感觉岁月静好,说明有人负重前行...)
它会每次把你之前的聊天历史做一个拼接,作为下次调大模型API的输入,也就说每次真正去输入大模型的,已经是包含了对话期间的聊天历史。
但是模型的单次调用输入都是有长度限制的,随着对话轮次越来多,聊天历史越来越长,就超出这个限制了。这个时候你再直接塞,那直接就长度超限,调用失败了。
这种情况下怎么办呢?这就引入了记忆治理的概念。所谓记忆治理,说白了,核心就是保障我们的内容适中不超过大模型的长度限制,然后在这个基础上,我们再尽量通过各种策略去优化质量。

记忆也像人类一样,分短期记忆、长期记忆,短期记忆就是尽量记忆当前对话的内容。比如最差的策略,我直接抛弃前几轮的聊天(滑动窗口),这种实现起来最简单,但是质量损失可能非常严重,因为很多重要信息可能就丢失了。所以实际上各家都不会采用这种策略,而是会再去调一次大模型进行压缩。
而长期记忆就是哪怕这次对话窗口关闭了,下次聊天的时候,它依然能检索出来,能记得。
有了记忆,AI才能处理更复杂的问题,也不用我们一遍遍地重复输入。
明朝时候有一对非常著名的父子:严嵩和他的儿子严世蕃。严世蕃聪明绝顶,但是个独眼龙且体态臃肿,所以他自己是没法进入核心的权力中枢的,但严嵩是可以的,他是内阁首辅。
于是他就相当于严世蕃的耳目四肢,负责搜集信息交给严世蕃,再将严世蕃的判断决策上达天听。因此世人评价这对父子是:父倚子之“才”,子恃父之势,狼狈为奸。

实际上Agent跟LLM的关系,就好比严嵩和严世蕃的关系,即四肢与头脑。
比如上文举的鳗鱼的例子,我觉得LLM的回答已经足够好了,直接把这个作为论文发给我导师就好了,但LLM发不了邮件,而工具调用就弥补了这个短板。
最原始的一种表现形式就是我在代码里定义好一个方法,这个方法就负责发邮件。然后我告诉LLM,我提供这个发邮件的能力,如果你发现解决一个问题需要发邮件,告诉我,让我去办就行。
然后之后LLM在回答问题的时候判断需要发邮件了,它就会在回答中提供一些标记,这些标记就像朱批圣旨,程序看到了就会去进行工具调用,完成“跑腿”的工作:

伪代码大概长这样:

可以说,工具调用是Agent的基石,具备了工具调用的能力,AI才真正从一个玩具变成了一个能干活的助手。
有了工具调用,解决了干活能力从0到1的问题,但是众所周知资本永不眠,对效率提升的追求是永无止境的,很快又会有新的问题:
比如重复造轮子。张三在项目A里为了实现发邮件写了100行代码实现发邮件的工具,李四在项目B里为了实现同样的功能又得再写100行类似的代码。以及因缺乏标准而延伸的N*M的组合关系,想象有10个Agent, 20种工具,会延伸出200种对接代码。
这些都会影响交付的效率,资本要你三更交付,哪能留你到五更,所以MCP(Model Context Protocol)就出现了。MCP做的就是提供一种标准,就像USB接口一样,让任何支持这种标准的Agent都能直接连上。
有了这样的标准后,就可以把组合数从N×M缩减为N+M,并且能方便地在标准之上搭建生态,大家可以把自己造好的轮子发布上去,或者下载别人造好的轮子,就不用重复造轮子了。

基于MCP 构建的就叫MCP Server,有了它,就可以更方便地复用别人的劳动成果了。

那工具跟MCP Server是什么关系呢?可以简单理解为,MCP Server是一组工具。其内部包含了若干个遵循MCP协议规范的工具。
搞清楚工具调用、MCP Server了,那为什么还需要Skills呢,它跟他们又是什么关系呢?
原因是从我们现实中要解决的问题到我们理解上的工具/工具箱,这之间是有一些空白区域的。
比如我们现实中要解决的问题往往不是简单地给个地址发个邮件那么简单,而是要基于一个主题一直和对方进行讨论、交流,里面涉及翻阅历史邮件,下载附件,什么时候结束话题,投递失败时怎么做等等。
这涉及到的一系列工具和情景,里面有很多的判断和操作节点,如果这些节点都交由大模型自己去判断的话,不确定性就高了,产出质量也就难以保障。
所以这就是Skills发挥作用的地方,它会提供一套解决一类问题的SOP(标准化流程),来填补这中间的空白区域。
比如下面是一个Skills的例子:

Skills内容一般都比较长,如果全都扔进模型里的话,模型的处理质量就会急剧下滑。
所以它里面其实分两个结构,可以理解为是介绍跟具体内容。介绍是为了让模型知道这个skill能干嘛(即例子中name, description这部分),而当模型觉得需要的时候,才会去加载它的具体内容。

有了“记忆”,有了“四肢”,AI就从聊天工具进化成一个能思考、能行动的超级战士了,但离这个超级战士能为我所用,还有些距离。
比如操作上得方便,不能说这个超级战士名字叫博尔济吉特·鄂勒哲依忒木尔额尔克巴拜,然后得每次叫他全名才能干活。所以我们需要能够让它能够方便地操作,这就需要一个好用的操作界面。
此外,越方便的东西往往越危险。执行任务时智能体理解错了导致把自己的重要文件全删完了肯定也不行。(图为meta安全总监被OpenClaw清空邮件)

所以我们还需要引入安全模块,比如沙箱机制。然后这么多模块,我们得想办法怎么把他们组织起来,让他们能各司其职。
所以现在我们就一步步地,对于一个智能体应该是什么样的,具备哪些模块,该如何运转有了一个初步的认识或者观点了。在后续的文章中,我们就可以带着这样的观点,去看现实中的智能体是怎么实现的。