嘿,大家好,我是老码小张。没错,就是那个没事儿就喜欢扒拉技术底层,琢磨怎么用代码改变世界(至少是改变点啥)的技术人。最近 AI Agent 这波浪潮真是汹涌澎湃,各种酷炫的应用层出不穷。但光鲜亮丽的背后,咱们技术人更关心的是:这些聪明的 Agent 们到底是怎么凑在一起干活的?它们怎么和外部工具、数据、甚至我们用户进行交互?
今天,我就想和大家聊聊这个话题,特别是两个正在崭露头角的关键协议:A2A (Agent-to-Agent) 和 MCP (Model Context Protocol)。别看名字挺唬人,我会尽量用大白话把它们是干嘛的、为啥重要、以及它们俩怎么“相爱相杀”又“缺一不可”讲清楚。
痛点:AI Agent 的“鸡同鸭讲”时代?
想象一下,我们开发了一个牛逼的 Agentic 应用,比如一个能自动帮你规划旅行、预订机票酒店、还能处理突发状况的智能助手。这个助手(我们称之为主 Agent)需要调用各种“工具”:
- 查天气的 API
- 订机票的平台接口
- 翻译服务
- 地图服务
同时,它可能还需要和其他“专业 Agent”协作:
- 一个专门负责处理签证问题的 Agent
- 一个本地美食推荐 Agent
如果每个工具、每个 Agent 都有自己的一套“方言”(接口规范、数据格式),那我们的主 Agent 就得学 N 种语言,适配 N 套逻辑。这复杂度,想想都头大!开发效率低不说,整个生态也碎片化,难以形成合力。
这就是标准化协议的价值所在: 统一“语言”,让不同的组件能够顺畅地对话和协作。而在 Agentic 应用这个场景下,我们发现有两种关键的交互模式,需要不同的协议来支撑。
MCP:让 Agent 学会使用“工具”的普通话
MCP,全称 Model Context Protocol,你可以把它理解为 Agent 和工具之间沟通的“普通话”。
啥是工具(Tools)?
在 Agent 的世界里,“工具”通常指那些功能相对单一、输入输出结构化、行为可预测的组件。比如:
- 调用一个数学计算函数
- 查询数据库里的特定信息
- 执行一个 API 调用(比如上面说的查天气)
这些操作通常模式固定:给它明确的指令(输入),它返回明确的结果(输出)。
MCP 干了啥?
MCP 的目标就是标准化这个“Agent 调用工具”的过程。它提供了一种通用的方式,让 LLM(大语言模型,通常是 Agent 的“大脑”)或者 Agent 本身,能够理解并使用这些工具。
大家可能对“Function Calling”这个概念更熟悉。很多大模型(像 OpenAI 的 GPT 系列)都支持 Function Calling,允许你在调用模型时定义一些外部函数(工具),模型能判断何时需要调用哪个函数,并生成符合要求的参数。
MCP 正在做的,就是把这种“Function Calling”的能力标准化、通用化。 这意味着:
- 跨模型/框架兼容: 无论你用哪个大模型,或者哪个 Agent 框架(如 LangChain, LlamaIndex 等),调用工具的方式都趋于一致。
- 工具生态繁荣: 工具提供者(比如天气 API 服务商)只需要遵循 MCP 标准提供接口,就能被各种 Agent 应用方便地集成。
- 开发复杂度降低: 开发者不用再为对接五花八门的工具接口而头疼,可以更专注于 Agent 的核心逻辑。
举个例子(伪代码):
想象一下,Agent 想调用一个“计算器”工具来算 2+2。通过 MCP,这个交互可能看起来像这样(简化示意):
json 代码解读复制代码// Agent 发送给 MCP 兼容的工具执行器的请求
{
"protocol": "MCP/1.0",
"tool_id": "calculator_v1",
"operation": "add",
"parameters": {
"operand1": 2,
"operand2": 2
}
}
// 工具执行后返回给 Agent 的结果
{
"protocol": "MCP/1.0",
"request_id": "...", // 对应请求的 ID
"status": "success",
"result": {
"value": 4
}
}
看,输入输出都很结构化,一目了然。MCP 就是要统一这套交流范式。我们预测,随着越来越多的平台和框架拥抱 MCP,这种标准化的工具调用将成为 Agent 应用开发的基石。
A2A:让 Agent 之间像“人”一样协作
MCP 解决了 Agent 和“工具”的沟通问题,但这还不够。Agent 的强大之处在于它们的自主性、推理能力和处理复杂、开放式任务的能力。这意味着 Agent 之间,或者 Agent 和用户之间,往往需要更灵活、更像“对话”的交互方式。
这时候,A2A (Agent-to-Agent) 协议就派上用场了。
A2A 关注的是什么?
A2A 是一个应用层协议,它的核心目标是让 Agent 能够以**它们自然的形态(像一个智能体,而不是一个工具)**进行协作。这种协作通常涉及:
- 开放式对话: 不再是简单的“请求-响应”,而是可能持续多轮、不断演进的交流。
- 意图理解与协商: Agent 需要理解对方的意图,甚至进行协商以达成共同目标。
- 计划调整: 在协作过程中,计划可能会根据新的信息或对方的反馈进行调整。
- 非结构化信息: 交互可能包含自然语言、图片等多模态信息。
回到那个汽车修理铺的例子:
想象一个汽车修理铺,里面有几个“AI 修理工”(Agent),它们需要使用各种工具(千斤顶、万用表、扳手等)。
-
MCP 的用武之地: 当 AI 修理工需要精确地操作工具时,比如“将平台升高 2 米”、“将扳手向右旋转 4 毫米”,这种结构化的指令交互,就适合用 MCP。AI 修理工通过 MCP 调用这些“工具”接口。
-
A2A 的用武之地:
- 用户与 Agent 交互: 你(用户)对 AI 修理工说:“我的车发出嘎啦嘎啦的响声。” 这不是一个结构化指令,需要对话来 уточнять 问题。AI 修理工可能会问:“能发一张左前轮的照片给我吗?”、“我注意到有液体泄漏,这种情况持续多久了?” 这种持续的、信息不断补充和计划不断调整的对话,就是 A2A 发挥作用的地方。
- Agent 之间的协作: 一个 AI 修理工可能需要向另一个专门负责采购零件的 AI Agent 发出请求:“帮我查一下 XX 型号的刹车片有没有货,价格多少,多久能到?” 这同样是一个需要沟通、可能涉及协商(比如价格、替代品)的过程,也适合 A2A。
A2A 的价值在于,它让 Agent 能够进行更高级别的、基于理解和协商的协作,而不是仅仅把对方当作一个简单的函数来调用。
A2A ❤️ MCP:不是替代,而是互补
说了这么多,你可能已经明白了:A2A 和 MCP 并不是竞争关系,它们是互补的!
- MCP 强在“调用”: 标准化 Agent 对结构化工具和资源的调用,构建底层能力生态。
- A2A 强在“协作”: 支持 Agent 之间、Agent 与用户之间进行更灵活、更智能的对话式交互。
一个复杂的 Agentic 应用,往往既需要 MCP 来高效地使用各种基础工具和服务,也需要 A2A 来实现 Agent 之间以及与用户的智能协作。
就像那个修车铺: AI 修理工需要 MCP 来操作扳手(工具),也需要 A2A 来和客户沟通、和零件供应商 Agent 协调。两者结合,才能完成复杂的维修任务。
技术实现猜想:A2A Agent 如何融入 MCP 生态?
原文提到了一个有趣的建议:将 A2A Agent 模型化为 MCP 资源,通过一个叫做 AgentCard
的东西来表示。
这是什么意思呢?我来解读一下:
我们可以把每个支持 A2A 协议的 Agent,也看作是一种特殊的“资源”。这个资源的“接口描述”(AgentCard
)可能包含了它的身份标识、能力范围(比如“擅长汽车故障诊断”、“能预订机票”)、以及最重要的——它的 A2A 通信端点和协议规范。
这样一来,一个主 Agent 或编排框架(Orchestrator)可以:
- 发现: 通过类似 MCP 的机制(或者扩展的 MCP),发现有哪些 A2A Agent 可用(就像发现普通工具一样)。它可以读取这些 Agent 的
AgentCard
。 - 切换协议: 当主 Agent 决定需要与某个 A2A Agent 进行复杂的协作(而不是简单的工具调用)时,它就根据
AgentCard
里的信息,切换到 A2A 协议,与目标 Agent 建立连接并开始“对话”。
这个流程展示了 Orchestrator 如何根据任务需求,灵活地在 MCP(调用工具服务)和 A2A(与协作 Agent 对话)之间切换。将 A2A Agent 表示为 MCP 可发现的资源,为这种混合交互模式提供了可能性。
写在最后
Agentic 应用的未来,离不开高效的工具调用和智能的协作交互。MCP 和 A2A 正是支撑这两大需求的关键协议。MCP 正在通过标准化“Function Calling”等方式,为 Agent 构建坚实的“动手能力”基础;而 A2A 则致力于赋予 Agent 更高级的“沟通协作”能力。
理解它们各自的定位和互补关系,对于我们设计和开发下一代智能应用至关重要。当然,A2A 作为一个相对更新的概念,其标准仍在演进中,需要社区的共同努力来推动和完善。
希望今天的分享能让你对 Agent 世界的底层协议有更清晰的认识。我是老码小张,下次有机会再跟大家聊聊其他有意思的技术话题!
评论记录:
回复评论: