一文让你彻底搞懂谷歌的新玩意Agent2Agent(A2A)

1、为什么会诞生A2A?

让我们假想一个简单的场景:你开发了某个Agent(比如Web自动化机器人或AI研究员),现在我在开发一个新的Agent系统,希望可以把部分任务交给你的Agent来完成,我们会怎么做呢?

  • 最简单的,你可以把Agent代码交给我,我把这个Agent转化成一个函数工具为我的Agent使用,这是可行的(甚至可以用上MCP):

    img

  • 我还可以借助多Agent开发框架,直接构建分布式多Agent系统。这也是可行的,比如利用AutoGen框架:

img

但是这样的集成一方面需要大量代码级的改造,另一方面耦合度太高了。且不论不同的开发平台和框架可能的兼容性问题,后期更新维护就是大问题。

所以一个更简单的办法就是开放API,于是协商了下接口参数,很快做成了这样:

img

现在这个方案貌似还不错,可能也是一些有前后台的Agent系统的方案。包括一些Agent构建平台也支持这种模式,比如你可以借助API调用Coze/Dify上创建的Agent。但如果把这样的需求泛化到更多的任务场景,仍然会面临新的挑战:

  • 如果扩展到多个Agent,这些Agent有不同的供应商、不同的平台、不同的开发框架,它们之间有协作的需求。那么就会面临和MCP之前一样的问题:你需要去做大量的API集成,不同的消息格式与通信协议,需要你来做“粘合”。

  • Agent系统的真实任务场景复杂度往往较高,简单的无状态API无法满足。比如:

    • 一个需要很长时间运行的任务

    • 多轮对话的问题,Human-in-the-loop工作流

    • 流式输出的问题

    • 不同供应商之间的Agent之间的互信问题

这种需要让不同类型的AI Agent之间(也可以是其他应用与Agent之间)实现更标准的通信与互操作的需求,就是A2A诞生的原因。

2、A2A到底是什么?

A2A(Agent2Agent Protocol)是谷歌开源的首个标准智能体交互协议。 A2A协议让不同框架和供应商构建的AI智能体相互协作,基于标准化的通信方式,打破系统孤岛,让智能体安全地交换信息、协调行动。A2A支持多种模态(如文本、音频、视频)、长时任务处理和实时反馈,基于现有标准(如HTTP、JSON-RPC)构建,易于与现有IT系统集成,即使它们的底层平台完全不同:

img

整体上而言,A2A提供的价值与MCP是类似的:

  • 降低异构Agent之间的集成复杂性:你无需了解对端Agent的细节。

  • 提高Agent能力的可复用性: 你可以把某个任务交给更擅长它的Agent。

  • 更好的扩展性以适应变化: Agent的内部逻辑变化可以被A2A所隔离。

A2A协议对Agent之间集成的如下方面进行标准化:

  • 集成架构与关键组件

  • 消息与通信机制(JSON-RPC2.0与HTTP)

  • 服务端与客户端的功能规范

  • 安全验证与授权机制

3、A2A架构是怎样的?

也就是“基于A2A规范的Agent集成架构”,大致描述如下:

img

几个关键的组件构成如下:

  • Agent Card: 这是Agent的“名片”,代表“我有怎样的任务完成能力“。

  • A2A Server:访问对端Agent的的入口,基于Web Server运行,提供端点供客户端发起各种请求并给予响应;也会通过连接发起主动通知、任务结果给客户端。

  • A2A Client: 访问A2A Server的其他Agent或定制应用。所以Client与Server是相对的,一个客户端Agent同时也可以是其他Agent的服务端。

  • Task(任务):这是客户端交给服务端Agent需要完成的工作任务。任务过程可能需要客户端的协作;任务结果可以同步等待也可以异步获取。

  • Artifact(工件):服务端Agent的最终产出被称为Artifact。比如一段文字、一个报告、一个图片或者视频;一次任务可以产生多个Artifact。

  • Messages(消息):是指的客户端与服务端Agent之间的多轮沟通内容,存在两个角色:user和agent,内容包括各种上下文、指令、中间状态等。客户端向Agent发送的所有内容都是消息;Agent也可以发送消息给客户端传递状态或指令(比如要求客户端补充信息),但服务端Agent的最终结果则是用Artifact来表示。

  • Notifications(通知):服务端Agent向客户端主动推送的信息,比如一个长期任务的中间运行状态,一个任务有了新的产出等。客户端可以设置通知处理回调。

    所以基本的运行过程就是:

  • 服务端Agent启动Server,通过Agent Card展示能力

  • 客户端Agent/应用连接服务端,并查看Agent Card

  • 根据Agent Card可以把后续的任务发送给服务端Agent

  • 服务端Agent处理任务,必要的时候会输出中间结果,或者要求客户端补充信息

  • 客户端可以等待任务完成;也可以根据任务ID异步获取任务结果

  • 客户端也可以设置通知回调,及时获得任务的进展与工作成果

4、A2A与MCP什么关系?

A2A在诞生动机、架构甚至协议方面都与MCP非常相似,但它们之间的关系与区别还是很清楚的:

MCP解决的是Agent与外部工具/数据之间的集成,是Agent的“内部事务”;A2A解决的是Agent与Agent之间的集成,属于更高层次的集成关系。

它们之间是可以共存与协作的,比如:

img

在这样的架构中Agent通过MCP使用工具,Agent与Agent之间则通过A2A产生互动与协作。

我们对两者做个简单的对比:

协议A2A(Google发起)MCP(Anthropic发起)
相同开放标准面向AI应用中的集成挑战Client/Server架构以HTTP为基础远程协议JSON-RPC 2.0消息协议
动机智能体与智能体之间的互操作问题智能体与外部工具/数据的集成问题
架构连接单个智能体与其他智能体连接单个智能体与外部工具和数据
通信只有远程(HTTP)远程(HTTP)或本地(stdio)
服务能力暴露查询智能体卡片agent card查询工具、资源、提示list_tools/resources等

