之前写过一个介绍RAG、Function call(fc)、MCP的介绍。最近skills很火。这里再放到一起说一下。之前的文章主要是从应用层面说明,这里从原理上做一些说明。
Function Call
ChatGPT模型在发布的时候提供一个叫Function call(fc)的功能。这个功能为用户提供的能力是:本地应用调用模型的时候可以将本地的工具说明发送给模型。模型会根据用户的输入判断需要调用那个方法。然后返回给本地应用程序。本地应用程序根据模型返回调用相应的工具。然后将工具的返回值一起发送给模型。这样模型就可以反馈消息,直到模型告诉我们不用调用本地工具啦,已经得到最终结果啦。上面的这个流程开源框架都已经支持。
例如:本地应用提供两个方法。一个是查询当前时间的方法。一个是查询天气的方法。给模型发送一个消息:现在时间是多少?同时将两个方法的的描述信息发送给模型。然后模型第一次返回给本地应用的信息会说明需要调用本地查询时间的方法,然后将方法的返回值和用户的问题再发送给模型。模型就会整理成自然语言返回。
如果用户问今天的天气如何。模型第一次会返回本地应用需要调用查询时间的函数。然后将当前时间发送给模型,模型会再次返回告知本地应用将当前时间作为条件发送给查询天气的函数。本地应用调用查询天气的函数。然后将天气方法的返回值发送给模型,模型就会返回相应的信息。
以上流程提供了一个非常强大的功能,就是调用本地方法。
以上就是fc的原理。
Skills
skills和fc的原理是一致的。将skills的说明发送给模型,模型会根据用户输入的说明,反馈如何使用skills。同样本地调用skills。fc和skills对于模型来说是没有区别的。而且目前框架的实现原理都是将skills包装到模型的fc入参里面使用。以后模型会不会推出对于skills的新入参不好说。至少目前还没有。
那么fc和skills有什么区别呢?fc通常是本地应用直接调用本地的方法。但是skills通常会包装一个工具包。包括工具说明、工具脚本、关联的外部数据(图片、文档等)。有的人可能会问:不是说skills可以按需加载么?按需加载的本质是本地应用通过编辑模型参数实现的。例如我们先提供一个skills能力的说明大纲。然后模型根据说明大纲具体使用那个包。然后本地再找到包里面的具体工具说明发送给模型如何调用。模型再返回具体的使用方案。也可以告诉模型哪些可以使用哪些不可以使用。目前大多数的框架都已经内部封装了fc和skills的使用过程。
MCP
从历史来看FC、skills和MCP对于模型来说都是一致的。因为模型是在mcp概念提出之前就有的。那么当mcp刚刚出现的时候模型没有支持mcp的能力。那么如何实现mcp呢?其实很简单。就是在本地应用写一个mcp client。然后将mcp client以fc的形式发送给模型,模型反馈调用那个mcp client。然后本地应用调用mcp client访问mcp server得到结果反馈给模型,这个流程和fc是一样的。
随着mcp越来越火。而且大量的mcp都提供了公网访问的权限。那么模型也顺应发展。模型本身开始支持mcp能力。模型是如何支持mcp的呢?
首先mcp协议需要提供一个toollist方法。这个方法返回一个mcp服务提供的方法列表和方法说明。当本地应用调用模型的时候将mcp服务端的地址发送给模型,模型自主调用toollist方法得到所有服务的方法说明。然后根据方法说明和用户的输入判断调用那个方法。然后将方法的返回值和模型自身的反馈整合之后返回给本地应用程序。
这是mcp和fc的最大区别。mcp是模型直接调用,fc是本地调用。同时mcp减少了对话次数。因为fc需要模型告诉我们调用那个fc。mcp是模型自主调用
为什么模型可以直接调用呢?因为mcp是公开的协议。大家都可以根据协议访问。前提是mcp提供外网访问的能力。如果没有外网访问能力可以通过写client转成fc使用。
应用场景
下面拓展一下fc、skills和mcp的一些应用场景 想象一个场景:我们每天会使用电脑、访问浏览器。那么有没有办法让模型帮我们使用电脑呢?
模型在训练过程中已经将各种操作系统的信息加入训练数据。那么模型本身已经是一个电脑高手。我们如何让模型在我们自己的电脑上帮我们工作呢?如果写一个ssh链接的fc,入参就是执行的命令。然后告诉大模型我有一个fc可以访问电脑之后执行任何命令。我们告诉模型我们要什么?例如帮我在电脑上部署一个web服务。然后模型会不断的告诉我们执行哪些命令。我们将命令返回发送给模型。模型就会不断的反馈。直到部署完成一个web服务。通过开源框架实现一个远程访问的fc就可以让模型帮我们办公啦。是不是很兴奋。
拓展一下思路。如果未来所有操作系统不再有操作页面,只有一个对话框。大模型知道操作系统的所有使用命令。我们只要说一句话。模型就会自动的调用电脑的命令实现我们的需求。
例如:帮我整理最近三天的邮件。整理一个摘要文档发给我,同时根据摘要创建对应的工作日程定时通知我。
我们只要提供一个访问电脑的mcp并且开通最大的系统权限。模型自动的通过mcp调用本地电脑帮我完成所有的工作。或者写一个本地的fc。然后通过开源框架实现一个调用本地fc的服务。是不是模型就可以通过本地电脑帮助我们工作了。
新时代
我感觉一个新的时代要来了。从图形界面系统退化到对话界面系统。同样浏览器也退化成一个执行程序。没有操作页面。我之前安装一个命令行浏览器w3m。然后告诉模型我本地安装了w3m。你可以通过执行w3m命令实现浏览网页。我通过fc实现了一个可以查询网页信息的助手。例如查询最近的新闻、天气等。模型可以通过执行w3m命令实现。虽然是一个极其简单的功能。但是我真的特别兴奋。我相信在不远的未来会出现大模型操作系统。操作系统不是人来操作,而是模型操作。我们只需要简单的告诉他需要什么。模型就会帮助我们自动的实现所有的功能。
总结
总结一下。无论是fc、skills、mcp未来可能还会出现什么新的功能目的都是为了让模型得到外部数据或者执行一个动作。我想现有所应用的操作页面都会变成一个对话入口。我们只需要发送指令给模型帮助我们完成所有的事情。