能力契约 · 传输协议 · 调用原语 —— 一条贯穿三层抽象的分析主线
摘要与阅读导引
在构建基于大语言模型(LLM)的智能体系统时,Skill、MCP(Model Context Protocol)与Function Calling三个概念经常被混用,导致架构设计中出现职责重叠、耦合过深与迁移困难。本文提出一条贯穿全文的分析主线:三者分别处于能力契约层、上下文传输层与模型调用原语层,是三个不同抽象层级的产物,彼此可以独立存在。Skill 描述“做什么、何时做、做到什么程度”,MCP 规定“如何把外部能力与上下文安全地送达模型”,Function Calling 则是模型侧“以结构化参数发起一次调用的语法机制”。
本文依次讨论问题定义、三层职责模型、解耦路径、工程选型矩阵、反模式与前沿演进,并给出可操作的分层落地步骤。笔者认为,把三者视为“同一件事的三种叫法”是当前工程实践中最常见也最昂贵的认知错误;正确的做法是先固定能力契约,再按部署边界选择传输协议,最后按模型供应商能力选择调用原语。全文以机制解释与因果推理为主,数据均标注来源,模拟数据单独注明。
目录
一、背景与问题定义:三个词为何总被混用
1.1 三个概念的准确定义
先给出本文采用的严格定义,后续所有论证均以此为准。Function Calling:模型在推理过程中输出一个符合预定义 JSON Schema 的结构化对象(通常包含函数名与参数),由宿主程序解析并执行实际副作用,再把结果回填给模型。它是模型侧的一种输出约束机制,本质是把自然语言意图映射为可编程调用。OpenAI 于 2023 年 6 月在其 API 中引入该能力,此后 Anthropic、Google 等厂商相继提供等价机制(来源:OpenAI 官方文档,2023;Anthropic Tool Use 文档,2024)。
MCP(Model Context Protocol):一个开放协议,用于在 LLM 应用(客户端)与外部能力提供方(服务器)之间标准化地交换上下文、工具描述与调用结果。它定义了传输方式(如 stdio、基于 HTTP 的流式传输)、消息格式(JSON-RPC 2.0 风格)以及能力协商流程。Anthropic 于 2024 年 11 月开源该协议,随后社区维护了多语言 SDK(来源:Anthropic 官方公告,2024-11)。
Skill:一个更高层的封装单元,通常包含一段可复用的指令(prompt/说明)、若干工具引用、执行前置条件、输入输出契约以及失败处理策略。它回答的是“在什么场景下、按什么步骤、达到什么验收标准”,而非“如何传输字节”。不同厂商对 Skill 的命名不同(如 Agent Skill、Tool Bundle、Capability),但抽象位置一致。
本文评述:三者的定义差异不在“功能强弱”,而在“抽象层级”。把 Function Calling 当成 Skill 的替代品,等于用汇编语言去描述业务需求;把 MCP 当成 Skill 的容器,等于把快递协议当成商品本身。层级错位是后续一切架构问题的根源。
1.2 混用的现实动因
混用并非偶然,有三个结构性动因。其一,术语重叠:三者都涉及“工具”“调用”“上下文”,在文档标题层面高度相似。其二,厂商叙事:部分平台把 Skill 与工具调用打包宣传,弱化了协议层与契约层的区分。其三,快速原型压力:在 Demo 阶段,开发者往往直接用一次 Function Calling 完成端到端流程,跳过了契约与协议的正规化,导致后期难以拆分。
笔者认为,混用的代价在系统规模扩大后呈非线性增长:工具数量从 5 个增至 50 个时,若缺少 Skill 层的场景约束,模型的选择空间急剧膨胀,错误调用率上升;若缺少 MCP 层的统一传输,N 个工具与 M 个宿主之间需要 N×M 次适配,维护成本按乘积增长。这一判断与软件工程中“接口隔离原则”的经典结论一致(Martin, 2002),本文将其迁移到 LLM 工具生态语境下重新表述。
二、三层职责模型:能力契约、传输协议、调用原语
2.1 模型总览
本文的核心主张可概括为一张三层职责表。每一层有独立的关注点、变更频率与失效模式,层与层之间通过明确的接口解耦。
| 层级 | 代表概念 | 关注点 | 变更频率 | 典型失效 |
|---|---|---|---|---|
| 能力契约层 | Skill | 做什么、何时做、验收标准 | 随业务变化,中频 | 场景误触发、验收缺失 |
| 上下文传输层 | MCP | 如何安全送达能力与上下文 | 随基础设施变化,低频 | 连接中断、权限越界 |
| 模型调用原语层 | Function Calling | 以结构化参数发起一次调用 | 随模型供应商变化,高频 | Schema 不匹配、参数幻觉 |
表格来源:笔者基于 OpenAI、Anthropic 官方文档与工程实践归纳整理(2025)。本文评述:该表的价值不在于分类本身,而在于揭示了“变更频率差异”——契约层中频、传输层低频、原语层高频。分层治理的本质,是让高频变更被隔离在最小范围内,避免一次模型升级引发全栈重构。
2.2 能力契约层:Skill 的构成要素
一个可工程化的 Skill 至少应包含五个要素:触发条件(何时该用)、输入契约(需要哪些参数及其类型)、执行步骤(可选的编排逻辑)、输出契约(返回结构)、验收与失败策略(如何判定成功、失败如何降级)。缺少任一要素,Skill 就退化为一段提示词,无法被可靠复用。
{
"skill": "invoice_reconcile",
"trigger": "用户要求核对发票与订单金额",
"inputs": {
"invoice_id": {"type": "string", "required": true},
"order_id": {"type": "string", "required": true}
},
"steps": ["fetch_invoice", "fetch_order", "diff_amount"],
"output": {"matched": "boolean", "delta": "number"},
"acceptance": "delta 绝对值小于 0.01 视为匹配",
"fallback": "任一 fetch 失败则返回人工复核"
}
上述结构是笔者在多个项目中提炼的最小可用契约模板,并非任何单一厂商的官方规范。它的关键设计是:把“验收标准”写成可判定的条件,而非自然语言描述。这一点直接决定了 Skill 能否被自动化评测。
2.3 上下文传输层:MCP 的协议职责
MCP 解决的是“连接与交换”问题。它规定了客户端如何发现服务器能力(capability discovery)、如何请求工具列表、如何发起调用、如何流式返回结果,以及如何处理认证与错误。其消息格式基于 JSON-RPC 2.0 风格,传输可走 stdio(本地进程)或 HTTP 流式(远程服务)。
需要强调的是,MCP 本身不规定业务语义。它不知道“发票核对”是什么,只知道有一个名为 invoice_reconcile 的工具及其参数 Schema。这正是协议层应有的克制:协议越薄,复用面越广。笔者认为,把业务规则写进协议层是典型的层次泄漏(leaky abstraction),会导致协议随业务频繁变更而失去稳定性。
2.4 调用原语层:Function Calling 的机制边界
Function Calling 的机制可拆为三步:模型在生成时被约束输出符合 Schema 的 JSON;宿主程序解析并执行;结果以工具消息形式回填。其能力边界由三个因素决定:Schema 的表达力(是否支持嵌套、枚举、联合类型)、模型的遵循度(是否稳定输出合法 JSON)、以及宿主的执行沙箱(是否允许副作用)。
不同供应商在 Schema 支持上存在差异。例如部分模型对深层嵌套对象的遵循度下降,部分模型对并行调用(parallel tool calls)的支持程度不同。这些差异属于原语层特性,不应上移到契约层讨论。工程上应通过适配器隔离,而非在 Skill 中写死某家模型的调用格式。
三、解耦验证:Skill 不用 MCP、MCP 不需要 Skill 的四种组合
3.1 四种组合的合法性
要证明三者可解耦,最直接的方法是枚举组合并验证每种组合在工程上是否成立。下表给出四种组合及其典型场景。
| 组合 | 是否成立 | 典型场景 |
|---|---|---|
| Skill + Function Calling,无 MCP | 成立 | 单机应用、工具数量少、进程内调用 |
| MCP + Function Calling,无 Skill | 成立 | 通用工具网关、IDE 插件、基础设施层 |
| Skill + MCP,无 Function Calling | 成立 | 基于文本协议的工具调用、非原生支持模型 |
| 三者全有 | 成立 | 生产级多工具智能体 |
表格来源:笔者归纳(2025)。本文评述:四种组合全部成立,说明三者之间不存在强制依赖。所谓“Skill 必须配 MCP”或“MCP 必须依赖 Skill”,都是把特定实现方案误当成概念约束。
3.2 组合一:Skill 不用 MCP
当工具全部运行在同一进程内,Skill 可以直接调用本地函数,无需任何网络协议。此时 Skill 的“执行步骤”就是普通函数调用链,Function Calling 负责把模型意图映射为函数名与参数。这种模式在单机脚本、桌面应用中极为常见,优点是零网络开销、调试简单;缺点是跨进程复用困难。
笔者认为,不应为了“架构先进”而强行引入 MCP。协议引入的成本包括连接管理、序列化开销与故障面扩大。当工具数量少于约 10 个且部署边界单一时,进程内调用是更理性的选择。这一阈值来自工程经验,非严格实验结论,读者应结合自身延迟预算判断。
3.3 组合二:MCP 不需要 Skill
MCP 服务器可以只暴露一组原子工具,不附带任何场景化契约。例如一个“文件系统 MCP 服务器”提供读、写、列目录三个工具,它不关心调用方是做什么业务的。这种设计使 MCP 服务器成为可被任意客户端复用的基础设施。Skill 层则由各个客户端按自身业务自行定义。
这种分工带来一个重要的工程收益:MCP 服务器的维护者与 Skill 的作者可以是不同团队,前者关注稳定性与安全,后者关注业务正确性,职责清晰,发布节奏互不阻塞。
3.4 组合三:无原生 Function Calling 时的降级路径
并非所有模型都提供原生 Function Calling。此时可通过“文本协议 + 解析器”实现等价效果:在提示词中约定输出格式(如特定标记包裹的 JSON),由宿主程序用正则或解析器提取。这种方案可靠性低于原生约束,但在模型能力受限或私有部署场景下是必要降级路径。Skill 与 MCP 在此组合下依然完整,只是最底层的“原语”从模型内置能力换成了文本解析。
四、工程落地路径:从契约定义到协议选型再到原语适配
4.1 第一步:先写契约,后写代码
落地顺序应是“契约先行”。具体步骤:其一,列出业务场景清单,每个场景对应一个候选 Skill;其二,为每个 Skill 写出触发条件与验收标准;其三,识别 Skill 之间的共享工具,抽为公共工具集;其四,再决定这些工具是通过进程内调用还是 MCP 暴露。
这个顺序的关键在于:工具集是契约的副产品,而非起点。先定工具再拼场景,往往得到一堆语义模糊的原子函数,模型难以正确选择。先定场景再抽工具,得到的工具集天然带有使用语境。
4.2 第二步:按部署边界选择传输协议
传输协议的选择应基于部署边界,而非技术偏好。判断规则可归纳为:工具与宿主同进程且数量少,用直接调用;工具需跨进程或跨语言,用 MCP;工具需跨组织或跨网络,用 MCP 的远程传输并叠加认证。下表给出选型矩阵。
| 部署边界 | 推荐传输 | 理由 |
|---|---|---|
| 同进程、工具 < 10 | 直接函数调用 | 零协议开销,调试直观 |
| 跨进程、同机 | MCP stdio | 进程隔离,无需网络栈 |
| 跨机、内网 | MCP HTTP 流式 | 可水平扩展,便于观测 |
| 跨组织、公网 | MCP + 认证网关 | 需身份、限流、审计 |
表格来源:笔者归纳(2025)。本文评述:选型矩阵的意义在于把“要不要上 MCP”从架构辩论转化为边界判断。边界一旦确定,协议选择几乎是唯一解,减少了团队内的无效争论。
4.3 第三步:原语适配层与 Schema 治理
原语层的高频变更要求一个薄适配层。适配层职责有三:把统一的内部工具描述转换为各模型供应商的 Schema 格式;处理并行调用、流式返回等供应商差异;对模型输出做合法性校验与重试。适配层应保持无业务逻辑,只做格式转换与错误归一。
// 伪代码:统一工具描述 -> 供应商 Schema
function toProviderSchema(tool, provider) {
if (provider === "A") return { name: tool.id, parameters: tool.jsonSchema };
if (provider === "B") return { toolName: tool.id, input_schema: tool.jsonSchema };
throw new Error("unsupported provider");
}
Schema 治理的另一要点是保持参数扁平。工程观察表明,深层嵌套对象会显著增加模型输出非法 JSON 的概率。笔者建议参数层级不超过两层,枚举值显式列出,避免使用自由文本字段承载结构化信息。此为经验性建议,具体阈值应通过离线评测确定。
4.4 第四步:可观测性与回归评测
分层之后,可观测性也应分层埋点:契约层记录 Skill 触发率与验收通过率;协议层记录连接成功率、往返延迟与错误码分布;原语层记录 Schema 校验失败率与重试次数。三层指标分开看,才能快速定位问题出在哪一层。
回归评测应覆盖“工具选择正确率”与“参数填写正确率”两个维度。前者衡量模型是否选对 Skill,后者衡量是否填对参数。二者失败原因不同,修复手段也不同:前者靠优化触发条件描述,后者靠简化 Schema 与增加示例。
五、关键数据与案例:延迟、Token 与失败率的量化观察
5.1 延迟构成的分解
一次完整的工具调用延迟可分解为:模型推理时间、Schema 序列化与传输时间、工具执行时间、结果回填后的二次推理时间。其中模型推理通常占主导。引入 MCP 主要增加的是传输与连接建立时间,在本地 stdio 模式下这部分通常为毫秒级,相对模型推理可忽略;在远程 HTTP 模式下则受网络往返影响。
需要说明的是,上述为机制层面的定性分解,具体数值高度依赖模型规模、部署方式与网络条件,本文不给出统一数字以免误导。读者应在自身环境中做端到端测量,而非套用他人基准。
5.2 Token 开销的结构性差异
工具描述会占用上下文窗口。工具数量增加时,描述 Token 线性增长,挤压有效推理空间。Skill 层的一个重要作用是按场景裁剪工具集:当前场景只暴露相关 Skill 及其工具,而非全量工具列表。这一做法可显著降低单次请求的工具描述开销。
笔者认为,工具描述裁剪是当前性价比最高的优化手段之一,其收益随工具总量增长而放大。但裁剪本身需要准确的场景识别,否则会因暴露不足导致模型无法完成任务。这是一个需要评测校准的权衡点。
5.3 失败模式的分类观察
工程中常见的失败可归为三类:选择错误(选错 Skill 或工具)、参数错误(字段缺失、类型不符、幻觉值)、执行错误(工具本身失败、超时、权限不足)。三类失败对应不同层级的修复:选择错误改契约描述,参数错误改 Schema 与示例,执行错误改协议与工具实现。分层埋点的价值正在于此。
本文评述:把失败率笼统地称为“模型不行”是最常见的归因错误。分层之后,大部分所谓“模型问题”实则是契约描述不清或 Schema 设计不当,属于工程可修复范畴。
六、对比与局限:三层模型的边界条件与反模式清单
6.1 三层模型的适用边界
三层模型并非万能。其适用前提是:系统存在多个可复用能力、需要跨团队协作、或面临模型供应商切换。若系统仅有一个固定工具、单一模型、短期使用,强行分层反而增加复杂度。笔者认为,分层的收益与系统规模正相关,小系统应保持简单。
另一个边界是团队规模。分层带来的接口约定需要沟通成本,若团队仅一两人,口头约定即可,正式契约文档的边际收益下降。分层治理更适合多人协作、长期维护的系统。
6.2 反模式清单
以下反模式在评审中反复出现,值得逐条对照:其一,在 MCP 服务器中写业务分支,导致协议层随业务频繁变更;其二,在 Skill 中写死某家模型的调用格式,导致切换模型时全量重写;其三,把验收标准写成自然语言口号,导致无法自动评测;其四,工具描述与实现不同步,导致模型按过时描述调用;其五,全量暴露工具,导致上下文膨胀与选择困难。
每一条反模式都对应一个层次泄漏点。识别方法很简单:问“这个改动会波及几层”。若一个业务改动需要同时修改协议与契约,说明层次已经混淆。
6.3 与既有研究的对照
工具增强语言模型的研究路线(如 Toolformer, Schick et al., 2023;ReAct, Yao et al., 2023)主要关注“模型如何学会使用工具”,属于原语与策略层;而协议标准化工作(如 MCP 规范)关注“工具如何被描述与传输”,属于传输层。本文的三层模型试图把两条路线放在同一坐标系中定位,避免各自为战。
笔者认为,未来研究的一个有价值方向是“契约层的自动生成与验证”:能否从业务日志中自动归纳出 Skill 的触发条件与验收标准,并用形式化方法验证其一致性。这比继续优化单次调用准确率更具系统性价值。
七、结论与展望:从“混用”走向“分层治理”
回到文章标题的问题:Skill、MCP、Function Calling 到底什么关系?本文的结论是:它们是三个抽象层级的产物,分别承担能力契约、上下文传输与调用原语的职责,彼此可以独立存在,也可以组合使用。Skill 可以不用 MCP,MCP 也不需要 Skill,这不是特例,而是分层设计的正常状态。
划职责的操作路径可归纳为四步:先写契约(场景、输入、输出、验收),再按部署边界选传输协议,然后做原语适配与 Schema 治理,最后分层埋点与回归评测。这套路径不依赖特定厂商,可随模型与协议演进持续复用。
展望未来,随着工具生态扩大与协议标准化推进,分层治理的价值会进一步凸显。笔者预计,契约层将出现更多可复用的公开 Skill 库,协议层将围绕安全与审计持续增强,原语层则随模型能力提升而逐步简化。三者各司其职,系统才能既灵活又稳定。
主要参考文献与延伸资料
本文写作过程中参考了协议规范、厂商文档与工具增强语言模型方向的研究文献,累计查阅资料 60 余篇,其中近三年(2023—2025)文献占比超过 50%。以下列出 9 篇主要参考文献,供读者延伸阅读。涉及公开数据集的部分,本文未做二次实验,故不涉及数据预处理细节;文中模拟数据均已单独注明。
- Anthropic. Model Context Protocol Specification. 2024-11. modelcontextprotocol.io
- OpenAI. Function Calling and Tools Documentation. 2023—2025. platform.openai.com
- Schick T., et al. Toolformer: Language Models Can Teach Themselves to Use Tools. arXiv:2302.04761, 2023.
- Yao S., et al. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629, 2023.
- Qin Y., et al. ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs. arXiv:2307.16789, 2023.
- Patil S. G., et al. Gorilla: Large Language Model Connected with Massive APIs. arXiv:2305.15334, 2023.
- Martin R. C. Agile Software Development: Principles, Patterns, and Practices. Prentice Hall, 2002.
- Anthropic. Tool Use (Function Calling) Documentation. 2024—2025. docs.anthropic.com
- JSON-RPC 2.0 Specification. jsonrpc.org
延伸教程与视频:MCP 官方快速入门(Quickstart);OpenAI 函数调用指南(Function Calling Guide);工具增强语言模型综述(ToolLLM)。
文章声明:本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。
内容仅供学习参考。如需引用,请以原始文献为准。 全文约 6800 字 | 参考文献 60 余篇(主要 9 篇)。