5、A2A的Demo新体验

A2A还没有完整的官方SDK放出,但是谷歌公司在项目中给出了几个帮助理解A2A的示例,我们对其中一个做了简单修改以演示A2A的能力。

【首先准备一个Agent】

这是一个LangGraph开发的智能体,可以独立运行。你需要实现的主要接口是invoke与stream,分别用于非流式与流式调用(在返回消息格式上有特殊处理)。其“轮廓”长这样,内部逻辑无论你是用ReAct Agent还是定义Workflow都不影响:

...
@tool
def search_tavily(query: str, search_depth: str = "basic") -> Dict[str, Any]:
    ...

class ResponseFormat(BaseModel):
    """以这种格式回应用户。"""
    status: Literal["input_required", "completed", "error"] = "input_required"
    message: str

class SearchAgent:

    SYSTEM_INSTRUCTION = (
        "你是一个专门进行网络搜索的助手。"
        "你的主要目的是使用'search_tavily'工具来回答用户问题,提供最新、最相关的信息。"
        "如果需要用户提供更多信息来进行有效搜索,将响应状态设置为input_required。"
        "如果处理请求时发生错误,将响应状态设置为error。"
        "如果请求已完成并提供了答案,将响应状态设置为completed。"
    )
     
    def __init__(self):
        ...
    def invoke(self, query, sessionId) -> str:
        ...

    async def stream(self, query, sessionId) -> AsyncIterable[Dict[str, Any]]:
        ... 

先写个本地程序对Agent做测试,确保可用:

img

【启动A2A Server】

现在给这个Agent增加一个前置A2A Server,让它可以对外提供服务,主要逻辑长这样:

def main(host, port):
    
    try:
        capabilities = AgentCapabilities(streaming=True, pushNotifications=True)
        skill = AgentSkill(
            id="search_web",
            name="搜索工具",
            description="搜索web上的相关信息",
            tags=["Web搜索", "互联网搜索"],
            examples=["请搜索最新的黑神话悟空的消息"],
        )

        agent_card = AgentCard(
            name="搜索助手",
            description="搜索Web上的相关信息",
            url=f"http://{host}:{port}/",
            version="1.0.0",
            defaultInputModes=SearchAgent.SUPPORTED_CONTENT_TYPES,
            defaultOutputModes=SearchAgent.SUPPORTED_CONTENT_TYPES,
            capabilities=capabilities,
            skills=[skill],
        )

        notification_sender_auth = PushNotificationSenderAuth()
        notification_sender_auth.generate_jwk()
        server = A2AServer(
            agent_card=agent_card,
            task_manager=AgentTaskManager(agent=SearchAgent(), notification_sender_auth=notification_sender_auth),
            host=host,
            port=port,
        )

        server.app.add_route(
            "/.well-known/jwks.json", notification_sender_auth.handle_jwks_endpoint, methods=["GET"]
        )

        logger.info(f"正在启动服务器,地址:{host}:{port}")
        server.start()
    except MissingAPIKeyError as e:
        logger.error(f"错误:{e}")
        exit(1)
    except Exception as e:
        logger.error(f"服务器启动过程中发生错误:{e}")
        exit(1)


if __name__ == "__main__":
    main()

基本过程是声明Agent的能力->发布成Agent卡片->启动A2AServer(uvicorn)。其核心是一个借助于Agent来完成任务的task_manager。

现在启动这个Server:

img

【客户端应用测试】

用官方提供的客户端命令行来测试这个Server。可以看到,客户端启动时会读取服务端的Agent卡片,了解到Agent的能力与特性(比如Streaming代表支持流式):

img

现在向这个Agent发送一个任务:

img

客户端采用了Streaming输出,所以这里可以看到一些中间输出。这些输出可以帮助理解A2A协议的一些标准,比如:

  • 中间过程都是用message来传递,发送的角色是agent

  • 最终的任务输出则是artifact,代表这是任务的最后产出

  • 不管是message还是artifact,具体内容都是有多个part组成

我们来测试几个能力:

多轮连续对话

我们输入“我要搜索”,可以看到收到的消息状态是"input-required",这是A2A协议规定的任务状态之一,代表需要补充信息。通过这种方式,你后续的消息会被追加进入任务输入(这也需要Agent支持),实现多轮对话:

img

服务端通知消息

在客户端可以启用通知推送,这时候会在客户端启动一个Server用来等待服务端的通知消息,服务端可以会通过post把任务消息推送到客户端:

img

异步任务结果获取

A2A的任务可以完全异步,即使客户端断开也不影响获取任务结果。为了证明这一点,我们另写了一个简单的根据task_id轮询任务结果的程序。然后执行如下步骤:

  1. 在Agent中增加一段sleep时间,模拟很长的任务执行时间;然后启动Server;

  2. 在官方客户端中启动一个新任务,然后很快强行退出客户端:

img

  1. 拷贝出任务ID(任务ID是客户端生成的,可以直接在客户端打印出来)。

  2. 启动我们编写的轮询客户端(带上任务ID),会看到如下结果:

img

可以看到,尽管发起任务的客户端已经退出,但不会影响你获取任务结果。

这个Demo很好的演示了A2A的一些原理与能力,包括能力发布、流式处理、多轮对话、异步任务等。显然,你也可以把A2A Server作为企业智能体系统的前后端通信的方式(取代FastAPI),可以减少很多复杂问题的工作量。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

https://img-blog.csdnimg.cn/img_convert/05840567e2912bcdcdda7b15cba33d93.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值