简介:本文系统对比大模型应用中极易混淆的三个概念:Function Call(能力调用机制)、Skills(能力管理抽象)与MCP(标准化互联协议),从技术层级、状态管理、扩展性、安全治理等维度剖析相同点与核心差异,并结合典型场景给出选型建议与迁移注意事项,帮助开发者分清“模型如何输出参数、工具如何统一管理、系统间如何互通”三类问题,做出正确的架构决策。
在构建基于大语言模型(LLM)的应用系统时,“让模型调用外部能力”是绕不开的环节。无论是查询天气、检索知识库,还是执行一次下单操作,都需要模型与外部系统协同完成。围绕这一诉求,行业中先后出现了 Function Call、Skills 和 MCP 三个高频概念。
这三者处于不同的技术层级,分别回答三个不同的问题:
混淆三者的直接后果是架构错配:有人试图用 Function Call 的机制去解决工具治理问题,导致工具数量失控、权限混乱;有人引入了重型协议却只对接两三个工具,平白增加运维负担。因此,本文把三者放在同一对比框架下,从对象定义、相同点、核心差异、场景选择到迁移注意事项逐层展开。
Function Call 是模型侧的原生能力(或推理服务暴露的接口能力),核心机制是:开发者将工具名称、参数结构(通常以 JSON Schema 描述)随请求传入,模型在合适的时机输出一段符合 Schema 的结构化数据,由外部代码解析并执行,再把执行结果回传给模型继续生成。
需要强调:模型并没有真的“学会调用函数”,它只是通过训练或提示工程,被引导生成一段格式正确的文本。执行权始终在外部系统手中,工程上应将其视为结构化生成任务。
Skills 通常是应用层或平台层(例如某低代码智能体开发平台、早期智能体框架)对工具能力的封装。它的关注点不是“模型怎么输出参数”,而是“工具作为一类资产怎么被管理”,典型要素包括:
在实际落地中,主流云厂商的智能体开发能力(如百度智能云提供的智能体与应用编排类通用能力)普遍采用了这种 Skills 化封装思路,把调用机制、权限、版本与流程编排统一收敛到平台层,让业务开发者无需关心底层模型的输出细节。
MCP(Model Context Protocol,模型上下文协议)是近期由行业头部模型厂商推动的开放协议,定位是解决模型与数据源、工具之间的标准化连接问题。它定义了一套通用的 Client-Server 架构:
MCP 的价值不在“更聪明的调用”,而在“更标准化的互通”——任何支持该协议的客户端,理论上都能接入任何实现该协议的服务端,工具生态得以跨系统复用。
尽管层级不同,三者存在明显的共同基础:
一个直观类比:Function Call 像函数签名与调用约定,Skills 像依赖管理系统,MCP 像统一的通信协议。
Function Call 本身是无状态的:模型输出参数后,执行权交给外部系统,模型不感知执行细节。这带来两个工程痛点:一是执行失败后的重试,需要把错误信息回传给模型再决策;二是多轮对话中“已经调用过什么、结果是什么”的状态保持,需要外部系统维护。Skills 层通常引入执行状态机与工作流上下文,把状态管理固化下来;MCP 则在协议中定义会话生命周期与能力协商,使状态管理有章可循。
Function Call 改造成本最低:定义 Schema、写执行函数、处理回传即可,适合快速原型;Skills 需要按平台规范组织工具并学习其权限与编排模型,成本中等;MCP 需要实现或引入协议客户端/服务端、处理握手与能力协商,初期成本最高,但换来生态互通。
Function Call 的权限控制完全由应用侧自建,灵活但容易遗漏;Skills 由平台层提供统一权限模型与版本管控,治理能力强;MCP 在协议层提供标准化鉴权与能力边界协商,安全责任分布在客户端与服务端两侧,需共同落实。运维重心也各不相同:Function Call 关注解析成功率与重试策略,Skills 关注版本、权限审计与编排调试,MCP 关注服务端可用性、协议版本兼容与连接治理。
Function Call 是三层中的地基,有必要展开其实现细节。
早期 Function Call 依赖“先生成、再后处理解析”,JSON 格式错误率较高(引号缺失、枚举值拼错等)。主流改进做法是在解码阶段直接介入:把工具的 JSON Schema 转换为一棵语法规则树,每一步解码时限制模型只能生成合法 token。示意性伪代码如下:
schema = {"name": "get_weather","parameters": {"type": "object","properties": {"location": {"type": "string"},"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}},"required": ["location"]}}grammar = build_json_grammar(schema) # Schema → 语法规则树for step in decode(model, prompt):allowed = grammar.allowed_tokens(state) # 当前状态下合法的 token 集合token = sample(step, mask=allowed) # 只在合法集合内采样state = grammar.transition(state, token)
当模型生成到 unit 字段时,解码器强制其只能在 celsius 与 fahrenheit 对应的 token 序列中选择,从机制上消除这类解析失败,而不是事后报错。
无状态特性要求工程侧自行补齐两件事:
第一,幂等设计。 对下单、扣款、发消息等有副作用的操作,必须设计幂等键(如请求 ID + 工具名 + 关键参数摘要),避免重试造成重复执行;是否重试、重试几次,应在应用侧有明确策略,而不是简单把错误抛回模型。
第二,错误回传与再决策。 例如用户说“帮我订一张明天去北京的票”,模型调用订票工具后工具返回“库存不足”。合理做法是把结构化的错误信息(错误码、原因、可选项)回传给模型,让模型决定是推荐临近时段、更换方案,还是向用户说明情况。错误回传的信息设计会显著影响模型的再决策质量。
回到标题的问题——Skills 的本质是什么?可以概括为一句话:Skills 是把“工具”从一段 Schema 描述升级为“可治理的能力资产”的抽象层。其核心要素包括:
一句话总结:Function Call 解决“能不能调”,Skills 解决“管不管得住”。
| 维度 | Function Call | Skills | MCP |
|---|---|---|---|
| 技术层级 | 模型推理层 | 应用/平台层 | 协议层 |
| 核心问题 | 模型如何输出结构化参数 | 工具如何被统一管理 | 系统间如何标准化互通 |
| 状态管理 | 无状态,需外部补齐 | 工作流状态机 | 会话生命周期 |
| 扩展性 | 受上下文长度约束 | 平台注册与检索 | 动态发现,面向生态 |
| 接入成本 | 低 | 中 | 初期较高 |
| 安全治理 | 应用自建 | 平台统一权限模型 | 协议级鉴权+服务端权限 |
| 典型使用者 | 应用开发者 | 平台/团队 | 生态建设者 |
| 适合规模 | 少量工具、快速验证 | 中等规模、多角色协作 | 大规模、跨系统互联 |
Function Call、Skills 与 MCP 并非三选一的竞争关系,而是“调用机制—管理抽象—互联协议”三个层级的分工:Function Call 是地基,把调用意图变成结构化数据,配合语法约束解码与幂等设计即可稳定可靠;Skills 是治理层,把工具变成可管理的能力资产;MCP 是生态层,用统一契约解决跨系统互通。选型的正确姿势是先定位自己真正要解决的问题属于哪一层,再决定在该层投入多少自建、引入多少平台能力——分清层级,才不会用错工具。