跳到主要内容

智能体间通信协议:让多智能体系统具备可调试性的接口契约

· 阅读需 13 分钟
Tian Pan
Software Engineer

当多智能体流水线(multi-agent pipeline)开始输出垃圾内容时,人们的直觉往往是归咎于模型。推理能力差、上下文错误、幻觉。但在实践中,很大一部分多智能体系统的失败源于更乏味的原因:智能体之间无法进行可靠的通信。格式错误的 JSON 虽然通过了语法验证,但无法通过语义解析。编排器(orchestrator)发送了一个状态为 "partial" 的任务,而下游智能体将其理解为已完成。由于缺少幂等键(idempotency key),重试操作触发了两次。

这些不是模型故障,而是接口故障。它们比模型故障更难调试,因为日志中没有任何信息会告诉你序列化契约(serialization contract)已经断裂。

对生产环境下多智能体系统故障的研究一致发现,智能体间通信崩溃是主要的故障类别之一——智能体在没有请求澄清的情况下处理模糊数据,智能体拥有相关信息却不分享,或者推理逻辑与执行动作相矛盾。这些问题大多是伪装下的协议问题。LLM 完全按照指令行事,但指令是以一种导致隐性错误行为的形式传达的。

本文旨在讨论如何设计消息契约来防止这种情况。我们不谈论理论上的协议,而是讨论决定你的多智能体系统在生产环境中是否具备可调试性的实际选择。

消息信封:真正关键的字段

每个智能体间的消息除了负载(payload)之外,还需要一个结构化的信封(envelope)。跳过这一步的团队在凌晨 2 点试图重放失败的工作流时,就会明白这有多重要。

以下是始终证明其价值的字段:

  • transaction_id:由发起智能体生成的 UUID,它会随请求在每一跳中传递。这是你关联跨智能体日志、在重试时检测重复项以及将故障追溯到源头的方式。没有它,你的分布式追踪就是死路一条。
  • sender_id:哪个智能体发送了此消息。这不仅是为了记录日志——下游智能体有时需要根据来源调整行为。相比 user_input 消息,researcher_agent 的输出需要不同的信任校准。
  • message_type:一个明确的意图字段(TASK_REQUESTTASK_RESULTCLARIFICATION_REQUESTESCALATION)。这使得接收端智能体无需解析完整负载即可进行路由。
  • protocol_version:基于日期的字符串,例如 2025-06-01。非破坏性更改不会增加此版本号。破坏性的架构更改则会。这个单一字段可以防止滚动部署导致部分智能体无法解析来自已升级对等智能体的消息。
  • status:与 message_type 不同。任务结果消息可能具有 COMPLETEPARTIALFAILEDNEEDS_CLARIFICATION 状态。将此作为一个显式的枚举字段(而不是埋在正文中),可以使编排器具备可编程性,而不需要另一个 LLM 来解释响应。
  • confidence:一个 0 到 1 之间的浮点数。在大多数系统设计中,这个字段往往被忽略,直到团队发现布尔值的成功/失败无法捕捉到足够的信号。置信度为 0.4 的智能体输出应与置信度为 0.95 的输出区别对待。

容易被遗漏并导致后续问题的包括:时间戳(用于排序和 TTL 强制执行)、区分并行子智能体调用中同一事务的相关 ID(correlation IDs),以及独立于协议版本的架构版本(你的负载架构可以独立于信封格式演进)。

错误信号:超越二元的成功与失败

在智能体间契约中,最难处理好的是故障通信。二元的成功/失败无法模拟智能体的真实经历。调研智能体可能会找到五个请求源中的三个,置信度为 0.6。代码智能体可能会生成一个通过单元测试但存在无法解决的类型错误(type error)的解决方案。这些都不能简单归类为“失败”。

生产系统至少需要四种不同的故障信号:

NEEDS_CLARIFICATION:智能体信息不足或含义模糊,无法继续。这并非故障,而是一个请求。响应契约应包含具体哪些内容不明确。如果没有这个信号,智能体要么会出现幻觉(在不标记不确定性的情况下选择一种解释),要么会默默失败。

PARTIAL_SUCCESS:智能体完成了部分任务。响应应包括已完成的内容、未完成的内容、每个已完成项的置信度评分,以及是否可以继续。这让编排器能够做出明智的决定:重试未完成的部分、升级给人工处理,或接受部分结果。

FAILED_RETRIABLE:瞬态故障。网络超时、速率限制、临时不可用。接收端智能体应在退避(backoff)后重试。

FAILED_PERMANENT:任务本身存在问题。输入无效、能力不匹配、违反策略。重试会产生相同的结果;需要升级或重新设计任务。

将这些信号混为一谈会对运行产生重大影响。如果编排器将 NEEDS_CLARIFICATION 视为 FAILED_PERMANENT,它就会放弃可恢复的任务。如果它将 FAILED_PERMANENT 视为 FAILED_RETRIABLE,它就会陷入无限重试循环。大多数智能体框架的默认实现只有一个故障状态,导致团队在生产环境的异常行为迫使问题浮现时,才不得不后期补救。

置信度阈值在这里非常重要。设置一个最低可接受置信度(例如 0.3)意味着低于该阈值的智能体会发出 NEEDS_CLARIFICATION 或 PARTIAL_SUCCESS,而不是编造一个高置信度的答案。这是一项系统级策略,而非单个智能体的决定——它需要在消息验证层中强制执行。

看起来像模型错误的序列化陷阱

在智能体间系统中,最隐蔽的失败是那些表面上看起来像模型输出错误的序列化问题。你在下一步看到了垃圾信息,并假设上游智能体的推理出了错。而实际问题在于输出本身是正确的,但其呈现形式让下游解析器无法处理。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates