☰
Agent Network Protocol白皮书深度解读:多Agent协作的协议栈设计
2026/10/27 6:22:31 网站建设 项目流程

拿到Agent Network Protocol技术白皮书(草案)的时候,我第一反应是:又来了一个想把所有Agent连起来的宏大叙事。这年头标着“Agent”“Protocol”“白皮书”三个词凑一块儿的文档太多了,大多数翻两页就索然无味。但这篇草案我看完之后,确实认真标注了不少东西。它没有一上来就抛概念,而是先回答了那个我一直觉得整个行业回避了很久的问题:Agent之间如果要真正协作,协议到底该长成什么样。

现在市面上的多Agent系统,绝大多数都是单体闭环:一个LLM、一堆工具、一段记忆,由同一个编排器控制,跑在同一个进程里。演示时很丝滑,一放到真实环境就露馅。Agent可能属于不同团队、跑在不同机房、有不同安全策略,甚至由不同公司运营。你说让一个数据分析Agent去调用另一个邮件Agent,现状只能是写死API、约定JSON字段,再塞一堆胶水代码。Agent Network Protocol草案想做的,就是把这层胶水标准化,变成一套可发现、可路由、可认证、可协商的通用机制。

这份内容适合谁看?我觉得三类人最该读:正在搭Agent平台或AI中间件的人、在公司里被多Agent集成折磨的工程师、以及纯粹对AI基础设施方向感兴趣的技术读者。我会把草案里的协议栈拆开讲,把身份层、发现层、消息层、信任层的设计逻辑一条条说清楚,再补上我在实际落地场景里会踩的那些坑。

1. 草案到底想解决什么问题

1.1 Agent爆发之后,最大的瓶颈不是模型能力

过去两年,Agent的数量和种类都在爆发式增长。但你会发现一个尴尬的事实:每个Agent都在自己的沙盒里玩得很好,一旦要和别的Agent协作,立刻变成中世纪庄园。A想要B的能力,只能靠人工确认地址、约定接口、处理错误,然后祈祷对方别改结构。

草案把这个问题点得很准:瓶颈不是模型能力,而是互操作能力。就像当年计算机之间没有TCP/IP,每台机器都是信息孤岛;现在每个Agent也在重演这段历史,只不过这次“网络”还没建起来。

举个例子。假设某团队有一个数据分析Agent,它知道怎么读数据库、算指标、生成报告。另一个团队有一个天气数据Agent,每天更新气象数据。还有第三方公司运营着一个邮件发送Agent。业务方想把三者串起来:每天早上自动拉取天气数据,形成一份分析报告,再由邮件Agent推给指定收件人。在没有协议的情况下,你要做三套定制对接,每一套对接都意味着文档、联调、排错和长期维护成本。而协议的核心价值是:每个Agent只需要实现同一套通信规则、注册自己的能力和约束,剩下的发现、路由、协商都交给协议层处理。新增一个Agent,不需要为它改一遍全链路代码。

1.2 为什么不能直接拿HTTP或MQTT来用

这是我读完草案后觉得最有分量的一部分。很多人会问:我们已经有HTTP、MQTT、gRPC,为什么还要造一个“Agent Network Protocol”?草案给出的回答值得玩味:现有的协议回答的是“请求怎么送过去”,而Agent场景真正难的问题是“我怎么知道该找谁、对方能不能干这件事、我又凭什么信任它”。

HTTP的请求-响应模型本质是“命令式”的。调用方必须精确知道对方地址,必须预先约定好接口语义。它表达不了“我有一项能力,谁能帮我完成”这种开放式的协作语义。MQTT虽然在设备互联场景很成熟,但它的Topic本质是一种字符串约定,协议本身不关心Topic背后的能力结构,更不会帮你校验输入输出格式。gRPC确实强大,但它的开发模式是预先定义强类型接口,双方紧密绑定,这在稳定的内部系统里没有问题,放到长尾、动态、跨组织的Agent场景里就非常僵硬——Agent今天多了一项能力,明天换个地址,后天换了密钥,这些动态变化都应当是协议的常态,而不是需要人工介入的异常事件。

简单对比一下:

