【大模型】到底什么是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如何实现呢?

  1. 第一种方式是自己手写代码实现(这个比较复杂,可以调用Python的FastMCP库去实现);
  2. 第二种方法是去找别人写好的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 的奥秘》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90322.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CANDENCE 17.4 进行元器件缓存更新

在我从立创商城导入CANDENCE元器件后,在ORCAD放置元器件时出现了下面的错误解决办法:1、在左边找到 Design Cache文件夹,在文件夹上鼠标右击选择 Cleanup Cache2、再放置该元器件,不管这个,点击确定3、这时候成功放上…

深入理解Kafka幂等性:原理、边界与最佳实践

一、什么是真正的消息幂等性? 消息系统的幂等性经常被误解,我们需要明确其精确含义和能力边界: 1. 正确定义 Kafka幂等性保证的是:在消息传输过程中,无论因网络重试、生产者重启等故障导致的消息重复发送,B…

【RTSP从零实践】8、多播传输H264码流的RTSP服务器——最简单的实现例子(附带源码)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

【Linux】基础开发工具(3)

1. 版本控制器Git1.1 Git的简史Git 的历史可以追溯到 2005 年1。当时 Linux 内核项目的开发团队一直使用 BitKeeper 进行版本管理,但由于一位 Linux 开发成员写了一个连接 BitKeeper 仓库的外挂,BitMover 公司决定中止 Linux 免费使用 BitKeeper 的授权1…

synchronized 的使用和特性

synchronized 锁对象 普通方法 synchronized 锁普通方法时,其锁的对象是调用该方法的实例 public synchronized void method() { // 方法体 } 静态方法 静态方法的锁对象是所属的 class,全局只有一个。 public static synchronized void staticMetho…

Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)

在微服务架构中,Gin 常被用作 Web 层框架,而 Viper 用于管理配置文件,Zap 则提供高性能的日志记录功能。下面将详细介绍如何在 Gin Web 层集成 Viper 配置文件和 Zap 日志文件。 1. 项目概述 假设我们有一个基于 Go 语言的微服务项目&#…

IoTDB:专为物联网场景设计的高性能时序数据库

什么是IoTDB?IoTDB(Internet of Things Database)是一款开源的时序数据库管理系统,专为物联网(IoT)场景设计,由清华大学软件学院团队自研,天谋科技团队负责维护。它针对物联网数据的…

[netty5: MessageAggregator HttpObjectAggregator]-源码解析

在阅读这篇文章前,推荐先阅读 [netty5: ByteToMessageCodec & MessageToByteEncoder & ByteToMessageDecoder]-源码分析[netty5: HttpObject]-源码解析 100-continue 100-continue 是 HTTP/1.1 协议中的一种机制,用于客户端在发送大体积请求体…

前端学习1--行内元素 vs 块级元素(基础概念+案例实操)

一、内外边距学习:(1)简单理解:padding为内边距。padding不会影响元素的位置,只会调整元素的内容(文字)与边框之间的间距。margin为外边距。margin会影响元素在流式布局中的位置,改变…

Express + mysql2 + jwt 实现简单的登录鉴权

目前项目中使用Express 实现简单API功能,需要提供一套登录鉴权方案。这边是API侧实现 相关路由的登录鉴权。大体思路:就是,登录接口中通过jwt加密 token返回前端,前端其他接口把加密好的放入请求头Authorization中。中间件通过请求…

ReAct (Reason and Act) OR 强化学习(Reinforcement Learning, RL)

这个问题触及了现代AI智能体(Agent)构建的两种核心思想。 简单来说,ReAct 是一种“调用专家”的模式,而强化学习 (RL) 是一种“从零试错”的模式。 为了让你更清晰地理解,我们从一个生动的比喻开始,然后进行…

iTwinjs 4.10-4.11 更新

撤销更改 目前,撤销一个有缺陷的变更集的唯一方法是从 iModel Hub 中移除它,这可能会导致许多副作用(无法撤销)。一个更好的方法是在时间线中撤销变更集,并将其作为新的变更集引入。尽管这种方法仍然具有侵入性&#…

【CSS-15】深入理解CSS transition-duration:掌握过渡动画的时长控制

在现代网页设计中,平滑的过渡效果是提升用户体验的关键因素之一。CSS transitions 为我们提供了一种简单而强大的方式来实现元素在不同状态之间的平滑过渡,而 transition-duration 属性则是控制这些过渡效果时长的核心工具。本文将全面探讨 transition-d…

mysql-笔记

1. 安装mysql # 使用brew安装 brew install mysql# 查看是否安装成功 mysql -V 相关文档: mac:macOS下MySQL 8.0 安装与配置教程 - KenTalk - 博客园 Linux安装:linux安装mysql客户端_linux mysql 客户端-CSDN博客 2. 启动mysql 每次使…

Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践

Spring Boot启动优化7板斧:砍掉70%启动时间的魔鬼实践1. 延迟初始化:按需加载的智慧2. 组件扫描精准打击:告别无差别扫描3. JVM参数调优:启动加速的隐藏开关4. 自动配置瘦身:砍掉Spring Boot的"赘肉"5. 类加…

从0开始学习计算机视觉--Day08--卷积神经网络

之前我们提到,神经网络是通过全连接层对输入做降维处理,将输入的向量通过矩阵和激活函数进行降维,在神经元上输出激活值。而卷积神经网络中,用卷积层代替了全连接层。 不同的是,这里的输入不再需要降维,而…

解决阿里云ubuntu内存溢出导致vps死机无法访问 - 永久性增加ubuntu的swap空间 - 阿里云Linux实例内存溢出(OOM)问题修复方案

效果图报错通过对实例当前截屏的分析发现,实例因 Linux实例内存空间不足,导致操作系统出现内存溢出(OOM) 无法正常启动。请您根据 Code:1684829582,在文档中查询该问题对应的修复方案,并通过VNC…

Serverless JManus: 企业生产级通用智能体运行时

作者:丛霄、陆龟 概述:本文介绍如何使用 JManus 框架构建通用智能体应用,部署并运行在 Serverless 运行时,构建企业级高可用智能体应用的实践经验。基于阿里云 Serverless 应用引擎SAE 运行稳定高可用的智能体应用, 基…

MySQL的数据目录

导读:根据前面的所学知识,我们知道了InnoDB存储引擎存储数据的数据结构、存储过程,而被组织好的数据则被存储在操作系统的磁盘上,当我们在对表数据进行增删改查时,其实就是InnoDB存储引擎与磁盘的交互。此外&#xff0…

Web前端开发: :has功能性伪类选择器

:has功能性伪类选择器::has() 是 CSS 中的一个功能性伪类选择器,它允许开发者根据元素的后代元素、兄弟元素或后续元素的存在或状态来选择目标元素。它本质上是一个“父选择器”或“关系选择器”,解决了 CSS 长期以来无法根据子元素反向选择父元素的痛点…