目录

1、A2A协议出现的原因

2、多agent之间怎么知道彼此是干什么的

3、A2A中任务协作的基本单位

4、A2A和MCP的关系


提到A2A,就可以联想到MCP,我理解它们的区别是:MCP解决的是单个agent怎么连工具和数据,A2A解决的事多个agent之间怎么分工协作。

        通过A2A协议,一个agent就可以把子任务委托给另一个专业agent,接收方按自己的skill声明承接,支持异步长任务和流推送结果。MCP和A2A是互补的,MCP向下连接工具,A2A向上连agent,在复杂的多agent环境中两者通常都需要用到。

1、A2A协议出现的原因

        总的来说就是单Agent工具数量有限、上下文窗口有限、专业能力有限,复杂任务需要拆分给不同的agent并行处理。

        其实主要是因为单agent不够用,所以需要多agent协作,就有了A2A。一个agent其实就是一个LLM+一组工具+一段上下文窗口,它的缺点其实就是A2A协议出现的原因:

        1)首先它的上下文窗口是有限制的,单个agent去执行复杂任务容易很快就把窗口塞满,它执行过程中累积的中间产物,搜索结果、草稿、反思记录等会很快给窗口塞满;

        2)工具数量也有限制,我们如果给一个agent装很多个工具,会导致模型处理起来效率极低,容易混乱。

        3)最后是专业能力的限制,我们要确保单一职责,比如代码审查agent就只做代码审查、生码agent就只管生成代码,每一个agent做好自己的事,有自己的配置。比如一个agent去做多个事无论从效率还是结果来看都要好很多。

        就比如我们现在多agent需要去生成代码和审查代码,我们有一个调度agent,一个代码生成agent和一个审查代码agent:

        1)调度agent将生成代码的工作委托给生成代码agent来做,生成代码agent需要自己去理解历史代码规范、新的需求、写草稿、反复迭代,这些中间过程都在自己的上下文窗口进行,任务结束后只需要把生成的代码通过A2A返回给调度agent即可;

        2)这样调度agent的上下文只多了一份代码,然后再把审查代码任务委托给审查agent去做,审查agent自己去根据一些规则在自己的窗口去审查代码,最终返回给调度agent的只有一份审查报告。每个agent承担自己的职责,调度agent始终保持轻量,这是多agent协作在上下文层面的核心收益。

2、多agent之间怎么知道彼此是干什么的

        比如我们调度agent要把任务委托给生码agent,那它就得先知道生码agent能做什么;最简单的方法就是在调度agent中硬编码“生码agent”可以生成代码,但这样的缺点是一旦生码agent能力一变,调度agent的代码就需要改,维护成本太高了。

        其实比较好的方案就是生码agent告诉调度agent自己可以做什么,然后由调度agent自己来查,这就是A2A协议中的Agent Card设计思路。

        每个a2a agent都会在一个约定位置发布一张JSON格式的名片(规范的路径是/.well-known/agent-card.json,早期版是agent.json),在这个json文件中会写清楚自己叫什么、可以做哪类任务(skill列表)、支不支持流式返回、支不支持异步回调。所有想与它协作的agent,都先去拿这张名片,然后再决定要不要把任务委托给它。

        agent card中最关键的是Skill列表,每个Skill描述一类能力,比如“生成代码”、“审查代码”,并带有示例输入。调度agent使用这些skill描述来做任务路由决策——“这个任务和哪个agent的哪个skill最匹配”。

        这种Agent Card机制让多Agent系统变得更加便捷,比如我们要新加一个agent,那就发布它的agent card,调度agent就能自动发现和利用它,完全不需要改调度agent代码。

        通过给调度agent进行静态配置或者通过注册中心的方式都可以让调度agent知道要去读哪些agent card。

3、A2A中任务协作的基本单位

        A2A中任务协作的基本单位是Task。调度agent把一段任务委托给另一个agent就是创建一个task,接收方执行这个task,完成后把结果作为Task的产出artifacts(可以是文本、文件等)返回。

        Task 有完整的生命周期状态管理。一个Task刚被创建时是submitted状态,表示已提交、等待处理。接收方开始执行后变为working状态,最终根据执行结果进入completed或者failed状态。

        通知方式有两种:一种是主动轮询,调度agent定期调用接口查询任务状态;一种是主动回调,被调agent任务完成后主动回调通知结果。

        调度agent的视角很干净,给agent B提交一个task,定期检查这个task的状态,等到completed时去取artifacts。整个过程中不需要知道B内部用了什么工具,调用了几次LLM,完全黑盒。

4、A2A和MCP的关系

        Agent使用MCP来连接各种工具,比如数据库、浏览器、代码执行器,用Function Calling让LLM触发这些工具调用。而A2A解决的是agent之间需要分工协作时的问题。可以通过A2A来相互通信、委派任务、接收结果。相当于就是MCP解决的是agent连工具的问题,A2A解决的事agent连别的agent的问题。

        MCP和A2A两个协议各管一个维度,合在一起才能支撑起真正复杂的Agent系统。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