ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Function Calling、MCP与A2A:AI工具调用三层架构深度解析

Function Calling、MCP与A2A:AI工具调用三层架构深度解析 如果你这段时间关注 AI 应用开发大概率会陷入一种“名词焦虑”先是 Function Calling然后 MCP 铺天盖地最近谷歌又发布了 A2AAgent2Agent协议还有各种关于 AgentScope 2.0、蓝湖 MCP、Cursor 配置 MCP 的讨论。很多人被这一串概念搞得有点乱甚至有人觉得“这不都是让 AI 调用工具吗有必要搞这么多名词吗”我自己也经历了类似的过程。最开始用 Function Calling 时觉得这已经够方便了模型能根据对话内容输出一个结构化的函数调用指令我再写代码去执行一个闭环就成了。但等真正开始做几个涉及多来源、多工具、多智能体协作的项目后才意识到 Function Calling 只是地基它解决的是“让模型能调用函数”这件事MCP 是在解决“如何让 100 个工具都能被同一个 Agent 高效接入”而 A2A 已经升级到了“Agent 和 Agent 之间怎么像两个成熟团队一样协作”。本文想把这几个概念放在一张地图里看清楚。先给出我最近比较认可的一个判断Function Calling 是能力MCP 是协议A2A 是协作框架。它们不在同一层也谈不上谁替代谁而是分别解决了“模型怎么调工具”“工具怎么接进来”“智能体之间怎么协作”这三层问题。把这层关系理顺后面选型、写代码、设计系统都会清楚很多。1. 先搞清楚每个词到底在解决哪一层的问题在聊区别之前先把三个词各自解决的最原始问题讲清楚。因为如果你只从“API 长什么样”去理解很容易把三个东西混在一起。1.1 Function Calling让模型输出结构化工具指令Function Calling 这个词严格来说不是一个协议或标准而是一种模型能力和交互方式。它解决的是“模型在生成回复时如何明确表达自己需要调用某个函数”的问题。最简单的理解方式是没有 Function Calling 时你让 AI“帮忙查询明天的天气”模型只能在文本里回答一句“我可以帮你查询但需要你打开天气 App”。有了 Function Calling 后模型会输出一个符合约定格式的结构化数据比如{ name: get_weather, arguments: { city: 北京市, date: 2025-06-09 } }这段 JSON 不是给人看的而是要交给你的程序去解析执行的。你的后端代码收到这个结构后去调用真实天气接口再把结果返回给模型模型基于真实数据组织自然语言回复。所以 Function Calling 本质上是定义了一种“模型 → 程序”的接口契约。它没有规定工具如何被发现、如何鉴权、如何标准化只是约束了模型输出一个符合 schema 的函数调用意图。1.2 MCP给工具接入做了一个统一协议层MCP 的全称是 Model Context Protocol它要解决的比 Function Calling 复杂得多。如果把 Function Calling 比作“程序里约定了一个方法签名”那 MCP 做的就是“让所有外部工具都暴露成统一资源任何 AI 应用都可以通过同一套协议去发现和调用”。MCP 的核心是 Client-Server 架构MCP Server负责把真实业务能力包装成标准化的工具、资源和提示词暴露给客户端。MCP Client通常是 AI 应用或 Agent 框架负责发现服务端能力、调用工具、组织上下文。为什么会出现 MCP因为 Function Calling 虽然解决了“模型调函数”的问题但每个项目接入一个新工具时都要做大量重复工作写工具描述、定义 JSON Schema、处理鉴权、处理参数映射、处理错误重试。今天接天气 API明天接数据库后天接蓝湖设计稿每个都要定制。MCP 的价值在于“一次接入到处调用”只要有人写好了某个服务的 MCP Server任何支持 MCP 的客户端都能直接使用不用再针对每个 AI 应用单独适配。1.3 A2AAgent 与 Agent 之间如何互相协作A2A 是 Agent2Agent 的缩写谷歌发布的那份协议就是要解决智能体之间的互联互通问题。先注意A2A 和 MCP 不是对等关系因为 A2A 关注的是“智能体之间如何协作”而 MCP 关注的仍然是“单一智能体如何调用工具”。A2A 最核心的场景是我有一个人力资源 Agent你有排期 Agent还有一个项目管理系统 Agent它们属于不同的团队、不同的代码库、不同的数据源。需要让它们围绕“安排一场全员培训”的目标自主协作。但是它们互相不知道对方的内部实现不知道对方的 API 细节甚至连对方用什么模型都不知道。A2A 协议要做的事就是定义一套标准的 Agent 通信语言和交互流程Agent Card、任务管理、消息路由、能力协商等。它相当于给 Agent 世界制定了一场国际会议的通用语言让不同“国家”的 Agent 能互通。这里有个很容易踩的认识误区很多人以为 A2A 是“一个大 Agent 调用其他小 Agent”实际不是。A2A 更强调的是对等协作每个 Agent 拥有自己的数据和职责边界通过协议协作而不是中心化控制。你在设计多智能体系统时先要想清楚你是要“一个大脑控制多个手”还是要“多个独立组织之间合作”这决定了该用 MCP 还是该用 A2A。2. 三个概念的核心区别不在 API 形态而在信任边界从表面看Function Calling、MCP、A2A 都和 AI 调用外部能力有关但它们有一个更底层的区别就是“谁信任谁”和“边界在哪里”。2.1 Function Calling 的信任边界在“同一程序内”在使用 Function Calling 时通常是你自己提供函数描述和实现模型只是做了一次“意图识别 参数抽取”。信任边界非常清晰模型不直接执行任何代码你的程序决定是否调用该函数以及如何处理结果。这也是为什么很多轻量级需求用 Function Calling 就够了。比如做一个内部运营助手只需要总结一下客服工单并生成回复那直接给模型注册三五个函数完全够用根本不需要引入复杂的 MCP Server。2.2 MCP 的信任边界在“标准化的服务之间”MCP 场景里AI 应用不再直接写死某个函数实现而是要通过 MCP Client 去发现和连接远程/本地服务。信任边界从“单一进程内”转移到了“进程之间/服务之间”。这带来一个好处工具提供方可以独立更新内部实现只要保持 MCP 协议不变AI 应用不用改代码。但这也带来新的问题安全、鉴权和权限控制变得更复杂。接了一个 MCP Server相当于把自己的 AI 应用开放给一个外部工具你需要想清楚它能访问哪些数据、能执行哪些敏感操作。2.3 A2A 的信任边界在“组织与组织之间”A2A 是三者中信任边界最松散的。两个 Agent 可能属于不同公司、不同团队、不同基础设施。它们无法假设对方内部实现可靠不能直接共享数据库更不能让对方随意读写本地文件。所有交互必须通过协议定义的“任务”和“消息”来做结构化沟通超时处理、重试策略、语义校验也要更健壮。用组织类比可能更好理解Function Calling 像是“让同一个部门里的员工调用内部文档和工具”流程简单信任度高。MCP 像是“公司制定了一套标准接口外部供应商只要按标准接入就可以被任意部门直接使用”好处是通用难点是治理。A2A 更像是“两家公司之间的合作”你需要谈判Agent Card 能力协商、定交付物任务输出、约定反馈机制消息和事件。协作是核心但控制是有限的。2.4 三个概念可以同时存在在实际项目里这三个概念并不是互斥的反而经常会叠加在一起。举一个比较典型的流程用户通过聊天界面发出指令大模型使用了 Function Calling 能力决定调用一个内部查询函数。该函数的实现内部恰好连接了一个 MCP Server用于查询某个外部业务系统的数据。查询完成后该函数还需要把任务转交给另一个团队的 Agent于是通过 A2A 协议发送了一个协作任务。在这个流程里Function Calling 在最内层负责单次调用MCP 负责标准化工具接入A2A 负责跨团队协作。三者各管一段组合在一起形成一个完整链路。所以不要问“我应该只用哪一种”要先问“我的系统需要跨越几个信任边界”。如果只是一个直接函数调用用 Function Calling如果需要接入很多外部工具优先上 MCP如果多个智能体之间的自主协作是核心需求再去研究 A2A。3. 从实际开发视角看哪个更难落地哪个更需要优先学很多读者关心的另一个问题作为一个开发者我应该先学哪个哪个落地难度最大这里直接给一个基于实际经验的排序和理由。3.1 Function Calling门槛最低但细节决定效果Function Calling 是目前最容易上手的所有主流模型都支持OpenAI、Anthropic、Google、通义千问、DeepSeek 等都提供了函数调用能力。你只要会写 JSON Schema就能在几分钟内注册一个函数。但越简单的东西越容易在细节上翻车。常见问题有几个函数描述写得不够清晰模型不知道该在什么时候调用它。参数 schema 设计太宽泛模型会产出大量无效调用增加成本和延迟。同步调用 vs 异步任务没想清楚。简单查询可以同步返回但耗时的任务如果同步等待会直接让接口超时。实际落地时我一般会提供一个非常具体的“函数描述模板”并反复强调几个点函数名称动词开头参数增加枚举值和默认值描述里说清楚触发条件和典型示例。比如{ type: function, function: { name: query_sales_data, description: 查询指定日期范围内的销售数据仅当用户明确要求查看销售数据时调用, parameters: { type: object, properties: { start_date: { type: string, description: 开始日期格式 YYYY-MM-DD }, end_date: { type: string, description: 结束日期格式 YYYY-MM-DD } }, required: [start_date, end_date] } } }这个阶段不建议一上来就研究什么高级架构先把“模型能否稳定地输出正确函数调用”这件事做扎实。因为无论你后面用 MCP 还是 A2A函数调用的质量和稳定性都是地基。3.2 MCP单次接入不复杂批量治理才是真考验MCP 的入门门槛其实比很多人想象的低。如果你只是想“在 Cursor 里配置一个 MySQL MCP Server”去找现成的 MCP 仓库运行npx或uvx一行命令配置文件里指一下地址基本就接上了。但当你真正在一个有一定规模的项目里使用 MCP 时会发现真正的复杂度在“治理”上工具发现机制多个 MCP Server 暴露了几十个工具模型怎么知道哪个工具该用哪个很多框架会一股脑把所有工具塞给模型会导致上下文爆炸和选择困难。权限控制不是所有 Agent 都该访问所有工具需要做细粒度授权。鉴权方式不同服务使用的鉴权方式不同MCP 标准并不强制统一你需要设计一个统一的凭证管理方案。错误处理外部服务不稳定时MCP Client 是否具备重试、降级和人工介入机制在我的实际体验里MCP 的复杂度是“指数级上升”的一个 Server 时非常简单五个 Server 时开始混乱二十个 Server 时如果没有治理方案基本等于没上 MCP。所以我不建议一上来就堆很多 Server最好是“先接 2-3 个高频服务跑通主流程再逐步扩展”。3.3 A2A协议看着简单工程化才是大坑A2A 是目前三个概念里“看起来最简单的”。因为从协议文档看它只定义了 Agent Card、任务、消息几个核心概念似乎理解了就能实现。但真正落地时你会发现A2A 的坑大多藏在工程细节里Agent 发现机制A2A 要求 Agent 暴露 Agent Card但实际怎么发现其他 Agent是用 DNS、服务注册中心、还是配置文件协议本身没有规定。同步与异步并存高延迟任务需要异步回调但回调机制需要跨网络、跨防火墙此时需要考虑消息代理、Webhook 或轮询。语义一致性问题两个 Agent 对同一个业务术语的理解可能完全不同比如 A 的“合同”是草稿B 的“合同”是已审批文件。如果只做了接口互通没做语义对齐协作会变得鸡飞狗跳。安全和审计跨组织通信时数据不出域、隐私合规、审计日志这些不再是一个小团队能内部决定的事。所以如果你准备用 A2A 做真正的跨系统协作我的建议是先不要追求全自动协作找一个合理的业务场景明确边界、定义清晰的输入输出先跑通一个最小闭环再考虑规模化。4. 一张对比表格从技术特征、使用成本到选型建议为了让大家快速建立起横向认知这里整理一个基于我目前经验的对比表。注意这不是官方定义而是工程实践视角下的总结维度Function CallingMCPA2A核心问题模型如何表达调用函数的意图AI 应用如何标准化接入外部工具多个 Agent 如何自主协作交互对象模型 ↔ 程序函数AI Agent ↔ 工具/服务Agent ↔ Agent实现层级模型能力 API 约定客户端/服务端协议智能体间通信协议是否强制标准依赖模型供应商的格式有明确协议规范仍在演进各家实现有差异信任边界同一进程/程序内部服务与服务之间组织与组织之间典型场景内部工具调用、轻量业务流多工具接入、插件生态、统一工具层跨系统/跨团队/跨组织的智能体协作主要成本写 schema、调描述治理、鉴权、上下文控制协议实现、语义对齐、运维和安全入门难度低中高适合什么人普通开发者想要尽快用上 AI 能力要建 Agent 应用或插件生态的团队做多智能体协同平台的团队这里想强调一个和多数教程不同的判断选型时不要先看“哪个最流行”而要看“你的系统里最不确定的那部分在哪里”。如果你现在只是用 API 做一个内部小工具最不确定的是“模型能不能每次都准确输出意图”那就先把 Function Calling 调好。如果你的应用要面向大量外部工具最不确定的是“能不能低成本接入很多工具”那重点一定在 MCP。如果你的核心目标是让多个智能体像虚拟团队一样协作最不确定的是“跨系统的通信、语义、任务生命周期”这才到了该认真研究 A2A 的时候。5. 一个综合示例结合三者设计一个真实场景理论讲多了容易飘还是拿一个我自己踩过坑的实际场景来演示如何结合使用三者。假设你正在做一个“智能研发助手”目标是帮产品经理一键生成“技术方案初稿”。这个流程本身很复杂涉及多类数据和工具产品经理在对话框里发需求描述希望助手自动拉取“用户反馈分析”和“历史技术方案”两份数据生成一份方案初稿。用户反馈数据存放在数据仓库需要通过内部服务接口查询。历史方案文档在知识库系统里团队使用了一套接口。方案初稿生成后需要自动发送给后端 Agent 做技术可行性审核。后端 Agent 还可能再调用 CI 系统查询最近的构建状态形成量化结论。在这个场景里Function Calling 用在哪里大模型需要根据产品经理的意图判断该调用哪个检索函数并抽取参数比如“用户反馈”对应最近 30 天关键词为“登录失败”。这是整个链路的第一层模型把自然语言转成结构化指令。MCP 用在哪里数据仓库和知识库这两个外部系统不应该为 AI 应用写定制代码而是各自暴露成 MCP Server。AI 应用统一通过 MCP Client 去查询数据、读取历史方案。以后再接一个新的需求管理系统同样只要加一个 Server不用改主流程。A2A 用在哪里当方案初稿生成后需要另一个后端 Agent 做可行性审核。这个 Agent 不在同一个进程里可能由另一个小组维护也可能部署在不同环境中。这时候可以用 A2A 协议发送一个包含“方案文档链接、审核要求、截止时间”的任务对方 Agent 在自己的环境里执行完成后回传审核结果。在这个链路里三者不是顺序替代的关系而是各管一段。Function Calling 在模型和主程序之间MCP 在主程序和外部工具之间A2A 在这个应用和后端 Agent 之间。缺一个整个流程要么不够智能要么接入成本高要么跨团队协作无法实现。这种混合架构的好处是每一层都可以独立替换、独立升级。比如 MCP 层今天接的是数据仓库明天可以换成新的数据服务只要协议不变就行A2A 层以后可以扩展对接更多内部团队 Agent不用重新设计接口。缺点是每一层都有额外的抽象成本调试链路更长问题定位更复杂。如果你只是做一个小 demo完全没必要搭这么重的架构。这个例子只是想说明三者结合是真实复杂系统中很自然的选择而不是为了凑概念。6. 落地顺序怎么安排建议从最小可行链路开始聊到最后回到大家最可能关心的实操建议。如果你是一个普通开发者或者小团队想尽快跟上这一波 AI 应用开发趋势我建议按下面的顺序做一个“阶梯式落地”。6.1 第一阶段把 Function Calling 吃透日常开发中先找一个具体场景比如“智能客服工单分类”“自动生成周报”“意图识别 参数抽取”用 Function Calling 实现一个最小闭环。这个阶段的目标是理解模型和程序之间的交互边界搞清楚 JSON Schema 写不好会有什么后果。建议做 2-3 个不同任务的功能验证积累一些“函数描述如何写才不容易翻车”的经验。6.2 第二阶段用 MCP 统一外部工具接入当手头同时要接多个外部系统开始觉得“每个工具都要写一遍函数定义和鉴权”很烦的时候就考虑引入 MCP。可以先找现成的 MCP Server 用起来比如连数据库、连设计稿工具、连代码仓库把之前定制开发的接入方式替换成标准统一的方式。这个阶段的核心收获是理解“标准化的价值”以及“标准化带来的新治理成本”。6.3 第三阶段再考虑 A2A 多智能体协作A2A 不是所有人的必需品。只有当你确实遇到了“多个独立开发的 Agent 需要跨系统协作”时再考虑引入。不要为了“别人都在讲多智能体”而去硬上。如果只是单机脚本里跑两个 Agent 任务完全可以用 MCP 或直接代码编排来实现复杂度低得多。一旦决定上 A2A第一步建议先跑通一个最简单的“单任务往返”Agent A 创建任务 → Agent B 接收任务并处理 → Agent A 获取结果。不要一上来就搞复杂的多步协商和动态路由那会陷入无尽的调试。6.4 给团队管理者的一句话建议如果你是在团队里做技术决策我的观点是与其纠结“用 Function Calling 还是 MCP”不如先梳理清楚自己的系统里到底有几个“信任边界”。一个 AI 应用 几个内部工具Function Calling 就够了。一个 AI 中台 大量外部数据源/插件MCP 是必然趋势。多个智能体分属不同团队/组织A2A 才值得提前调研和储备。按这个逻辑去排优先级基本不会错。7. 未来趋势的一个保守判断最后说一点对未来的判断。MCP 和 A2A 都是近年才兴起的协议远没有达到“尘埃落定”的状态。MCP 的方向大概率是对的统一工具接入、降低重复适配这和软件开发历史上“接口标准化”的大趋势一致。但具体形态还会演进Server 端的安全标准、可观测性、权限模型都会越来越完善。短期内值得关注的是各家模型供应商对 MCP 的原生支持程度这决定了它能否真正走向主流。A2A 的想象力更大但变数也更多。智能体本身的能力还在快速提升可能半年后 Agent 的交互模式和今天完全不一样。现在投入太深有一定风险完全不关注又会错过早期适配机会。更稳妥的做法是跟踪协议变化在合适的小团队里做小范围实验不要全面铺开。对我个人来说这一波最值得长期关注的其实不是具体协议而是“AI 应用正在从单点调用走向系统协作”这个大趋势。Function Calling 是起点MCP 是连接器A2A 是协作网。它们三个合在一起描绘的是同一个未来程序不再只是被动执行人类指令的机器而是一个能和外部工具、其他智能体主动协作的参与者。如果你现在正被这些名词搞得不知从何入手我的建议很简单从最小闭环开始先把一个函数调用跑通再逐步扩展它的连接范围和协作层级。技术栈可以换架构会演进但“把大问题拆成不同层、每层解决一个明确问题”的思路什么时候都不过时。
返回列表