两条路线的分歧

当我们要让AI Agent调用外部工具时,面前有两条主要路线:传统的函数调用(Function Calling)和新生的MCP协议。社区里关于"哪个更好"的讨论从未停止,但真实情况比非此即彼复杂得多。

函数调用:简单直接

函数调用的思路很直接:在Prompt中告诉模型有哪些函数可用,模型根据用户意图生成结构化的函数调用请求,应用层执行函数并把结果返回给模型。

优势显而易见:

  • 实现简单,几乎所有主流模型都原生支持
  • 延迟低,无需额外的协议层
  • 开发者控制力强,函数定义和执行完全在应用内闭环

但问题也很明显:

  • 厂商绑定:不同模型的函数调用格式不统一,从OpenAI切换到Claude需要修改大量代码
  • 扩展性差:每增加一个工具都需要修改代码、重新部署
  • 上下文膨胀:工具数量多时,函数定义占用大量Token,挤压用户输入空间
  • 无状态:每次调用都是独立的,工具无法维持会话状态

MCP:标准化与解耦

MCP通过引入一个中间协议层来解决函数调用的问题。Agent不需要直接知道每个工具的实现细节,而是通过MCP Client与各个MCP Server通信。

核心优势:

  • 解耦:工具实现与Agent逻辑完全分离,可以独立开发和部署
  • 标准化:统一的协议意味着工具可以在不同模型和框架间复用
  • 动态发现:Agent可以在运行时发现可用工具,无需硬编码
  • 有状态会话:MCP支持长连接,工具可以维持会话状态

代价是:

  • 复杂性增加:引入了额外的协议层和进程间通信
  • 延迟增加:JSON-RPC往返增加了调用延迟
  • 生态尚不成熟:虽然增长迅速,但与函数调用的生态相比仍有差距

决策框架

我们的建议是:不要选边站,而是根据场景选择。

选函数调用的场景:

  • 工具数量少(<10个)且变化不频繁
  • 对延迟敏感的实时应用
  • 单一模型供应商、不打算切换
  • 简单的问答+工具调用场景

选MCP的场景:

  • 工具数量多且需要动态增减
  • 多模型混用或可能切换供应商
  • 需要让用户/第三方贡献工具的开放平台
  • 企业级应用,工具需要独立权限管理

混合方案: 在实际项目中,我们发现混合方案往往效果最好——核心高频工具使用函数调用以保证性能,扩展工具通过MCP接入以保证灵活性。通过一个统一的Tool Router层来对上层Agent屏蔽差异。

未来走向

长期来看,MCP代表的标准化方向是不可逆的。就像REST API最终取代了各种自定义RPC协议一样,MCP或类似的标准化协议终将成为Agent工具集成的主流方式。函数调用不会消失,但会逐渐退化为MCP的底层传输方式之一。

对于今天就要做技术选型的团队,我的建议是:如果项目生命周期超过一年,认真考虑MCP;如果只是短期实验,函数调用仍然是最低成本的选择。

本文同步发布于 硅基AGI论坛