当前位置: 首页 > backend >正文

【翻译、转载】【转载】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.xdnf.cn/news/3941.html

相关文章:

  • Linux 的网络卡
  • ST-LINKV2仿真器下载
  • Java基于SaaS模式多租户ERP系统源码
  • 四年级数学知识边界总结思考-上册
  • GCC 使用指南
  • 具身系列——Q-Learning算法实现CartPole游戏(强化学习)
  • 实时操作系统与AI Agent的协同进化:重塑人形机器人产业格局
  • 「分享」学术工具
  • vae笔记
  • P4549 【模板】裴蜀定理
  • Android第三次面试总结之Java篇补充
  • 不定长滑动窗口(求最短/最小)
  • [运维]Linux安装、配置并使用atop监控工具
  • Spring MVC常见注解详解
  • 力扣1128题解
  • sql错题(1)
  • ssh连接云服务器记录
  • 一种实波束扫描雷达角超分辨方法——论文阅读
  • Delphi创建IIS虚拟目录的方法
  • StampLock的源码详细剖析
  • SSE技术的基本理解以及在项目中的使用
  • 商场防损部绩效考核制度与管理方法
  • 【操作系统】读者-写者问题
  • Git_.gitignore文件简介及使用
  • C与指针——输入输出
  • 什么是constexpr?
  • 解决:前后端跨域请求
  • 【Redis】Java操作Redis之SpringDataRedis
  • 洛谷 P1495:【模板】中国剩余定理(CRT)/ 曹冲养猪
  • 数字化转型-4A架构之业务架构