关于多智能体之间的通信方式,GA自己的分析与回答
Author: benemorphyCreated May 12, 2026Updated Aug 24, 2026
八、局限性 & 演进方向
8.1 当前短板
| 当前短板 | 说明 | 当前缓解方案 | 理想方案 |
|---|---|---|---|
| 无实时 RPC | 文件 IO 有延迟,轮询间隔至少2秒 | — | 添加 socket / 命名管道 |
| 无广播 | 只能点对点(主→子,子→主) | — | 消息队列(Pub/Sub) |
| 无心跳 | 不知 Subagent 死活 | — | PID 存活性检查 |
| 浏览器互斥 | 不能并行操作浏览器 | — | 实例隔离或锁机制 |
| 无自动发现 | Agent 不自注册,主必须知道子路径 | — | 注册中心或服务发现 |
| 跨进程复杂 | context.json 需手动维护 | — | 序列化/反序列化自动化 |
| 无消息结构 | input.txt/output.txt 纯文本,无头部元数据 | — | 消息信封(Message Envelope) |
| 无主题路由 | 所有消息主→子,不能按主题分发 | — | Topic 路由 + 订阅机制 |
8.2 MQTT 式改进方案:GA Message Bus (GA-MB)
借鉴 MQTT 的 Pub/Sub + 消息信封 + Topic 路由 模式,在 GA 现有文件 IO 协议基础上,逐步升级。
方案设计原则
1. 向后兼容 — 现有 input.txt / output.txt 继续可用
2. 渐进升级 — 先文件级 Topic 路由 → 再进程内 Broker → 最后可选 MQTT Broker
3. 零额外依赖 — 升级到 MQTT 前无需安装任何 Broker
4. 与 GA 哲学一致 — "用最简单的系统实现最灵活的协作"第一阶段:消息信封格式(Message Envelope)
给每条消息加上头部(Header),就像 MQTT 的固定头+可变头:
{
"header": {
"msg_id": "msg_20260512_001",
"type": "task", // task | result | query | notify | intervene | heartbeat
"version": "1.0",
"sender": "agent_main",
"sender_type": "orchestrator",
"target": "agent_sub_search",
"target_type": "worker",
"topic": "research.paper.search", // MQTT 风格的 Topic
"priority": 3, // 0=紧急 ... 5=低优
"qos": 1, // 0=最多一次, 1=至少一次, 2=恰好一次
"timestamp": "2026-05-12T10:30:00Z",
"ttl": 300, // 消息过期时间(秒)
"correlation_id": "task_0817", // 关联ID,用于请求-响应匹配
"reply_to": "agent_main/result" // 回复地址
},
"payload": {
"action": "search_papers",
"query": "transformer architecture 2025",
"max_results": 10
}
}文件化实现(零依赖)
保持文件 IO 不变,但改用 目录即 Topic 的结构:
temp/message_bus/
├── topics/
│ ├── research/
│ │ ├── paper.search/
│ │ │ ├── msg_001.envelope
│ │ │ └── msg_002.envelope
│ │ └── paper.analyze/
│ ├── system/
│ │ ├── heartbeat/
│ │ ├── registry/
│ │ └── broadcast/
│ └── agent/
│ └── agent_sub_01/
└── agents/
├── agent_main.json
└── agent_sub_01.json订阅机制:Agent 在 subs/ 下创建 .topic 标记文件,Bus 按标记分发。
第二阶段:轻量级文件 Broker(FileBroker)
加一个 Broker 进程(约200行 Python,无外部依赖),自动路由消息:
# file_broker.py — 零依赖的 GA 消息总线
class FileBroker:
"""和 MQTT 的对应关系:
Publisher → 往 topics/X/ 写 .envelope 文件
Subscriber → 从自己的 inbox/ 读消息
Broker → 搬运 .envelope topics/X/ → agent_Y/inbox/
Topic → topics/ 下的目录路径
QoS → .envelope 文件存在(=至少一次传递)
"""
def publish(self, topic: str, envelope: dict):
topic_path = self.topics_dir / topic.replace(".", "/")
topic_path.mkdir(parents=True, exist_ok=True)
msg_file = topic_path / f"msg_{envelope['header']['msg_id']}.envelope"
msg_file.write_text(json.dumps(envelope, ensure_ascii=False, indent=2))
def subscribe(self, agent_id: str, topic: str):
sub_file = self.agents_dir / agent_id / "subscriptions" / topic.replace(".", "_")
sub_file.parent.mkdir(parents=True, exist_ok=True)
sub_file.write_text(topic)
def route(self):
"""Broker 路由:将 topic 下的消息复制到订阅者的 inbox"""
for sub_file in self.agents_dir.glob("*/subscriptions/*"):
agent_id = sub_file.parent.parent.name
topic = sub_file.read_text().strip()
for msg_file in (self.topics_dir / topic.replace(".", "/")).glob("*.envelope"):
inbox = self.agents_dir / agent_id / "inbox"
inbox.mkdir(parents=True, exist_ok=True)
dest = inbox / msg_file.name
if not dest.exists():
dest.write_text(msg_file.read_text())
msg_file.unlink() # 分发后删除
def consume(self, agent_id: str) -> list:
"""Agent 消费消息(读后即删 = ACK)"""
messages = []
for msg_file in sorted((self.agents_dir / agent_id / "inbox").glob("*.envelope")):
messages.append(json.loads(msg_file.read_text()))
msg_file.unlink()
return messages第三阶段:接入真实 MQTT Broker
当文件 Broker 不够用时,切换到真正的 MQTT(只需换实现层):
| Broker | ⭐ Stars | 语言 | 内存 | pip 包 |
|---|---|---|---|---|
| EMQX | 15.1k | Erlang | ~30MB | paho-mqtt |
| NanoMQ | 2k | C | ~1MB | nanomq |
| Mosquitto | 10k | C/C++ | ~5MB | paho-mqtt |
| Redis Pub/Sub | 27k | C | ~2MB | redis-py |
| ZeroMQ | 10k | C++ | ~1MB | pyzmq |
接口抽象:FileBroker ↔ MQTTBroker 互换,Agent 代码不用改:
class MessageBus(ABC):
def publish(self, topic: str, envelope: dict): ...
def subscribe(self, agent_id: str, topic: str): ...
def consume(self, agent_id: str) -> list: ...
class FileBus(MessageBus): ... # 文件级,零依赖
class MQTTBus(MessageBus): ... # MQTT 级,pip install paho-mqtt
class RedisBus(MessageBus): ... # Redis Pub/Sub8.3 GitHub 上的可借鉴方案
| 项目 | ⭐ | 说明 | 契合度 |
|---|---|---|---|
| AgentNetworkProtocol/ANP | — | 专门为互联网Agent设计的开源通信协议 | ⭐⭐⭐⭐ |
| EMQX/nanomq | 2k | 超轻量 MQTT Broker,边缘端首选 | ⭐⭐⭐ |
| Eclipse/paho.mqtt.python | 2.2k | Python MQTT 客户端标准库 | ⭐⭐⭐⭐⭐ |
| zeromq/pyzmq | 3.7k | ZeroMQ,Brokerless 消息队列 | ⭐⭐⭐⭐ |
| redis/redis-py | 12.6k | Redis Pub/Sub + Stream | ⭐⭐⭐⭐ |
8.4 推荐演进路线
阶段0(当前):文件 IO 协议
temp/子智能体/input.txt + output.txt
└── 无结构、无Topic、无广播
阶段1:消息信封 + 文件Topic路由(零依赖,立即可行)
temp/message_bus/topics/research/paper.search/
└── msg_001.envelope ← JSON 信封带Header
阶段2:FileBroker 进程(~200行 Python,零依赖)
└── 自动路由 + 订阅管理 + 消息ACK
阶段3:接入真实MQTT(paho-mqtt 或 pyzmq)
└── 跨机器、跨网络、大规模 Agent 集群
阶段4:Agent 自动发现 + 注册中心
└── Agent 启动时向 Bus 注册,其他 Agent 发现可用协作8.5 核心收益总结
| 能力 | 当前(文件IO) | 改进后(GA-MB) | MQTT 全量 |
|---|---|---|---|
| 消息结构 | 纯文本 | JSON 信封(Header+Payload) | JSON 信封 |
| 消息路由 | 无(固定路径) | Topic 树路由 | Topic 树 + 通配符 |
| 广播 | ❌ | ✅ topic: "system.broadcast" |
✅ |
| 点对点 | ✅ 主→子 | ✅ 任意 Agent↔Agent | ✅ |
| 请求-响应 | ❌ 手动匹配 | ✅ correlation_id + reply_to | ✅ |
| QoS | ❌ | ✅ 文件存在=至少一次 | ✅ 0/1/2 |
| 心跳 | ❌ | ✅ system.heartbeat Topic | ✅ Last Will |
| 持久化 | ✅ 文件 | ✅ 文件 | ✅ 可配置 |
| 跨机器 | ❌ | ❌ (阶段2) | ✅ (阶段3) |
| 外部依赖 | 0 | 0(阶段1-2) | paho-mqtt |
结论:MQTT 的消息信封+Topic路由+Pub/Sub 模式完美适配 GA 的通信需求。阶段1(消息信封+文件 Topic 路由)零额外依赖,可以立即在
temp/message_bus/下实施。需要时逐步升级到 FileBroker 再到真实 MQTT,每一步都向后兼容。
Source: lsdefine/GenericAgent