工具调用要解决什么
公开教程 · 无需登录

工具调用要解决什么

模型存在三类能力边界。工具调用为其接入外部程序,MCP 规定这段接入如何实现。本页从能力边界讲起,依次说清为什么需要一个协议、MCP 处在协议栈的哪一层、它与相近做法如何区分,最后落到本课的任务。

1模型的三类能力边界

语言模型擅长生成自然语言,但有三类任务无法独立完成。工具调用正是为这三类任务准备的。

知识存在时效

训练语料截止之后发生的事,模型无从得知。问它「最新版本」「今天」,它只能按概率续写,且常给出高置信度的错误答案,即幻觉(hallucination)。

精确计算不可靠

精确计算、单位换算、日期推算:自回归(autoregressive)逐词生成的数字并不可靠——它是在续写最可能的下一个词,并非在执行计算。这类任务应交由确定性的程序完成。

访问不到外部系统

数据库、文件系统、业务接口、网页:模型的输出止于文本,既读不到外部状态,也无法改变外部状态。

应对:把检索与计算交给外部程序

模型只负责三件事——判断是否需要调用、决定调用哪一个、把结果组织为自然语言。这就是工具调用(tool use / function calling,函数调用:让模型以结构化形式说出「我要调哪个函数、参数是什么」,由外部程序真的去调)。

需与检索增强生成区分:检索增强生成(RAG,Retrieval-Augmented Generation:先检索再让模型据此作答)补的是事实,工具调用补的是动作。第 4 课做的是前者,本课是后者。两者都向上下文中加入内容,但一个补的是「知道什么」,一个补的是「能做什么」。

2为什么需要一个协议:集成复杂度是乘积

没有协议时,每个应用 × 每个工具源都要单独编写一套适配。

三个应用接三个工具源,需要编写九套适配;再增加一个工具源,每个应用都要随之修改。工作量是两侧数量的乘积 O(M×N)。

统一协议之后,工具源只实现一次服务器端、应用只实现一次客户端,工作量降为两侧数量之和 O(M+N)。新增一侧,改动不再随另一侧增长。

同一问题此前已有两次先例:语言服务器协议(LSP,Language Server Protocol)解决「编辑器 × 编程语言」,开放数据库互连与 Java 数据库连接(ODBC / JDBC)解决「应用 × 数据库」。MCP 是这一问题在「应用 × 工具」上的答案。

没有协议:每一对组合各写一套 3 个应用 × 3 个工具源 = 9 条适配 应用 A 应用 B 应用 C 工具源 1 工具源 2 工具源 3 每接一个新工具源,每个应用都要改一遍 新增一侧,改动量随另一侧的数量增长 有了协议:各方只实现一次 3 + 3 = 6 条适配,接入新工具源不改应用 应用 A 应用 B 应用 C 协 议 工具源 1 工具源 2 工具源 3 工具源只实现一次服务器,应用只实现一次客户端 新增一侧,改动量与另一侧的数量无关 协议的价值:把适配数从乘法降成加法——这也是判断「某格式算不算协议」的标准
左边每对组合都要单独适配,右边各方只实现一次:这就是「统一协议」换来的东西。
所以协议的价值不在「先进」,而在把集成复杂度从乘积降为求和。这条也可反过来当作判据:若某种格式做不到「两边各自只实现一次」,它就不是协议,只是一份接口描述文档。

3MCP 的定位

MCP 是一份开放规范:规定宿主应用与工具服务器之间,用什么方法名、按什么报文体交换「有哪些工具」和「调用某个工具」。

通信的两端都不是模型

全称里的「模型上下文」说的是目的——为模型准备上下文;真正通信的两端都是程序:一边是宿主应用(host,承载对话的那支程序),一边是工具服务器(server,提供工具的那支程序)。模型不发报文,也不知道服务器地址与令牌。

分三层来看

能力层:服务器能暴露什么;传输层:报文靠什么传输;报文层:报文是什么形状——用的是 JSON-RPC 2.0(一种轻量的远程调用报文格式)。换掉其中一层,另外两层不必改动。

它不解决「是否应当调用」

MCP 管的是「工具从哪来、怎么接上去」;「本次是否应当调用、调用哪一个」归模型判断,「到底能不能执行」归宿主裁定。三者各管一段,不应指望协议替你做决策。

对话大模型 只收发文本 不知道有工具存在 宿主应用 持有地址、令牌与候选集 决定调不调、调哪个 MCP 工具服务器 暴露工具、执行工具 校验令牌,只认调用方 模型接口:送提示词,收回答 MCP 协议:三个方法与报文 模型与工具服务器之间没有这条边 MCP 定义的是右边那条边;大模型不在协议里,它只是结果的读者
三条边里只有中间那条是 MCP:模型与宿主之间只是普通的模型接口,模型与工具服务器之间什么都没有。
「模型调用 MCP」这个说法不成立。模型只产出「我想调什么」这段结构化内容,真正发报文的是宿主应用——模型是结果的读者,不是协议的参与方。

4与相近做法如何区分

工具接入这件事上有若干现成做法,容易混淆。按「各管一段」来区分就不会乱。

做法管的是哪一段与 MCP 的关系
函数调用(function calling / tool use)模型侧接口:模型用结构化形式表达「要调哪个、参数是什么」互补而非替代:它决定模型怎么开口要工具,MCP 决定工具从哪来
厂商私有的插件或工具格式单个厂商生态内的工具接入换一家厂商就要重写一遍;MCP 换来的正是免掉这份重写
OpenAPI(接口描述规范)+ 函数定义把已有的 HTTP 接口描述成工具接入成本低,能复用存量接口;但只有「调用」,缺少统一的发现过程与资源、提示等能力
智能体框架自带的工具抽象框架内部的工具注册与调度与协议正交:框架之内照样可以去连一台 MCP 服务器
小结:MCP 不与函数调用竞争。函数调用让模型「会开口要工具」,MCP 让工具「能被接上来」;两者结合才是一次完整的工具调用。

5本课要求:练两端

六个知识点不是一张并列清单,它们分落在一次调用的两端——工具怎么被接上来,以及接上来以后要补什么。

一端是服务器:它须正确实现协议——初始化握手、列出工具、执行工具,并对令牌做校验。协议分层与工具声明主要落在这一端,实现者决定模型能看到哪些工具、每个工具的参数结构如何。

另一端是宿主里的编排:它须正确实现循环——把工具声明交给模型、解析模型提出的调用、按结构校验后执行、把结果作为工具消息回传、控制轮次与累计次数。调用循环、信任边界、可观测性落在这一端,实现者决定哪些动作真的能发生。

交付一:一个会说协议的服务器 握手 报能力 列出工具 tools/list 执行工具 tools/call 决定模型能看到哪些工具 每个工具叫什么、要什么参数 交付二:一段会编排的宿主代码 交给模型 工具声明 校验执行 按结构核对 回传循环 有上限 决定哪些动作真的发生 留得下记录、停得下来
两端合起来才是一次完整的工具调用:服务器让工具「能被接上来」,编排让这一次调用可控、可解释、可追溯。
只做一端,另一端便无从验证:没有服务器,编排便无可调用的工具;没有编排,工具接入后无人负责授权判定与收尾。