维度HTTP/RESTMQTTgRPCAgent Network Protocol
通信模型同步请求-响应发布-订阅强类型RPC消息信封+能力路由
地址依赖必须知道URL必须知道Topic必须知道Endpoint可通过目录发现
能力描述无标准,靠文档无结构校验通过Proto定义协议内建结构化描述
动态Agent不支持,改地址即断裂一般不支持地址与身份分离,天然适配
身份信任靠TLS或网关弱mTLS可选内建公钥身份与握手机制

这个对比的关键不是谁好谁坏,而是适用边界。Agent之间动态组合、跨信任域协作的诉求,已经超出了传统通信协议的假设范围。草案提出Agent Network Protocol,本质是把“身份、发现、路由、信任”这些本应在应用层散落处理的问题,下沉到协议层统一解决。

2. 协议栈核心设计拆解

2.1 身份层:Agent ID与公钥体系

草案把身份层放在协议栈最底下一层。这个顺序我特别认可——Agent之间的任何协作,起点都是“我怎么知道你是你”。如果身份层不做扎实,后面所有信任机制都是空中楼阁。

草案建议每个Agent持有三样东西:一个全局唯一的Agent ID、一对公私钥、一组可验证的元数据。Agent ID由公钥通过单向哈希推导而来,采用256bit哈希值。这个设计的巧妙之处在于:地址可以变,身份不能变。Agent的接入点地址、运行环境、域名都可能因为各种原因调整,但只要它手里握着对应的私钥,它的Agent ID就始终不变。密钥轮换时ID也不会变,因为ID绑定的是公钥指纹,而不是具体的公钥内容。理解这个逻辑,可以对照现实世界:你的身份证号不变,但你可以换手机号码、换住址。Agent ID就是身份证号,接入地址就是手机号码。

落地时身份认证通常有两种路径。如果是在一个企业内网或联盟内部署,可以用私有CA签发证书,Agent之间通过证书链互验,这一套比较成熟。如果是跨组织、跨公司的场景,草案建议采用身份注册表加上去中心化标识符的方案:Agent先把自身信息和公钥提交到注册表,注册表承担“公证人”的角色;其他Agent通过查询注册表来确认某个ID对应的公钥和元数据是否可信。这里要提醒一点:不要一开始就追求完全去中心化的身份网络,信任锚点问题是所有去中心化系统里最头疼的。我建议第一阶段先做联盟内互通,几个可信的注册表互相背书,运行稳定后再逐步放开。

2.2 发现层:能力注册与目录服务

身份层解决“你是谁”,发现层解决“你能干什么”。草案定义的能力描述结构非常值得借鉴,它不是简单一句“我支持查天气”,而是结构化字段:

  • action:动词,表示能做什么操作,比如query、transform、notify
  • resource:资源对象,比如weather.data、report.daily
  • input_schema:输入参数的JSON Schema
  • output_schema:输出结果的JSON Schema
  • constraints:约束条件,包括地域、时段、限流、费用等

每个Agent启动后,向目录服务注册自己的能力描述,并定期上报心跳。调用方并不需要把流量全部导到目录上,目录服务只负责“索引”,真正的消息投递发生在调用方和目标Agent之间。这个设计避免了目录变成热点瓶颈和隐私黑洞。

能力发现采用拉模式加缓存推送的结合方式。Agent向目录发起查询请求,目录返回候选Agent列表及各自的能力描述;调用方拿到结果后缓存一段时间,再逐一直连候选Agent进行验证。我特别喜欢这里的“直连”设计,它意味着目录服务宕机时,已经建立过连接关系的Agent之间还能继续协作,系统具备一定的降级韧性。

不过这里有一个草案没有完全展开的细节:能力描述怎么写才能真正表达语义。input_schema和output_schema虽然能描述数据结构,但无法完全表达数据含义。比如一个Agent的输入里有个字段叫weight,另一个Agent输出里也有weight,一个表示重量单位为kg,一个表示加权系数,按模式匹配是匹配不上的。这类语义鸿沟靠协议本身解决不了,需要配合注册时的契约测试和运行时日志来持续修正,后面第5部分我会专门讲这个。

2.3 消息层:信封格式与路由规则

