【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?
文章目录
- 背景:什么是Agent?
- 背景:为什么需要Function Calling或者MCP?
- Function Calling和MCP在用户请求中的整体流程
- Function Calling(函数/工具调用)
- MCP (Model Context Protocol)
- ReAct (Reasoning and Action)
- 参考资料
背景:什么是Agent?
在《LLM Powered Autonomous Agents》中有这样一张图,描述了Agent和tool、planning、action、memory的关系。
Agent是一个智能体,具备自主决策和执行任务的能力。比如Agent可以根据用户的需求,自动选择合适的工具和数据源来完成特定的任务。Agent也可以被看作是一个“项目经理”,负责协调和管理各种资源和工具,确保任务能够高效地完成。比如一个旅游规划Agent可以利用MCP 调用航班查询、酒店预订、天气API等服务,为用户规划个性化的旅行行程。
背景:为什么需要Function Calling或者MCP?
预训练大模型是具有知识的时效性的,所以超过其知识范围的问题会无法回答。此时如果允许去调用外界的函数(比如在线查询天气),那大模型就具有了回答这些问题的能力。
Function Calling和MCP在用户请求中的整体流程
总体流程如下,用户提出请求,传到服务器,服务器会将用户请求&可用工具列表一起发送给大模型(或API),大模型会返回选择调用的工具给服务器,然后服务器会进一步调用该工具,返回工具执行结果给大模型做最后的答案整理。
值得注意的是,下面蓝框是Function Calling,红框是MCP:
- Function Calling:指大模型具有“解析工具列表、挑选工具名称并给出工具参数、解析工具执行结果”的这一系列能力!所以说Function Calling是定义了大模型的一种能力。
- MCP:定义了一套规范的、可以更好地让大模型调用工具的协议,与大模型无关
当然红框中也可以不用MCP,这里直接用https协议或者SDK去联网查询天气信息即可。MCP将在后文中讲解。
Function Calling(函数/工具调用)
Function Calling的基础实现如下,整个流程和上述一致,注意所有的上下文信息都被存储到了self.history这个列表中。
def process_user_query(self, query):self.history.append({"role": "user", "content": query})first_model_response = self.call_model()first_model_message = first_model_response["choices"][0]["message"]self.history.append(first_model_message)# 检查模型是否需要调用工具if "tool_calls" in first_model_message and first_model_message["tool_calls"]:tool_call = first_model_message["tool_calls"][0]tool_name = tool_call["function"]["name"]tool_args = json.loads(tool_call["function"]["arguments"])result = self.execute_tool(tool_name, tool_args)self.history.append({"role": "tool","tool_call_id": tool_call["id"],"name": tool_name,"content": result})second_response_data = self.call_model_after_tool_execution()final_message = second_response_data["choices"][0]["message"]self.history.append(final_message)return {"tool_name": tool_name,"tool_parameters": tool_args,"tool_executed": True,"tool_result": result,"final_response": final_message["content"],}else:return {"final_response": first_model_message["content"],}
MCP (Model Context Protocol)
MCP实现的效果也是让大模型具有借助外界工具解决问题的能力。
在MCP中,有一个实体叫做“MCP Host”(比如Cursor、Cline),还有一个实体叫做“MCP Server”(不是服务器!而是一个程序,其中包含了一系列可以使用的工具)。在下面的例子中,MCP Host用的Cline,MCP Server是天气程序,提供了天气预测和预警的两个工具。
所以可以看到,我们希望MCP具有什么外部功能,是由MCP Server这个程序所决定的,其中包含了具体可调用的工具。那么MCP Server如何实现呢?
- 第一种方式是自己手写代码实现(这个比较复杂,可以调用Python的FastMCP库去实现);
- 第二种方法是去找别人写好的MCP Server,直接安装即可!下面给了三个常用的MCP Server网站,可以实现想要的功能(比如查询天气、网页内容抓取):
- https://mcp.so/
- https://mcpmarket.com/zh
- https://smithery.ai/
到这里我们更加可以意识到一个事情:MCP协议是和大模型无关的,或者说大模型无需感知到MCP协议的。而Function Calling则是定义的大模型可以去挑选工具的一种能力,是和大模型自身息息相关的。(如果理解有误,请大家指正出来🙏)
ReAct (Reasoning and Action)
ReAct框架是基于思维链(CoT)实现的,总共有三个流程:Reasoning => Action => Observation。最基本的要求是这个大模型要具备CoT的能力。
通过在prompt中告诉大模型有哪些工具可以调用(工具列表),以及每一个工具的作用是什么(工具说明书),然后要求大模型在输出的时候一步一步思考,是否需要调用提供的工具,如果需要调用工具,那么要求模型输出固定的格式,再通过编写代码的方式来调用。
下图对比了不同的大模型的设计模式,ReAct算是过程最完整的一种模式:
我理解ReAct是一种大模型的设计模式,整个过程中都是这个大模型在进行持续的Reasoning => Action => Observation过程,而没有被打断后重新去调用大模型的情况。核心就是要在prompt中提前定义清楚工具列表和工具说明书,让大模型在思考过程中去自主使用,并且action也是基于生成的代码去执行。而Function Calling和MCP应该会因为调用工具所以被打断调用,需要得到工具执行结果后重新调用大模型。最后,ReAct和Function Calling、MCP可以兼容使用。
(上面这段理解我很不确定,需要check,如有错误,欢迎指出🙏)
7.5更正:上面的说法应该不太对,ReAct虽然可以不断地Reasoning => Action => Observation去reflect,但是一旦调用了外部的工具,那肯定还是会被打断的,也就是需要将工具执行的结果拼接到上下文中,重新输入给大模型去推理。或者说是interleaved的间断过程。但如果说考虑另一种情况,某个工具只是单纯想让模型根据函数的代码内容去执行一些简单逻辑(比如文本匹配),这个工具就只需要定义清楚参数和功能,prompt里给清楚这个工具的说明,当模型挑选到这个工具时,就可以直接通过模型自身去执行了,这种情况不会被打断,上下文是存在了KV cache中。
(这么说正确吗?还需要check这里的后一种情况)
参考资料
- MCP 与 Function Calling 到底什么关系
- MCP终极指南 - 从原理到实战,带你深入掌握MCP(基础篇)
- 《一文读懂大模型三大核心技术:ReAct、Function Call 与 MCP 的奥秘》