FC(Function Calling)和MCP详解(区别、作用、运用场景)
前言
我之所以记录这一块的内容,是因为在开始学习MCP的时候,网络上的各路教程我感觉都不太成熟。
在之前有过学习SpringAI的实战经验,对FunctionCalling有过研究和使用经验,在接触MCP之后,发现两者的功能和使用场景上有很多相似之处
同时,之前的笔记,我记录过对两者的理解
而现在正式开始学习MCP的时候,又有了新的理解,由此记录一下
开头直接给总结
FC是功能,MCP是协议
FC是指大模型拥有可以调用函数Tools去解决用户问题的功能
而Tools分为本地的和外部的,我之前SpringAI项目的FC就是调用本地的Tool
MCP呢就是把Tools的设计做了规定
打包到MCP Server当中,也就是抽取出来,单独的进行分布式的部署的一个外部工具的服务
用于解决,大模型应用开发,设计Tools的工作量,以及单个大模型应用的信息孤岛问题
Function Calling(后写作FC)
在通过网络上资料的具体学习之后,我对FC的整体流程有了新的理解
来看看我之前笔记对FC的理解
而在我具体项目的实现过程中,对FC的使用,可以把链路总结为以下步骤(如果对之前项目感兴趣的朋友可以看我之前的笔记)
这里简单介绍一下,我的FC主要是实现了一个可以提供用户选修课推荐,并且帮助用户挑选合适选修课,以及帮助预约的AI助手
主要工作链路如下:
用户客户端输入对话内容,传给服务器
服务器拿到对话内容,结合SystemPrompt的设置,组织好发送给大模型
大模型会先判断,对话内容需要做的任务,自己的知识库能不能完成,很明显不能完成
在不能完成的时候,大模型会通过组织好的prompt去判断调用哪个Function函数,然后去调用服务器的函数
服务器调用函数之后,获取返回值,再次发送给大模型
大模型通过函数返回值组织语言回复给用户
这里的几个关键点在于,大模型如何知道自己有哪些函数可以调用,以及什么时候去调用函数,又以什么方式入参?
这里就需要涉及到Prompt的设计以及description的设计了
Prompt设计
我们可以在Prompt当中,设计好整个服务流程,引导大模型去服务,同时,也需要处理好各种特殊情况,在Prompt当中就设计好,各种情况下,让大模型去调用具体哪个函数
@Tool、@ToolParam注解
ElectiveCourseQuery具体入参详情
Tool注解可以把每个函数,打包在提问时,组装到Prompt里面传给大模型,为后续大模型提供选择,里面的description参数可以告诉大模型,当前函数的作用
结合Prompt的设计,可以让大模型知道,具体什么情况下可以调用这个函数
ToolParam注解,可以设置description,告诉大模型,从Prompt当中通过哪些关键字去获取参数,然后设计入参
这就是FC的一个实现链路过程,但是这个过程当中,具体哪一块是属于FC的呢?
它和MCP的区别还有各自的运用场景在哪呢?不急我会继续讲
MCP(Model Context Protocol)
全称叫做模型上下文协议
看着很高大上,其实你看完就知道,他本质上不能称之为一项技术,而是一个规定
首先,我们要知道,MCP这个协议里面,规定的几个特殊名词
MCP服务器:MCP Server
首先,请各位把传统网络协议那一块的联想打住,这个Server我觉得取名其实是有一点误导性的,它其实和传统意义上的联网的服务器不是一个东西,如果要让我自己找个相似的东西,它可能叫做MCP Project更合适一点,也就是一个项目,然后这个项目符合MCP的协议
举个例子,我上面FC写的是一个可以提供查询、推荐、预约选修课的项目,这个整体,如果能让它符合MCP协议,那它就是一个MCP Server了,我们可以取名叫做 ElectiveCourseServer
也就是说,MCP Server本质上是一个独立的项目/程序/应用,相信老练的同学已经闻到了,微服务、RPC相关的气味了
Tool:MCP Server里的模块
这个Tool是什么呢?和FC里面的Tool什么关系呢?你没有想错,这俩其实是一个东西,就是函数
一个项目里面,肯定有多个函数,每个函数对应各自的功能模块,还是拿我上面的FC举例子,一个Tool是根据条件查课程、另一个Tool是根据条件查校区、还有一个Tool是帮用户预约课程,信息落库.....
一个Server里面有这个领域相关的多个Tool,例如一个天气相关的Server,可能包含根据经纬度查询天气、根据省市查询天气 等等Tool,总而言之,使用这个Server,本质上是去调用Server里面的某个Tool,设置好入参,然后获取出参,你看,是不是和FC一模一样
综上所述,我们就知道MCP是干什么的了
本质上来说,就是一个符合MCP协议的项目,之所以符合MCP协议,其实就是为了让不同的大模型,或者不同的业务模块,都可以去调用这个服务,或者说调用这个服务当中的某个Tool
FC和MCP的对比
上面简单讲了FC和MCP的理解
可能还是不太清楚两者的区别是什么
我用一张视频的截图来解释
首先我们要知道,FC去调用大模型,本质上是调用大模型提供的API
这里的OpenAI服务器,和我自己写的项目的后端服务器,本质是一个东西
用户开始会话,会话内容会和Prompt、Tool组装好,交给大模型
大模型自身知识库无法解决,提取会话内容里面的信息,按照Tool设置的description组装参数,返回给服务器,让服务器调用某个Tool
Tool返回信息后,重新交给大模型
所谓的Function Calling,本质上是一种功能
指的是,某个大模型支持接受由Prompt和Tool等信息组装好的内容
然后分析Prompt的内容,Tool里面的要求,组装参数进行返回的这个功能
也就是图中蓝色框的区域
但是,各种大模型,以及每个人的编码习惯不统一,写项目以及项目里各个模块的章法不同,开发和复用率就很低
MCP就是一个规范的协议
还是拿上面我自己写的选修课这个服务来说,是按照SpringAI的规则来写的,也只支持本地调用,本质上是一个本地的Service
如果我其他项目,想要这个服务,需要把代码copy过去,包括各种配置啥的,复用性差
而如果我的这个选修课服务,满足MCP的规范,那么其他项目就可以通过调用MCP的方式,去调用我这个写好的服务
也就是说,其实我自己写的选修课服务,本质上也是个Server,只不过不是MCP Server
一个MCP Server,满足MCP协议,可以让其他项目复用
现在网上也有各种各样的开源MCP Server,学习了如何使用就可以复用了
还有一个好消息,SpringAI的FC开发,其实很多东西和MCP的协议是一模一样的,所以说,只需要稍微学一下,MCP就可以掌握了