消息层是整个草案中工作量最扎实的一块。它定义了一种信封式的消息格式,把路由信息和业务内容分离。

外层是路由头,包含source_agent、target_agent、trace_id、hop_limit、expires_at等字段。这些字段的意义很直接:这条消息是谁发的、发给谁、链路追踪ID是什么、最多能经过多少跳、过期时间是什么时候。内层是业务体,包含payload_type和payload。关键是,协议明确规定了路由头默认明文,业务体可以加密。这个分层设计很实用——中间网关不需要解密就能知道往哪转,而消息内容在端到端加密的保护下,中间节点无法窥探。

路由规则分三种。精确寻址最简单,给定target_agent ID,直接投递到对应地址。能力路由是核心玩法:调用方向目录服务查询符合能力描述的候选集合,然后由调用方本地的路由策略决定选谁。策略可以是轮询、加权、最低延迟、信誉优先等,这部分给了实现者很大的自由度。广播用于群体通知场景,比如发布全局指标变化、下线公告等。

信封里还有几个容易忽略但很重要的字段:request_id、sequence_num、crypto_nonce。request_id用于幂等去重;sequence_num用于会话内的消息排序;crypto_nonce配合加密使用,防止重放攻击。这些字段存在的价值,只有你真正做过多Agent系统才会懂,每个都是线上踩过坑之后才补上的东西。

2.4 信任层:认证、授权与声誉

信任层是草案里最有野心也最难落地的部分。很多通信协议把安全性做成“可选项”,但Agent场景里信任必须是“默认项”。草案设计了一个类TLS的双向质询握手:双方互相验证签名,确认对方确实持有对应用户ID对应的私钥。握手成功后,会话加密可以选两种模式:直接走TLS加密通道,或者在应用层对payload单独加密。第一种部署简单,第二种更灵活,适合消息需要经过多个网关转发的场景。

授权模型推荐采用ABAC(基于属性的访问控制),每个Agent在发起请求时附带属性证明,比如“我属于数据分析组”“我有报告读取权限”“我的地域归属在东区节点”。访问控制决策由每个Agent根据自身策略独立执行,协议只负责把属性证明安全地传过去,不让接收方做决策。

声誉系统是草案里比较超前的一部分。每次任务完成后,合作双方可以互相评分,评分结果记录到声誉账本,后续调用方可以把声誉作为路由决策的一项指标。想法很好,但在实际环境里我强烈建议不要马上开放公开评分。刷分、恶意差评、评价维度不一致,这些问题是系统化的,不是靠一条协议就能解决。MVP阶段可以先做内部信任标记,比如“这个Agent在我这里成功执行了200次,没有被投诉”,等运营机制成熟后再考虑接入公开声誉账本。

3. 关键流程与参数设定

3.1 一次完整的Agent间握手

我把草案中的握手流程整理成了六个步骤,第一次接触Agent Network Protocol的人可以从这个流程快速建立整体直觉。

  1. 调用方A从目录服务查询到Agent B的目录条目,拿到Agent ID、能力描述和接入点地址。
  2. A向B发送hello请求,附带自己的Agent ID、公钥以及一个随机数nonce_a。
  3. B返回challenge响应,附带B的公钥、随机数nonce_b,以及对nonce_a的签名。
  4. A验证B的签名,确认B确实持有与Agent ID对应的私钥,然后回response消息,附带对nonce_b的签名,以及A提议的会话参数session_profile(加密算法、版本号、超时配置)。
  5. B验证A的签名,确认A身份,并接受或调整会话参数,返回session_established。
  6. 双方基于握手阶段交换的随机数和密钥协商材料生成会话密钥,后续消息走会话通道。

理解这个流程最好的类比是现实中的门禁对质。A问B:你说你是B,你怎么证明?B说:我签个名给你看,同时我也要确认你确实是A。双方都验证过对方的签名之后,才开始谈正式合作。

这个流程里隐藏着一个重要的细节:关于方向。握手消息的认证是双向的,不仅要确认对方身份,还要防止中间人攻击。nonce_a和nonce_b都参与了签名,任何一个被篡改都会导致验签失败。我建议实现时把整个握手过程的状态机画出来,每一步要处理哪些异常都要列清楚,比如超时、验签失败、能力不匹配、会话参数协商失败等。草案提供了默认参数:握手总超时10秒,连接空闲超时300秒。在实际调优时可以根据网络环境调整,但不要把握手超时设太短,否则跨地域的Agent协作很容易出现误判。

