【翻译、转载】【转载】LLM 的函数调用与 MCP

来源:

https://www.dailydoseofds.com/p/function-calling-mcp-for-llms/

【代码以图像显示的是原文内容,以代码形式显示的是大模型给出的参考】


LLM 的函数调用与 MCP

在 MCP 变得像现在这样主流(或流行)之前,大多数 AI 工作流依赖于传统的函数调用 (Function Calling)

现在,MCP(模型上下文协议)正在引入一种转变,改变开发者为智能体(Agent)构建工具访问和编排的方式。

以下是一个解释函数调用和 MCP 的图示:

在这里插入图片描述

让我们深入了解更多!

什么是函数调用?

函数调用是一种机制,允许 LLM 根据用户输入识别它需要什么工具以及何时调用它。

在这里插入图片描述

它通常的工作方式如下:

  1. LLM 接收来自用户的提示。
  2. LLM 决定它需要的工具。
  3. 程序员实现程序来接受来自 LLM 的工具调用请求,并准备一个函数调用。
  4. 函数调用(带有参数)被传递给将处理实际执行的后端服务。

让我们快速看看实际操作!

首先,我们定义一个工具函数 get_stock_price。它使用 yfinance 库来获取指定股票代码的最新收盘价:
在这里插入图片描述
【参考】

# (示例 Python 代码,定义 get_stock_price 函数)
import yfinance as yfdef get_stock_price(ticker_symbol):"""获取给定股票代码的最新收盘价"""stock = yf.Ticker(ticker_symbol)# 获取历史市场数据,这里只取最近一天的数据来获取最新收盘价hist = stock.history(period="1d")if not hist.empty:return str(hist['Close'].iloc[0])else:return "无法获取股价信息。"

接下来,我们向一个 LLM(通过 Ollama 提供服务)发出提示,并传递模型可以用来获取外部信息(如果需要)的工具:
在这里插入图片描述
【参考】

# (示例 Python 代码,向 LLM 发出带工具的提示)
from ollama import Clientclient = Client() # 假设 Ollama 服务正在本地运行response = client.chat(model='llama3', # 或其他支持函数调用的模型messages=[{'role': 'user', 'content': '谷歌(GOOGL)今天的股价是多少?'}],tools=[{'type': 'function','function': {'name': 'get_stock_price','description': '获取给定股票代码的最新收盘价','parameters': {'type': 'object','properties': {'ticker_symbol': {'type': 'string','description': '股票代码,例如 AAPL 或 GOOGL'}},'required': ['ticker_symbol']}}}])

打印响应,我们得到:
在这里插入图片描述

【大模型给的参考】

