让 AI 智能体获得完成任务所需的知识,除了其训练数据中已有的知识外,还有不同的方法。让我们来看看其中四种:技能(Skills)、MCP、RAG 和记忆(Memory),并定义在不同的情况下哪些方法最合适。假设我们有一个 Web 应用程序,当我们查看这个网页时,哎呀,该网页抛出了令人头疼的“500 内部服务器错误”。我们需要修复这个问题。AI 智能体的目标正是如此,我们要解决这个错误。

直觉上,获取 AI 代理帮助以应对此 500 错误的回答似乎是尽可能多地收集上下文,然后将这些内容全部投入智能体本身的上下文中。在这个上下文中,我们可能会存储大量的运行手册(runbooks),也许还会传递给它一些仪表盘数据,甚至可能包含一点客户历史记录。只需将其投入上下文窗口,然后让 AI 智能体自行找出解决此错误的方法。

但这可能是一种相当低效的解决方法,因为 AI 智能体有很多机会迷失方向、走入死胡同,或者采取一种不能真正代表该特定结账页面实际运作方式的通用行为。因此,仅仅将上下文投入其中可能不是最好的方法。也许更好的方法是使用技能、MCP、RAG 或记忆,也许是以上所有方法?但我将逐一探讨如何利用这些技术让 AI 智能体解决这个网页问题。

首先,我们来看看如何使用代理技能(Agent Skills)。代理技能实际上只是一组我们可以交给智能体的指令,用于执行某类特定任务。有时它也可能附带一些代码。它会列出程序步骤以及何时遵循这些步骤的判断依据,而智能体仅在任务真正需要时才通过“渐进式披露”(progressive disclosure)机制调用这些技能。

对于这里出现的结账错误,我们可以给智能体一个我们创建的特定技能,称之为“分诊技能”(triage skill)。该技能列出了运行手册。例如,它可能说:首先,我们需要查看错误率,这是我们要做的第一件事。然后,一旦完成这一步,技能指示下一步是检查最近部署的状态。

除了步骤之外,一个好的技能还可以包含一些判断力。例如,当智能体应该停止自行探查并转而升级给人类以协助解决问题时。如果没有这个分诊技能,智能体可能根本不知道要做这些事情中的任何一件,因为这些信息并不存在于模型的训练数据中。因此,技能为智能体提供了清晰的程序以及运行该程序的判断依据。

但事情也就到此为止了。技能可以告诉智能体去检查错误率,但智能体仍然不一定能够访问仪表盘来实际读取该错误率。因此,处理获取此类数据的一种方式就是使用 MCP(模型上下文协议)。它可以连接智能体与外部世界,使其能够真正采取行动。

其工作原理是在智能体和需要访问的任何系统之间有一个标准的 MCP 协议。智能体本身被视为 MCP 主机,而它想要与之交谈的每个系统都位于一个 MCP 服务器后面。因此,这个模型本身可能完全不知道如何查询具有日志堆栈的特定后端,但该日志堆栈的 MCP 服务器知道如何连接它,并将其暴露为智能体可以调用的内容。

如果我们回到这里的 500 错误,技能指示检查错误率。有了 MCP,智能体可以访问所有这些信息:通过执行 MCP 调用获取日志;同样地获取指标;并真实读取错误率。因此,通过向另一个服务发出调用来解决获取错误率的问题。

但智能体仍然不知道这个特定网页设置的行为方式,例如什么是正常的、依赖关系是什么以及以前可能导致一些问题的原因。那么这些知识从何而来?你可能已经猜到了,它们来自我列表中的另外两样东西。让我们从 RAG(检索增强生成)开始。

其理念是,与其一开始就把所有内容塞入上下文窗口,不如让智能体仅在真正需要时从外部来源拉取所需的相关信息的某一部分。对于我们的结账错误,我们可能会将 RAG 指向我们自己的一系列文档集合,如手册或依赖关系图等。然后智能体提出问题,RAG 通过执行语义搜索来检索匹配的部分,并将相关的文本块返回到智能体的上下文窗口中。这就是 RAG。

最后要讨论的是记忆(Memory)。乍一看,记忆似乎与 RAG 非常相似,即智能体在需要时拉取相关的知识片段。但这两者之间存在差异,区别在于知识的来源。RAG 读取存储在向量数据库中的文档;这些文档是由人故意放入该向量数据库中存储的。

而记忆则是智能体自己收集并为了将来使用而存储的东西,源自之前发生的事情。例如,智能体可以回顾某种记忆,比如之前的错误情况:也许上次发生完全相同的错误时,真正的原因并不是这里运行手册中记录的内容,而是不得不通过艰难的方式摸索出来的。这种记忆可以告诉我们那种“艰难方式”是什么。

当这个讨厌的 500 错误最终被修复时,记忆也可以写回实际的修复方法。这样智能体下次就有了参考依据。因此,经验正在代理记忆中积累起来。这就是全部四种方法以及何时使用每种方法的粗略准则:如果是某人写下来的知识,那就是 RAG;如果智能体从经验中获取的知识,那就是记忆。

遵循某种可重复的程序,这就是智能体技能。如果智能体需要去实际查找世界上的某些信息,而不使用专有代码,那就可以通过 MCP 来实现。那么请告诉我,这是否反映了你如何将知识融入 AI 智能体中?请在评论区留言告知。