3.2 消息超时、重试与幂等设计

Agent任务的执行时间通常不可控,这是我读完草案后特别感慨的部分——协议设计者明显被长耗时任务坑过。草案对同步请求和异步任务做了严格的区分。

同步请求用于短耗时操作,比如查询状态、读取元数据、校验权限等,默认超时30秒。而真正的业务任务,必须走异步任务模式:调用方发送submit_task请求,服务方立即返回task_id,然后调用方通过ask_status查询进度,或者由服务方在完成时主动回调notify。这个模式简单有效,避免了同步等待导致的资源长时间占用和超时误判。

下面是我自己在项目上常用的重试策略表,可以直接抄作业:

错误类型是否重试重试策略说明
网络超时(connection timeout)是最多2次,指数退避,间隔1s/3s可能是网络抖动,重试成本低
接收方返回timeout错误是最多1次,间隔5s说明对方还在处理,贸然重试会造成重复执行
验签失败(auth failed)否不重试,直接告警涉及安全事件,应走审计
能力不匹配(no suitable agent)否重新查询目录重试无意义,应该改换策略
执行器返回业务异常是最多1次,间隔10s可能是临时性资源问题

幂等是所有Agent协作里最容易翻车的地方。草案给出的方案很标准:调用方在每条消息里带request_id,执行方用request_id加上一个键控哈希做去重。收到重复请求时,如果任务已经在执行或已完成,直接返回第一次的结果。这个机制依赖执行方具备持久化去重表的能力,我见过不少团队图省事把去重表放在内存里,结果进程重启后出现重复执行,这是生产事故级别的隐患。去重表必须持久化,或者至少要有WAL日志机制。

3.3 版本协商与兼容策略

任何活着的协议都要面对版本演进。草案在版本策略上采用了semver语义化版本,协议版本号放在每一条消息的路由头里。双方在握手阶段会协商一个双方都支持的版本区间,取交集作为本次会话的协议版本。

版本策略有一条硬性约定:在同一大版本下,新增字段必须是可忽略的。也就是说,任何Agent收到一条带有它不认识的新字段的消息时,不得报错,只能忽略该字段后继续处理。这个约定非常关键,因为它允许协议逐步演进而不破坏存量系统。另一条是:已经废弃的字段至少要保留占位两个小版本,给所有存量Agent一个升级窗口。

这套兼容性策略看起来很简单,但实际落地时很容易“翻车”。我见过很多内部协议,一开始信誓旦旦说“新增字段可忽略”,结果后来新功能要改一个现有字段的语义,直接导致所有下游Agent静默产生错误数据。所以我在团队里定了一条铁律:任何字段语义的修改,都不能只改文档,必须同步更新能力描述的schema版本,并把schema版本放在消息头里供接收方校验。

4. 与现有技术栈的对比和集成

4.1 与HTTP/REST的集成思路

很多团队不会立刻把整套Agent Network Protocol铺到所有业务上,更现实的路径是保留现有HTTP服务,在边缘加一层协议网关。草案虽然没有大篇幅讲网关设计,但在实现层面这是最稳妥的中间态。

网关负责协议转换:对外,它作为Agent Network Protocol中的一个节点,参与发现、握手和消息路由;对内,它把协议消息翻译成HTTP请求,调用传统REST接口。这样原有服务不需要改动业务逻辑,就能在新协议体系里“冒充”一个Agent参与协作。我建议网关层要重点处理三个问题:一是把HTTP的状态码语义映射到协议的错误码上,不然调用方无法判断该重试还是放弃;二是要保留协议层面的trace_id,透传到HTTP请求的header里,方便全链路排查;三是网关本身要把能力描述做成由配置生成,而不是手工维护,否则Agent目录很快就会和真实能力脱节。

4.2 与MQTT和gRPC生态的互补关系