// (示例 JSON 响应,包含 tool_calls)
{"model": "llama3","created_at": "...","message": {"role": "assistant","content": null, // 注意:通常内容为空,因为模型决定调用工具"tool_calls": [{"id": "call_abc123", // 调用ID"type": "function","function": {"name": "get_stock_price","arguments": "{\"ticker_symbol\":\"GOOGL\"}" // 参数为JSON字符串}}]},// ... 其他响应字段
}

请注意,上述响应对象的 message 键中包含 tool_calls,其中包含了相关细节,例如:

  • tool.function.name: 要调用的工具名称。
  • tool.function.arguments: 工具所需的参数。

因此,我们可以利用这些信息来生成响应,如下所示:
在这里插入图片描述

【大模型给的参考】

# (示例 Python 代码,处理工具调用并获取最终响应)
import jsonif response['message'].get('tool_calls'):# (这里通常需要一个循环来处理多个可能的工具调用)tool_call = response['message']['tool_calls'][0] # 简化,只取第一个function_name = tool_call['function']['name']function_args = json.loads(tool_call['function']['arguments'])if function_name == 'get_stock_price':# 调用我们定义的函数stock_price = get_stock_price(function_args.get('ticker_symbol'))# 将函数执行结果发送回 LLM 以生成最终回复final_response = client.chat(model='llama3',messages=[{'role': 'user', 'content': '谷歌(GOOGL)今天的股价是多少?'},response['message'], # 包含工具调用的原始助手消息{ # 新增一条 tool 角色消息,包含结果'role': 'tool','tool_call_id': tool_call['id'],'content': stock_price}])print(final_response['message']['content'])else:print("未知的工具调用。")
else:# 如果模型没有调用工具,直接打印其回复print(response['message']['content'])

这将产生以下输出(假设股价获取成功):
在这里插入图片描述

谷歌(GOOGL)的最新收盘价是 [获取到的股价]。

请注意,整个过程都发生在我们的应用程序上下文中。我们需要负责:

  • 托管和维护工具/API。
  • 实现逻辑来确定应该调用哪个工具以及其参数是什么。
  • 处理工具执行并在需要时进行扩展。
  • 管理身份验证和错误处理。

简而言之,函数调用是关于在您自己的技术栈内实现动态工具使用——但这仍然需要您手动连接所有部分。

什么是 MCP?

MCP,即模型上下文协议,试图标准化这个过程。

在这里插入图片描述

函数调用关注的是模型想要做什么,而 MCP 则关注工具如何被发现和使用——尤其是在跨多个智能体、模型或平台时。

与在每个应用或智能体内部硬编码工具不同,MCP:

  • 标准化了工具的定义、托管和向 LLM 公开的方式。
  • 使 LLM 能够轻松发现可用的工具,理解其模式 (schemas),并使用它们。
  • 在工具被调用之前提供审批和审计工作流。
  • 将工具实现的关注点与消费(使用)分离开来。

让我们通过集成 Firecrawl 的 MCP 服务器,在 Cursor IDE 中利用其抓取工具来快速了解其实际应用。

为此,请转到 设置 (Settings) → MCP → 添加新的全局 MCP 服务器 (Add new global MCP server)。

在 JSON 文件中,添加如下所示的内容👇

在这里插入图片描述

完成后,您会发现 Firecrawl 的 MCP 服务器公开的所有工具都可供您的智能体使用!

在这里插入图片描述

请注意,我们没有编写一行 Python 代码来集成 Firecrawl 的工具。相反,我们只是集成了 MCP 服务器。

接下来,让我们与这个 MCP 服务器交互。

如下方视频所示,当我要求它列出我博客中 CrewAI 工具的导入语句时:

【大家去原网址去看吧】
https://www.dailydoseofds.com/p/function-calling-mcp-for-llms/#what-is-function-calling

它:

  1. 识别出 MCP 工具(抓取器 scraper)。
  2. 准备了输入参数。
  3. 调用了抓取工具。
  4. 使用该工具的输出来生成响应。

所以换句话说——可以把 MCP 看作是基础设施

它创建了一个共享的生态系统,其中工具被视为标准化的服务——类似于传统软件工程中 REST API 或 gRPC 端点的工作方式。

结论

关键点在于:MCP 和函数调用并非相互冲突。它们是同一工作流的两个方面。

  • 函数调用帮助 LLM 决定它想做什么。
  • MCP 确保工具可靠可用、可发现且可执行——而无需您为所有东西进行自定义集成。

例如,一个智能体可能会通过函数调用说:“我需要搜索网页”。

该请求可以通过 MCP 进行路由,以从可用的网页搜索工具中进行选择,调用正确的工具,并以标准格式返回结果。

如果您不了解 MCP 服务器,我们最近在新闻通讯中介绍了它们:

  • 图解 MCP 服务器
  • 构建 MCP 服务器
  • 由 MCP 驱动的 Agentic RAG

轮到您了:您对函数调用和 MCP 有何看法?

感谢您的阅读!

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

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

相关文章

【QT】QT中http协议和json数据的解析-http获取天气预报

QT中http协议和json数据的解析 1.http协议的原理2.QT中http协议的通信流程2.1 方法步骤 3.使用http协议(通过http下载图片和获取天气预报信息)3.1 http下载网络上的图片(下载小文件)3.1.1 示例代码3.1.2 现象 3.2 获取网络上天气预报3.2.1 免费的天气预报…

hot100:链表倒数k个节点- 力扣(LeetCode)

题目: 实现一种算法,找出单向链表中倒数第 k 个节点。返回该链表中倒数第k个节点。 示例一: 输入:{1,2,3,4,5},2 返回值:{4,5} 说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。 …

Spring AI 实战:第十一章、Spring AI Agent之知行合一

引言:智能体的知行辩证法 “知为行之始,行为知之成”,王阳明的哲学智慧在AI时代焕发光彩。智能体(LLM Agent)的进化之路,正是"认知-决策-执行"这一闭环的完美诠释: 知明理:融合大语言模型的推理能力与知识图谱的结构化认知行致用:基于ReAct模式的动态工具调…

365打卡第R6周: LSTM实现糖尿病探索与预测

🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 🏡 我的环境: 语言环境:Python3.10 编译器:Jupyter Lab 深度学习环境:torch2.5.1 torchvision0…

W-TinyLFU缓存驱逐算法解析

文章目录 1. 背景与概述1.1 什么是缓存驱逐算法1.2 W-TinyLFU 的定义与价值 2. 核心思想与设计理念2.1 时间局部性与频率局部性的结合2.2 高效的频率统计2.3 窗口机制的引入 3. 架构设计与组件3.1 整体架构3.2 窗口缓存(Window Cache)3.3 主缓存&#xf…

[特殊字符] 人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总) [特殊字符]

Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 所谓 "语言模型",就是只用来处理语言文字(或者符号…

文章记单词 | 第60篇(六级)

一,单词释义 liar:英 [ˈlaɪə(r)];美 [ˈlaɪər];n. 说谎者verbal:英 [ˈvɜːbl];美 [ˈvɜːrbl];adj. 言语的;文字的;口头的;动词的comprehension&…

AI日报 · 2025年04月30日|OpenAI 回滚 GPT-4o 更新以解决“谄媚”问题

过去24小时,全球人工智能领域持续快速发展。从模型行为调整到平台工具更新,再到行业安全规范的探讨,以下是为您精选的重点动态: 1、OpenAI 回滚 GPT-4o 更新以解决“谄媚”问题 针对用户反馈最新版 GPT-4o 模型表现出过度“谄媚…

Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试

始终报错 . 补充链接 tinfo 库时报错软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本 没有可用软件包 tinfo-devel。 无须任何处理 make LDLIBS“-lncurses"报错编译时报错make LDLIBS”-lncurses" ? /opt/rh/devtoolset-11/roo…

FPGA----基于ZYNQ 7020实现EPICS通信系统

1、本实验过程来自博b站大神《神电测控》,原文地址: EPICS实战(上位机篇):基于LV ZYNQ实现的EPICS通信系统(大物理) - 哔哩哔哩https://www.bilibili.com/opus/933476043369480224EPICS实战(下位机篇):基于LV ZYNQ实现的EPICS通信…

实验四 增强型可靠文件传输系统

一、实验目的和任务 掌握基于队列的多文件传输机制理解断点续传的实现原理学习文件传输完整性保障方法 二、实验内容 基础功能验证 单文件传输功能测试服务器状态监控测试传输日志记录验证 新增功能实现 多文件队列传输功能断点续传支持 三、实验步骤 4.1 客户端功能扩…

网络Tips20-003

1.E1载波的控制开销占2/32*100%6.25%,E1载波的基本帧传送时间是125uS。 2.计算机在一个指令周期的过程中,为从内存读取指令操作码,首先要将.程序计数器(PC)的内容送到地址总线上 3.3DES算法:密码学中,3DES是三重数据加密算法通称…

【MySQL】索引(重要)

目录 一、索引本质: 索引的核心作用 索引的优缺点 二、预备知识: 硬件理解: 软件理解: MySQL与磁盘交互基本单位: 三、索引的理解: 理解page: 单个page: 多个page&#x…

【深入浅出MySQL】之数据类型介绍

【深入浅出MySQL】之数据类型介绍 MySQL中常见的数据类型一览为什么需要如此多的数据类型数值类型BIT(M)类型INT类型TINYINT类型BIGINT类型浮点数类型float类型DECIMAL(M,D)类型区别总结 字符串类型CHAR类型VARCHAR(M)类型 日期和时间类型enum和set类型 …

数字化时代下,软件测试中的渗透测试是如何保障安全的?

在如今数字化与信息化的时代,软件测试中存在渗透测试,其位置十分重要,它借助模拟恶意攻击的方式,去发现软件系统所存在的漏洞以及安全问题,这是保障软件安全的关键环节,接下来我会对它的各个方面进行详细介…

Pytorch - Developer Notes 1/2

文章目录 自动混合精度示例典型的混合精度训练处理未缩放梯度梯度裁剪 处理缩放梯度梯度累积梯度惩罚 处理多个模型、损失函数和优化器多 GPU 工作环境下的注意事项单进程中的DataParallel分布式数据并行:每个进程对应一个GPU每个进程使用多块GPU的DistributedDataP…

RuntimeError: CUDA error: __global__ function call is not configured

表明在 CUDA 设备上调用的核函数 没有正确配置线程块和网格维度。 一般体现在: 直接调用 kernel 函数,而不是通过 launch 函数 指定 kernel 函数调用 解决方法(示例): // kernel function __global__ void Idtest_k…

cloudfare+gmail 配置 smtp 邮箱

这里介绍有一个域名后,不需要服务器,就可以实现 cloudfare gmail 的 邮箱收发。 为什么还需要 gmail 的 smtp 功能,因为 cloudfare 默认只是对 email 进行转发,就是只能收邮件而不能发送邮件,故使用 gmail 的功能来进…

如何在 CentOS 7 命令行连接 Wi-Fi?如何在 Linux 命令行连接 Wi-Fi?

如何在 CentOS 7 命令行连接 Wi-Fi?如何在 Linux 命令行连接 Wi-Fi? 摘要 本教程覆盖如何在多种 Linux 发行版下通过命令行连接 Wi-Fi,包括: CentOS 7、Ubuntu、Debian、Arch Linux、Fedora、Alpine Linux、Kali Linux、OpenSU…

基于PHP的在线编程课程学习系统

有需要请加文章底部Q哦 可远程调试 基于PHP在线编程课程学习系统 一 介绍 在线编程课程学习系统基于原生PHP开发,数据库mysql,前端jquery.js。系统角色分为学生,教师和管理员。(附带参考设计文档) 技术栈:phpmysqljquery.jsphps…