94-Agent面试题精讲:Tool、MCP、Skill篇
前言
什么是 Function Calling ?原理是什么?
Function Calling 我的理解是这样一套机制:开发者用 JSON schema 把工具描述好传给模型,模型判断需要调工具的时候不输出自然语言,而是直接输出一段结构化的 tool_calls JSON,告诉你「我要调哪个函数、参数是什么」,你的代码拿到这段 JSON 去真正执行,把结果塞回对话,模型再生成最终答案。
整个流程本质上是两轮对话:第一轮模型说「我需要调这个工具」,你去执行,第二轮模型拿到执行结果说「答案是这个」。
我觉得最核心的设计是,模型全程只做决策,执行的事情一律由宿主代码完成,职责分得很清楚。
大模型的 Function Call 能力是怎么训练出来的?LLM 是如何学会调用外部工具的?
这道题我分两块来讲:模型怎么被训练出工具调用能力,以及训练好之后运行时是怎么工作的。
训练层面靠两个阶段:
- SFT(监督微调,Supervised Fine-Tuning):给模型喂大量「工具调用示范对话」,让它通过模仿学会「看到工具描述 -> 判断要不要调 -> 输出结构化 JSON 请求」这整套流程;
- RLHF(基于人类反馈的强化学习,Reinforcement Learning from Human Feedback):收集人类对「哪种回答更好」的判断,训练一个打分器,再用这个分数反复调整模型,让它学会什么时候不应该调工具。
运行层面,每次请求时,你的应用代码把工具描述(叫 schema,可以理解为工具的说明书)传给模型,模型如果判断需要工具,就输出一段结构化的 tool_calls JSON;你的代码拿到这段 JSON 去真正执行,把结果塞回对话,模型再给出最终答案。
有一点非常关键:模型全程只是在「下指令」,真正执行工具的是你的代码,不是模型本身。这套「模型决策、代码执行」的运行时机制,就是我们常说的 Function Calling。
什么是 MCP(模型上下文协议)?讲讲它的核心内容?
MCP 是 Anthropic 在 2024 年底推出的开放协议,我理解它主要解决的是「模型接工具太碎片化」的问题。
在 MCP 出现之前,每接一个新工具都要单独写集成代码、处理认证、适配格式,而且这套代码和具体模型强绑定,换个模型就得重写,非常繁琐。
MCP 的思路是把这件事标准化:工具提供方按协议实现一个 Server,任何支持 MCP 的 AI 客户端就能直接接进来,一次实现到处复用。
协议定义了三类能力:Tools 用于执行有副作用的操作,Resources 是只读数据,Prompts 是提示词模板,底层通信用 JSON-RPC 2.0。
我把它理解成给「AI 接工具」这件事定了一套行业标准。
MCP 由哪几部分组成?
MCP 由三层组成,可以从角色、能力、协议三个维度来理解。
角色层有三个:Host 是 AI 应用本身(比如 Claude Desktop),Client 是 Host 里负责和 Server 通信的模块,Server 是工具提供方实现的独立进程,一个 Host 可以同时连多个 Server。
能力层定义了 Server 能暴露三类东西:Tools 是有副作用的操作(比如创建文件、调 API),Resources 是只读数据(比如读取文档内容),Prompts 是预定义的提示词模板。
协议层是底层通信:消息格式统一用 JSON-RPC 2.0,传输方式支持 stdio(本地子进程通信)和 Streamable HTTP(远程 HTTP 连接)两种,早期的 HTTP+SSE 双端点方案在 2025 年 3 月的规范更新里被标记为 deprecated。
这三层合在一起,就是 MCP 的完整组成。
MCP 和 Function Calling 有什么区别?有没有实际跑过 MCP?
我理解这两者不是竞争关系,解决的不是同一层面的问题。
Function Calling 是「调用语言」,定义的是模型怎么表达「我要调哪个函数、参数是什么」;MCP 是「工具生态协议」,定义的是工具怎么标准化打包、注册和被 AI 客户端发现。
MCP 底层其实还是用 Function Calling 来触发工具调用,只是在它之上加了一套工具管理框架,让工具实现一次、到处复用。
打个比方:Function Calling 像 HTTP 请求格式,MCP 像 REST API 的设计规范加服务注册发现机制,两者是不同层次的东西。
关于实际跑过的经验,我用 Claude Desktop 配过文件系统和 GitHub 的 MCP Server,在配置文件里加几行就能用,Claude 会自动发现工具,完全不用写对接代码。
Function Calling 也属于工具调用,请问什么场景下使用 Function Calling,什么场景下使用 MCP?
如果只是给单个应用接一两个工具、场景临时、不需要复用,Function Calling 就够了,简单直接,不需要引入额外的进程和配置。
但只要工具需要跨项目或跨团队复用、或者数量多了管理麻烦、或者社区已经有现成的 MCP Server 可以直接配置,MCP 就值得上了。
判断的核心问题只有一个:这个工具会不会在这个应用之外被用到?会的话,把它封装成 MCP Server 是更长远的选择。
此外,做 Agent 系统的话更应该选 MCP,工具来源多、数量大,手写 Function Calling 的维护成本会让代码变得难以管理。
为什么有些特定的推理模型不支持 MCP 协议?
我理解根本原因是两者的生成范式有冲突。
推理模型在给出答案之前,会先跑一段完整的「思维链」,这个 thinking 过程是一次性连续生成的,不能中途打断。但工具调用天然是多轮交互:模型输出调用请求、暂停等工具执行、拿到结果再继续生成,这两种模式没法兼容。你没法在思考链跑到一半的时候暂停去等工具结果,否则之前的推理上下文全断了。
而 MCP 底层就是靠 Function Calling 驱动的,推理模型连 Function Calling 都支持不好,MCP 自然也用不了。
当然这个问题不是无解的,后来 o3 和 Claude Extended Thinking 都找到了折中方案,比如让工具调用发生在思考阶段结束之后,保证思考过程还是一次性完整生成的。
Skill 是什么?
gent Skill 是把「指令、脚本、模板」一体化打包成可复用能力包的机制,关键在于三件事:Agent 能自动发现它、按需加载它、在需要时调用里面的脚本和资源。它不只是「存 prompt」,而是一份 Agent 能自己翻阅的「操作手册 + 工具箱」。每个 Skill 是一个文件夹,里面有一份 SKILL.md 指令文件,还可以带上脚本、模板、参考文档这些资源。
它和普通 prompt 最大的区别是:Skill 能被 Agent 自动发现和按需加载,不用你每次手动输入;和 MCP 工具的区别是:MCP 给 Agent 提供外部工具和数据的访问能力,而 Skill 教 Agent 拿到这些工具和数据之后该怎么用。
Anthropic 在 2025 年 10 月推出了 Agent Skills,同年 12 月把规范作为开放标准发布出来,允许其他 Agent 平台按照这套格式来兼容 Skills 生态。
MCP 和 Agent Skill 的区别是什么?
MCP 和 Agent Skill 不是同类概念,不是竞争关系,而是互补的。
MCP 解决的是「Agent 怎么获得外部能力」,它把数据库、API、文件系统这些外部工具标准化封装成服务,Agent 通过 MCP 就能查数据、调接口、读写文件。
Skill 解决的是「Agent 拿到这些能力之后,该按什么步骤、什么标准来完成任务」,它把完成某类工作的知识和流程打包成可复用的模块。
简单记:MCP 是给 Agent 配的电脑和软件,Skill 是给 Agent 发的操作手册和 SOP。在实际系统里,两者经常同时工作,Skill 定义流程,流程中调用 MCP 提供的工具。
Function Calling、Skill、MCP 这三个有什么区别?
这三个概念在不同层次工作,不是竞争关系。
Function Calling 是最底层的调用协议,解决的是「模型怎么调函数」,模型输出结构化 JSON 告诉程序该调哪个函数、传什么参数。
MCP 在 Function Calling 之上做工具标准化,解决的是「工具怎么暴露给模型」,把数据库、API 这些外部能力封装成标准化服务,一次实现到处复用。
Agent Skill 在最上层做知识和流程的封装,解决的是「拿到工具之后按什么流程完成任务」,把执行步骤、标准、脚本、模板打包成可复用模块。
简单记就是:Function Calling 是语言,MCP 是工具箱,Skill 是操作手册。
什么是 A2A 协议?它和 MCP 协议的区别是什么?
A2A 是 Google 发布的开放协议,专门解决多个 AI Agent 之间怎么互相通信协作的问题。
我理解它和 MCP 的区别是这样的:MCP 解决的是「单个 Agent 怎么连工具和数据」,A2A 解决的是「多个 Agent 之间怎么分工协作」。
一个 Agent 通过 A2A 可以把子任务委托给另一个专业 Agent,接收方按自己的 Skill 声明承接,支持异步长任务和流式推送结果。
两者是互补的,不冲突:MCP 向下连工具,A2A 向上连 Agent,在复杂的多 Agent 系统里这两个通常都要用到。
MCP 协议通常采用什么通信方式?
CP 支持两种主要的传输方式,分别适用于不同场景。
本地场景用 stdio,Client 把 Server 作为子进程启动,通过标准输入输出通信,延迟极低,不用开端口,也没有网络安全问题,我用 Claude Desktop 接本地工具走的就是这种方式。
远程场景现在推荐用 Streamable HTTP,Server 作为独立的 HTTP 服务部署,多个 Client 可以共享同一个 Server,适合团队统一管理工具服务。
MCP 早期版本(2024-11-05 规范)的远程传输是「HTTP + SSE」双端点方案,2025 年 3 月的规范更新里被标记为 deprecated(保留向后兼容但不推荐新项目使用),Streamable HTTP 成为了推荐的远程传输方式。
不管哪种传输方式,底层消息格式都统一用 JSON-RPC 2.0,传输方式只影响「怎么传」,消息协议本身不变。
说说 WebSocket 和 SSE 通信的区别及局限性?
我觉得最核心的区别是通信方向:SSE 是服务端单向推,客户端只能接收,想发消息只能另起一个 HTTP 请求;WebSocket 是全双工,双方都可以随时主动发消息。
对于 LLM 流式输出这种「模型一直在推 token、用户只是看」的场景,SSE 完全够用,而且轻量、HTTP 原生支持、运维简单,OpenAI 和 Anthropic 的 API 用的都是 SSE。
WebSocket 的复杂性只有在真正需要双向实时交互的时候才值得引入,比如用户要在模型说话过程中随时打断。
两者各有局限:SSE 在 HTTP/1.1 下有连接数上限,只支持文本传输;WebSocket 有状态、横向扩展麻烦,还容易被企业代理或防火墙拦掉。大多数 LLM 文字对话产品用 SSE 就够了。
为什么要用 WebRTC 协议?它和 WebSocket(WS)在 AI 对话流中的核心差异是什么?
我理解核心原因是 WebSocket 基于 TCP,而 TCP 的可靠性设计在实时语音场景里反而是负担。
语音可以容忍丢包,但绝对不容忍延迟;一旦网络抖动丢了包,TCP 强制等重传,后续所有音频都得跟着等,延迟一堆积通话就卡。
WebRTC 走的是 UDP,丢包了不等重传,直接用插值算法填补,用一点点音质损失换来稳定的低延迟,延迟能控制在 50 到 150 毫秒。
另外 WebRTC 还内置了回声消除、噪声抑制、自适应码率这些语音处理能力,这些用 WebSocket 都得自己实现。
所以 OpenAI Realtime API 这类实时语音产品选 WebRTC,就是因为 TCP 根本撑不住语音场景的延迟要求。
有没有用过大模型的网关框架?网关层解决了什么问题?
我用过 LiteLLM,它是目前最活跃的开源 LLM 网关。我理解网关本质上是架在应用和模型 API 之间的中间层,主要解决几个实际问题。
第一是多模型统一接口,业务代码只调一个地方,想换模型只改网关配置,不用动应用代码;第二是 API Key 集中管理,不用每个服务都存一份,降低泄漏风险。
第三是限流和配额,可以给不同团队分别设 token 预算,防止某个团队把整个公司的额度用光;第四是成本追踪,所有请求的 token 用量都在网关记录,方便统计哪个服务最烧钱。
还有一个我觉得挺实用的能力是语义缓存,两个用户问了语义相近的问题,直接命中缓存返回上次的结果,根本不打底层模型,省钱还降延迟。