草案并不打算替代MQTT和gRPC,而是把它们当作底层传输或者局部解决方案。比如在一个边缘计算场景里,设备侧可以用MQTT上报数据,数据汇聚节点再以Agent的身份接入Agent Network Protocol,向协作网络暴露数据能力。gRPC则可以用于两个Agent之间需要高频率、低延迟、强类型交互的内部通道,通过协议协商在会话内部切换传输协议。

我理解Agent Network Protocol定位是“协作层的语义协议”,它定义的是发现、身份、协商、数据信封这些东西,至于底层字节怎么传,理论上可以用TCP、QUIC、WebSocket甚至邮件去实现。这种灵活性让它有机会成为AI生态里的“通用层”,而MQTT、gRPC这些技术退居为它的可选传输底座。

4.3 与LangChain、AutoGPT等框架的集成方式

草案没有绑定任何Agent开发框架,这是明智的选择。落地时最自然的做法是在框架外层加适配器。以LangChain为例,可以自定义一个ANPTool类,在工具的_execute方法内部完成协议交互;外部Agent看到的只是一个普通Tool,调用方式与其他工具完全一致。

from langchain.tools import BaseTool from anp_client import ANPClient class WeatherAgentTool(BaseTool): name = "weather_remote" description = "调用远端天气Agent获取某城市未来三天预报" def __init__(self, directory_url: str, target_agent_id: str): super().__init__() self.client = ANPClient(directory_url) self.target_agent_id = target_agent_id def _run(self, city: str) -> str: payload = { "action": "query", "resource": "weather.forecast", "args": {"city": city, "days": 3} } result = self.client.submit_task( target_agent_id=self.target_agent_id, payload=payload, timeout=30 ) return result.json()

这段代码的重点在于,Agent框架里完全没有体现“对方是谁、怎么连、是否可信”这些信息,它们全部被封装进了ANPClient。对上层LLM来说,它就是在调用一个本地工具;而对远端Agent来说,它收到的是一个合法协议请求。这种最小入侵式集成方式,我认为是草案推广阶段最实际的切入点。

5. 落地中的常见问题和排查记录

5.1 冷启动:没有Agent愿意注册怎么办

协议设计得再完善,生态没有建立起来就是废纸。冷启动是每个新协议都会遇到的最大难题。草案在生态冷启动这块着墨不多,只能靠实际运营来补。

我的建议是不要一开始就追求大规模生态,而是选几个高频、通用、容易标准化的场景,比如天气查询、股票行情、日历管理、邮件发送、报表生成。先由你自己的团队把这些场景做成“参考Agent”注册到目录里,相当于给生态打样。然后通过网关层把团队已有的内部API快速包装成Agent形态,先把内部流量跑起来。这个阶段的关键是用真实业务把协议的稳定性打牢,同时积累一份“参考实现日志”,给后来者提供现成的接入范例。

我还建议冷启动阶段可以做一个“沙盒目录”,允许任何Agent注册到沙盒环境,并提供一个在线测试工具,让开发者可以对着目录发测试消息。这样既丰富了目录数据,又不会影响正式业务的稳定性。

5.2 能力描述不准确导致路由失效

路由生效的前提是能力描述准确。我在1.1那段举过的weight例子,在实际环境经常出现。单位不一致、时区不统一、字段含义模棱两可,都会让调用方选中一个看似匹配但实际无法完成任务的Agent。

我实践下来最有效的办法是“能力契约测试”。每个Agent在向目录服务注册能力时,必须同时提交一组示例输入和期望输出。目录服务收到注册请求后,会先对示例数据进行冒烟验证,确认Agent声称的能力与实际返回一致,才允许注册状态变为active。如果Agent方后续更新能力描述,也必须重新跑一遍契约测试。这个方法能把大量低级错误拦截在注册阶段。

此外,目录服务应该记录每一次路由选择的成功率,定期生成报表。如果某个Agent被路由了100次,但90次都以失败告终,它就有可能在目录里被自动降权。用数据反向修正能力描述,比靠人工审核靠谱得多。

5.3 安全边界与沙箱逃逸风险

当Agent开始接收外部消息,安全攻击面就会急剧扩大。草案里对加密、签名、授权都做了设计,但有一个关键点很多实现者会忽略:所有外部输入默认不可信。无论表示层做了多少校验,agent内部还是要对payload做深度检查,特别是涉及文件路径、命令执行、数据库查询和网络访问的地方。

我建议payload解析放在独立进程中,通过轻量沙箱隔离,避免一个格式错误的消息直接击穿主进程。Agent能访问的一切资源都要最小化授权,比如邮件发送Agent不应该有读数据库的权限,数据分析Agent不应该有发邮件的权限。这里可以参考传统微服务架构里的“最小特权”原则。很多人以为Agent系统风险很小,因为看起来只是“聊聊天”,一旦某个Agent被投毒或被恶意发消息,它能触达的资源就是攻击者能触达的资源,边界必须提前划清。

5.4 排错速查表

结合草案可能出现的错误场景,整理了一份排错速查表,适合打印出来贴工位:

现象大概率原因排查方式
握手总是超时对方接入地址不可达,或握手超时配置过短先ping网关地址,再检查安全组/防火墙策略
握手成功但消息全部routed失败版本协商失败,或能力描述schema不匹配抓包看双方协议版本,打印schema版本比对
回调notify收不到网络NAT穿透失败,或对方无法主动回连检查是否有公网回调入口,确认nat能力协商结果
任务重复执行幂等表未持久化,重启丢失检查去重表是否落盘,确认WAL机制生效
目录能查到Agent但直连失败目录数据和真实接入点脱节检查Agent心跳上报是否正常,尝试重新注册
路由结果全部指向同一个失败Agent路由策略固定权重,没有健康检查检查路由策略配置,确认是否开启健康检查和自动剔除

上面每一行都是我预计在真实部署中会频繁遇到的场景。协议草案里虽然定义了错误码和基础异常处理,但实际部署一定比文档复杂得多,拿到报错信息先看错误码,再对照这张表排查,能省下不少时间。

6. 草案的边界问题与我的实操建议

6.1 可观测性缺失是要自己补的短板

草案在可观测性方面几乎空白。它定义了trace_id,但没有定义完整的链路追踪规范,也没有统一的标准日志结构。这对小规模演示没有影响,一旦Agent网络扩展到几十上百个节点,问题定位就会变成灾难。

我建议每个实现Agent Network Protocol的节点至少输出结构化日志,包含source_agent、target_agent、message_type、trace_id、耗时、错误码这几个字段。同时把关键指标通过Prometheus暴露出来:握手成功率、消息往返延迟、任务完成率、活跃会话数、目录查询命中率。这些指标是判断整个Agent网络健康度的基础。不要等协议标准化完再补,现在就在实现里加上。

6.2 语义互操作性问题需要生态配合

草案定义了input_schema和output_schema,但schema只能描述结构,不能解释语义。两个Agent对接时,如果对字段的类型、单位、时区理解不一致,后续会产生一系列难以排查的脏数据问题。这个问题靠一家公司的努力解决不了,需要生态中的伙伴共同维护一份“语义约定文档”,或者引入共享的数据字典服务。我建议早期生态的参与者先围绕高频场景定义字段标准,比如时间统一采用ISO 8601并注明时区,重量统一用kg,金额统一用最小货币单位加币种代码。标准的制定需要所有参与者在实际对接中相互磨合,没有捷径。

6.3 我现在就会做的三件事

如果你看完这份草案也准备切入这个方向,我的建议是不要等协议正式定稿再动手。先把目录服务和消息信封的简单实现跑起来,在自己团队内部做一个小范围的双Agent协作POC,把身份层和握手机制走一遍。然后找一个真实业务场景接入,哪怕只是把一个日报生成Agent和一个邮件发送Agent连起来。最后,把所有适配器代码和踩坑记录开源或写成文档,贡献给社区。

我个人的体会是,Agent Network Protocol这类协议,最大的价值不是某个具体的消息格式有多高明,而是它迫使整个行业坐下来讨论“Agent之间如何协作”这个基础问题。草案目前还有很多细节没有定,很多边界没有画清楚,但方向我已经信了。

今天先写到这里。等协议草案更新到下一版,或者我这边把网关层和LangChain适配器的代码整理干净,再回来补一篇带完整代码的实战记录。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询