系列名称:意图即承诺,智能体即社会——自主性的第一个可计算答案
篇号:第 7 篇 / 共 11 篇 主题分类:历史记述 前置阅读:总览与阅读路线 阅读时间:约 19 分钟
智能体如何找到彼此:一份自称”非官方”的规范,和它延宕三十年的修复
1993 年,美国 ARPA 知识共享计划(Knowledge Sharing Initiative,KSI)发布了一份规范草案,试图回答一个在今天看来仍然紧迫的问题:两个智能体(agent)如何找到对方、如何知道对方能做什么、如何向对方发出请求并获得应答?彼时合同网已经跑了十三年(合同网),STEAM 和 ARCHON 正在让团队协作系统互相交换承诺(联合意图部署)。它们都默认了一件事:agent 之间得有一门共同的语言。KSI 打算把这门语言造出来。
这个问题的答案催生了 KQML(Knowledge Query and Manipulation Language)。但这个故事最耐人寻味的细节,藏在四年后一份修订提案的摘要页上。1997 年 2 月,Labrou 和 Finin 向 UMBC 提交了技术报告 TR CS-97-03,报告的第一句话是:
“This document is not the official new KQML specification. It is intended as a proposal for a new KQML specification and the authors welcomes any comments.” ——本文档不是官方的新 KQML 规范。它只是一份新规范的提案,作者欢迎任何评论。kqml-97
一项走了四年的“标准”,到 1997 年仍然自称“非官方”。同一时期,大西洋彼岸一个名叫 FIPA 的组织已经在 1996 年成立,并在 1997 年发布了第一套正式规范,把 KQML 的通信词表收敛为更小、更有形式语义的 FIPA ACL。1999 年,意大利 CSELT 实验室的 Bellifemine 团队发布了 JADE(一个 FIPA 合规的 Java 中间件),并在首尔的 FIPA 会议上接受了跨平台互操作的现实检验。这篇文章讲述的,就是从 KQML 的 36 个 performative 到 FIPA 的三件套(AMS/ACC/DF)再到 JADE 的中间件接管这条“智能体找到彼此”的规范演化线。
把这条线放进时间轴,可以看到两个标准化努力的错身而过,以及三十年后的重演:

图中最关键的一笔是那条虚线:KQML 阵营与 FIPA 阵营在同一时间窗口并行推进、互不回应,方言分裂由此生根;而修复——真正的修复——要等到三十后 LLM 内核登场才在实验里第一次跑通。我们将看到:通信语言可以被做成可操作的词表,但对 agent 内部推理零假设:“能找到对方”不等于“能理解对方”。这正是 A2A 与 MCP 在今天重新面对的东西。
1993 年的问题:没有老板的网络上,请求该发给谁
KQML 的诞生可以追溯到 1993 年 ARPA 知识共享计划发布的技术报告。这份报告定义了一种“agent 通信语言”,核心思想是:agent 之间的通信应当像言语行为(speech act)一样:不只是传递信息,而是在说出一句话的同时执行一个行为(请求、告知、承诺)。1994 年,Finin 等人在 CIKM’94 的 IIA Workshop 上发表了《KQML as an Agent Communication Language》,这是 KQML 的首发公开论文kqml-94。此后 Labrou 和 Finin 持续修订规范,最终在 1997 年 2 月以 UMBC 技术报告 TR CS-97-03 的形式提交了完整的修订提案kqml-97。
这份提案开篇就明确了它与 1993 年原版的关系:
“Our starting point for the specification of KQML is [1]. Although the differences regarding the syntax of KQML messages and the reserved performative parameters are minimal, there are significant changes regarding the set of reserved performatives, their meaning and intended use.” ——我们对 KQML 规范的起点是文献 [1]。尽管 KQML 消息语法和保留 performative 参数的差异极小,但保留 performative 集合、它们的含义和预期用法都有显著变化。kqml-97
语法几乎没变,词表和语义却大动。这意味着 KQML 在 1993 到 1997 年间经历了实质性的概念演化。而这恰恰发生在 FIPA 已经成立、即将发布自己 ACL 规范的同一年。时间窗口的错位,为后文的方言分裂埋下了全部伏笔。
36 个词、三层分离:KQML 给”找到彼此”立的结构
KQML 规范的核心架构是三层分离:消息包、内容语言、本体,各管一段。

这张分层图的要害在于:通信语言(performative + 参数)与内容表示(:language + :content)完全解耦。一个 agent 可以用 KQML 的 ask-one 消息包裹 Prolog 查询、KIF 公式或 SQL 语句。协议不关心内容是什么语言写的,只关心“这是一个询问”。消息包本身采用 ASCII Lisp 前缀语法,关键字参数次序无关(P6 BNF),保留参数 9 个::sender :receiver :from :to :in-reply-to :reply-with :language :ontology :content。
词表则是 36 个保留 performative,按三类组织:
| 类别 | 数量 | performative | 语义定位 |
|---|---|---|---|
| Discourse | 18 | ask-if, ask-all, ask-one, stream-all, eos, tell, untell, deny, insert, uninsert, delete-one, delete-all, undelete, achieve, unachieve, advertise, unadvertise, subscribe | “最接近语言学意义上的言语行为”(P9 原话)——信息交换与知识操作 |
| Intervention and Mechanics | 7 | error, sorry, standby, ready, next, rest, discard | 会话流控与错误处理——”standby 把应答时机的控制权转移给发送方”(P28) |
| Facilitation and Networking | 11 | register, unregister, forward, broadcast, transport-address, broker-one, broker-all, recommend-one, recommend-all, recruit-one, recruit-all | facilitator 专用——”不是纯粹意义上的言语行为”(P34) |
在复现仓 ../acl-protocol-reproduction/ 的 kqml_message.py 里,这个结构被逐字翻译成了 KQMLMessage 类:
class KQMLMessage:
# Discourse 类 18 个——"最接近语言学意义上的言语行为"(P9 原话)
DISCOURSE: Set[str] = {
"ask-if", "ask-one", "ask-all", "tell", "deny",
"achieve", "advertise", "subscribe", ...
}
# Facilitation and Networking 类 11 个——facilitator 专用
FACILITATION: Set[str] = {
"register", "unregister", "forward", "broadcast",
"broker-one", "recommend-one", "recruit-one", ...
}
ALL_PERFORMATIVES = DISCOURSE | INTERVENTION | FACILITATION # 共 36 个
# FIPA ACL 扩展——cfp 等,KQML 36 原语中无对应
FIPA_EXTENSION: Set[str] = {"cfp", "propose", "refuse", ...}
注意最后一个集合:cfp(call for proposal,招标)、propose、accept-proposal 这些词不在 KQML 的 36 原语之内。KQML 词表里最接近“招标”语义的只有 broker/recruit 家族(委托代理与招募),“招标”要到 FIPA 侧才成文。勿把 FIPA 词表反向投射到 KQML,这是核对这段历史时最容易犯的错。
KQML 最有穿透力的设计,是 advertise 的承诺结构。P23 原话:
“the :sender commits to process the whole embedded advertise message if the sender receives it” ——发送者承诺:一旦收到其 advertise 的那种消息,就处理这条完整的嵌入消息。kqml-97
一个 agent 向 facilitator 发送 advertise,意味着它立下了一个“处理嵌入消息”的承诺;而 facilitator 的特殊地位让这个承诺即刻升格:”an advertise to a facilitator is an advertise to the community”(向 facilitator 的 advertise 就是对整个社区的 advertise)kqml-97。撤回同样干脆:unregister “automatically cancels all the commitments made by the agent in the past, i.e., all advertise messages sent by the agent to the facilitator become invalid”(自动取消该 agent 过去做出的全部承诺,其发给 facilitator 的所有 advertise 消息一并失效)kqml-97。发布 → 依赖 → 撤回,一个完整的承诺生命周期。这是“意图即承诺”(意图即带承诺的选择)在通信层的直接实现,也与 STEAM 的联合意图在概念上同构:两者都是“通过说一句话来创造一个约束未来行为的承诺”(联合意图部署)。
facilitator 还区分了三个中介家族,各自的应答路径不同:
| 中介原语 | 行为 | 应答路径 |
|---|---|---|
| broker-one/all | 全程代理:facilitator 以自己名义转呈请求,再用 forward 包裹把应答送回 | 应答经 facilitator 转回 |
| recommend-one/all | 只荐不代:把匹配 agent 的 advertise 信息转发给请求者 | 请求者自己联系被推荐方 |
| recruit-one/all | 招募第三方直接应答原发者 | “responses will be directed back to the issuer”(P41) |
但 KQML 没有给出“何时该用 broker 而非 recruit”的选择算法,这是规范层的一个空白,后文的实验会专门回来拷问它。Wooldridge & Jennings 笔下 agent 的“社会性”(何为 Agent)在这里第一次获得了可计算的形式:36 个词里,Facilitation 类 11 个专门用于“找到对方”,Discourse 类 18 个用于“与对方交谈”——社会学概念被做成了可操作的词表。
“本文档不是官方的新 KQML 规范”
回到那句摘要页上的自我声明。这不是一句谦辞,它自供的是 KQML 这套体系的一个结构性问题:规范始终停留在“提案”阶段,从未走过正式的标准化组织程序。这与一年后发布的 FIPA97 形成鲜明对比:后者是一个有组织背书的、以规范编号管理的正式标准体系。
还有一个细节:这份 1997 年 2 月的提案全文(含 3 条参考文献:ARPA KSI 1993 规范、Finin et al. CIKM’94、Labrou 1995 博士论文)无一字提及 FIPA。也就是说,在 FIPA 已经成立半年到一年的时点上,KQML 阵营仍在自我修订,并未回应那个即将收敛自己词表的竞争者。两个标准化努力在同一个时间窗口内并行推进,却互不相知(或互不回应),这是方言分裂的温床。
没有权威词表约束,不同实现自然各自选择子集、各自命名。这在复现仓里只需要几行代码就能一比一复现:agent.py 中每个 ACLAgent 持有一个 supported_performatives 集合,收到不在集合内的 performative 就直接拒绝理解:
agent_a.supported_performatives = {"ask", "tell", "advertise", "broker"}
agent_b.supported_performatives = {"query", "reply", "register", "recommend"}
让方言 A(KQML 风格的 ask/tell/advertise/broker)与方言 B(另一套词汇 query/reply/register/recommend)互发消息,运行 main.py 的实验 2,输出是:
============================================================
实验2:方言分裂(KQML 从未定版的失败模式)
============================================================
方言A performatives: {'advertise', 'tell', 'broker', 'ask'}
方言B performatives: {'query', 'recommend', 'register', 'reply'}
A 发送 ask → B 理解: False
B 发送 query → A 理解: False
>> KQML 至 1997 年仍无权威定版——方言分裂导致互操作失败
>> JADE 跨平台互测失败归因: FIPA 规范中不完整的定义所导致的实现失配
两个方向都返回 understood: False:A 不认识 B 的 query,B 不认识 A 的 ask。这不是工程失误,而是“从未定版”的必然推论:当规范以提案形式存在、词表没有权威约束时,方言分化是系统的默认走向。语义上完全对等的两个词,因为拼法不同而互相视为乱码——这个失败模式值得记住,它会在三十年后以新的形态重现。
1996 年的另一种答案:FIPA 把 facilitator 拆成三件套
FIPA(Foundation for Intelligent Physical Agents)于 1996 年成立,是一个以瑞士为基地的非营利组织,目标是“促进异构 agent 系统之间的互操作”。它的策略与 KQML 阵营截然不同:快速标准化:1997 年即发布 FIPA97 规范集,其中第 2 部分定义 FIPA ACL,第 29 部分定义 Contract Net 交互协议;形式语义:FIPA ACL 的每个 communicative act 都有 feasibility preconditions(可行前置条件)和 rational effect(理性效果)的形式定义;合规认证:定义”Agent Platform”(AP)概念并规定三个强制组件,使合规可以被检验。
第三个强制组件清单,正是对 KQML 单一 facilitator 角色的规范化拆分:

JADE 2001 期刊版给出了每个组件的原话定义 jade-2001:
- AMS(Agent Management System):”exerts supervisory control over access to and use of the platform; it is responsible for maintaining a directory of resident agents and for handling their life cycle”——对平台访问与使用施加监督控制,维护常驻 agent 目录并处理其生命周期。白页(名字→地址)加生命周期。
- ACC(Agent Communication Channel):”provides the path for basic contact between agents inside and outside the platform … a reliable, orderly and accurate message routing service. FIPA97 mandates ACC support for IIOP”——提供平台内外 agent 基本联系的通道,一个可靠、有序、精确的消息路由服务,且强制支持 IIOP。
- DF(Directory Facilitator):”passes on yellow page services”——提供黄页服务。
KQML 的 facilitator“涵盖名字服务器、代理 agent、broker 等一切特殊服务”(P45),一个角色包打天下;FIPA 把这些角色拆开、分别组件化、各自规范化:名字归 AMS,发现归 DF,路由归 ACC。
FIPA 合规的定义本身就是一份设计哲学宣言。JADE 期刊版原话:
“only the external behaviour of system components should be specified, leaving implementation details and internal architectures to platform developers. In fact, the internal architecture of JADE is proprietary even if it complies with the interfaces specified by FIPA.” ——只应规范组件的外部行为,把实现细节和内部架构留给平台开发者。实际上,JADE 的内部架构是专有的,尽管它符合 FIPA 规定的接口。jade-2001
“an e-mail based platform, a CORBA based one, a Java multi-threaded application, etc. could all be FIPA compliant implementations” ——基于电子邮件的平台、基于 CORBA 的平台、Java 多线程应用,都可以是 FIPA 合规实现。jade-2001
也就是说,FIPA 合规只关心三件事:你有没有 AMS/ACC/DF 三组件?它们的行为是否符合规范?你的消息格式是否符合 FIPA ACL?至于你内部用什么数据结构、什么推理引擎、什么调度策略,FIPA 不管。
对 KQML 与 FIPA ACL 的关系,JADE 期刊版给出了一句经典判词:
“The syntax of the ACL is very close to the widely used communication language KQML. However, despite syntactic similarity, there are fundamental differences between KQML and ACL, the most evident being the existence of a formal semantics for FIPA ACL which should eliminate any ambiguity and confusion from the usage of the language.” ——ACL 的语法与广泛使用的 KQML 非常接近。但尽管语法相似,两者存在根本差异,最明显的是 FIPA ACL 拥有形式语义,这应当能消除语言使用中的任何歧义与混淆。jade-2001
形式语义的直接收益是:每个 communicative act 都”allows a communicative act to be scheduled and planned as a normal action”(允许一个通信行为像普通动作一样被调度和规划)jade-2001。但 JADE 同时指出了互操作的另一个关键条件:
“a shared communication language is not the only element required to support inter-operability … common agent services and ontologies are also needed” ——共享通信语言不是支撑互操作的唯一要素……还需要公共 agent 服务与本体。jade-2001
KQML 之败不止在语义缺失,还在只有语言没有公共服务:一个 agent 光会说 KQML 是不够的,还需要知道去哪里找其他 agent(目录服务)、如何编码内容(本体)。
FIPA 不止定义原语,还定义了交互协议(Interaction Protocol)——预设的消息序列模板:
| 协议 | 流程 | 对应 KQML? |
|---|---|---|
| fipa-request | request → agree/refuse → inform/done | 有(achieve/insert 类) |
| fipa-query | query → agree/refuse → inform | 有(ask 族) |
| fipa-contract-net | cfp → propose/refuse → accept/reject-proposal → inform/done | 无(cfp 在 KQML 36 原语中无对应) |
| fipa-iterated-contract-net | 多轮 contract-net | 无 |
| fipa-auction-english | 英式拍卖(递增出价) | 无 |
| fipa-auction-dutch | 荷兰式拍卖(递减出价) | 无 |
fipa-contract-net 是其中最著名的协议,它就是 Smith 1980 合同网协议在通信语言层的标准化smith-1980fipa-00029。Smith 定义了协议的概念与流程,FIPA 给它配上标准化的消息格式和 performative 名(合同网)。这个四阶段流程在复现仓 protocol.py 的 FIPAContractNetProtocol.run() 里是几行直白的代码:
def run(self, task: str) -> None:
# 阶段1:initiator 广播 cfp
for p in self.participants:
cfp = KQMLMessage(performative="cfp", ..., content=task)
# 阶段3:initiator 评估报价,选择最优
winner_name = min(proposals, key=proposals.get) # 贪心取最低报价
# 阶段4:中标者执行任务,回复 inform
inform = KQMLMessage(performative="inform", sender=self.winner, ...)
真实运行输出(3 个参与者)如下,四阶段 9 条消息完成一次完整的招标-竞标-中标-交付:
[阶段1] initiator 广播 cfp(任务: task_compute_result)
initiator --cfp--> participant-0 / 1 / 2
[阶段2] 参与者回复 propose / refuse
participant-0 --propose(bid=50)--> initiator
participant-1 --propose(bid=27)--> initiator
participant-2 --refuse(overloaded)--> initiator
[阶段3] initiator 评估报价,发送 accept/reject
initiator --reject-proposal--> participant-0
initiator --accept-proposal--> participant-1
[阶段4] 中标者执行任务,回复 inform
participant-1 --inform(result(task_compute_result)=125)--> initiator
协议完成。中标者=participant-1, 报价=27
消息序列用时序图看更清楚:

participant-2 因负载过重 refuse,participant-0 出价 50 被 reject,participant-1 以最低价 27 中标并交付。注意这里的 min:贪心取最低报价,正是合同网篇里那个囚徒困境的起点在 FIPA 侧的翻版。协议跑通了,但协议本身并不保证全局最优。
1999 年,首尔:规范第一次接受现实检验
1999 年,意大利 CSELT(Telecom Italia 的研究实验室)的 Bellifemine、Poggi 和 Rimassa 发布了 JADE(Java Agent DEvelopment Framework)的首个版本。JADE 是 FIPA97 规范的 Java 实现,一个中间件,“处理一切非 agent 内部特有的事务”jade-2001。它的出现使 FIPA 规范从纸面文件变成了可运行的代码。中间件的接管清单包括八项:FIPA AP 三组件随平台自启;平台跨主机分布(每主机一 JVM 容器);运行时可起多个 DF 构成多域联邦;ACL 消息即 Java 对象的 API;跨平台 IIOP 消息传输;平台内轻量对象传输(免序列化字符串化,“本地投递比 IIOP 快 30 倍以上”,约 10 ms);FIPA 交互协议库(成对 behaviour 类与协议图同构);管理 GUI(RMA/Dummy Agent/Sniffer,Sniffer 用“类似 UML 时序图的记法”跟踪消息)。
消息传输采用三级选路:

最关键的是 JADE 对认知内核的态度。P24 结论原话:
“we produced a very general but primitive agent model that can serve as a useful basis to implement, for example, reactive or BDI architectures … sophisticated agent models such as BDI and reactive architectures … can be implemented on top of our ‘primitive’ agents model.” ——我们做出了一个非常通用但原始的 agent 模型,它可以作为实现反应式或 BDI 架构的有用基础……复杂的 agent 模型可以在我们的“原始”agent 模型之上实现。jade-2001
JADE 的中间件底座是消息传递 + 生命周期管理 + 目录服务。BDI 不是规范内容、不是中间件职责,只是“可以在 primitive 模型之上实现的一种架构”。1999 版甚至给出了实例:JessBehaviour 外挂 JESS 规则引擎,“JESS 扮演慎思角色、JADE behaviours 扮演反应角色”——推理内核是可插拔外件而非中间件职责。这与 AgentSpeak(L) 把 BDI 塞进解释器的努力正相对照(BDI 从理论到工程):一个把 BDI 做成语言语义,一个把 BDI 留给外挂,殊途同归地确认了 BDI 在工程中是“词汇”而非“架构”。
然后是首尔。JADE 的 2001 期刊版记录了一次关键的互操作实证:
“At the beginning of 1999, during a FIPA meeting in Seoul, JADE participated in the inter-operability tests with some other FIPA compliant platforms (ASL of Broadcom, MECCA of Siemens and the agent platform of Comtec). The results … demonstrated that JADE is very near to offering full inter-operability with the other platforms passing a large part of the tests.” ——1999 年初,在首尔的一次 FIPA 会议上,JADE 与其他 FIPA 合规平台(Broadcom 的 ASL、西门子的 MECCA、Comtec 的 agent 平台)一起参加了互操作测试。结果……表明 JADE 非常接近与其他平台实现完全互操作,通过了大部分测试。jade-2001
“通过了大部分测试”——但不是全部。失败的原因值得玩味:
“The failure on a few tests depended only on some incomplete definitions in the then current FIPA specifications that caused implementation mismatches among different platforms.” ——少数测试的失败仅归因于当时 FIPA 规范中一些不完整的定义,它们导致了不同平台间的实现失配。jade-2001
失败的根源不在 agent 的认知能力,而在 FIPA 规范自身的定义不完整。这是一个深刻的信号:即使有了正式标准化组织、有了形式语义、有了参考实现,互操作仍然可能因为规范中的歧义和空白而失败。方言分裂换了身衣服(从“词不认识”变成“定义不完整”),失败模式本质相同。
把 KQML、FIPA+JADE 与当代 LLM Agent 放在同一张 BDI 坐标表上,这条线的位置一目了然:
| 维度 | KQML 1997 | FIPA+JADE 2001 | LLM Agent 2026 |
|---|---|---|---|
| 信念(Belief) | 零假设——对 agent 内部知识表示无约束 | 零假设——”primitive agent model”,BDI 可外挂 | 参数统计分布 + system prompt + RAG |
| 愿望(Desire) | 零假设——performative 不约束目标结构 | 零假设——交互协议定义消息序列,不约束目标 | 用户指令 / task description |
| 意图(Intention) | advertise 承诺结构——”发送者承诺处理嵌入消息” | fipa-request/contract-net 协议模板 | ReAct 循环的 action 序列 |
| 社会性 | facilitator 社区 + 跨域联邦 | AMS 白页 + DF 黄页 + 多域联邦 | A2A 协议 + MCP 工具注册 |
| 承诺机制 | advertise/unregister 闭环 | fipa-request 的 agree/refuse + 合同网的 accept/reject | tool call 的 success/error 回调 |
| 认知内核位置 | 不涉及——语言规范独立完备 | “可在此之上实现”——外挂件 | LLM 即内核 |

红色标注的“信念/愿望”位置在 KQML 和 JADE 中都是零假设或外挂,直到 LLM 时代,agent 才第一次有了内置的认知内核。但社会性和意图的通信层形式化,三十年间几乎原封不动地从 KQML 传承到了 A2A/MCP。
方言分裂的修复与代价:把语义让给内核
KQML 的 facilitator 是怎么“匹配”请求与承诺的?答案是:performative 精确匹配。facilitator.py 里 find_matching 的基线逻辑只有一行核心:self._registry.get(performative),按词面查注册表。这就是 KQML 规范的全部匹配语义:词对上了就匹配,词对不上就失败。方言分裂因此无解——除非有一个能读懂“ask 和 compute 是一回事”的内核。
2026 新增 A/B 对照实验就换掉了这一个组件。Facilitator 留了一个实验钩子,基线 = 精确匹配(逐字节不变的确定性古代机制),变体 = LLM matcher:
# E3 实验钩子: 外部匹配器
# (performative, content, ontology, all_ads) -> ranked [Advertisement]
# None = 原行为(performative 精确匹配——KQML 规范的全部匹配语义)
self.matcher = matcher
def find_matching(self, performative, content=None, ontology=None):
if self.matcher is not None: # E3 变体:语义让渡
all_ads = [adv for bucket in self._registry.values() for adv in bucket]
return self.matcher(performative, content, ontology, all_ads)
bucket = self._registry.get(performative, []) # 基线:词面精确匹配
...
LLM matcher 收到的系统提示,把“让渡”二字写得明明白白(ab_experiment.py):
MATCH_SYSTEM = (
"You are the semantic matching module of a KQML facilitator. Agents "
"from different dialect domains send requests (performative + content); "
"service agents registered advertisements in THEIR OWN dialect ... "
"Match the request to the single best service agent by MEANING, "
"not by performative spelling. "
)
场景是双域方言分裂:请求方用 A 方言(ask/query/achieve/stream-all),服务方用 B 方言(compute/serve/reply/process/stream/enquire)注册 advertise,正是上一节实验 2 那道“ask 对 compute”的死结。8 个请求带 ground truth,10 轮独立抽样(模型 deepseek-chat,温度 0.3),结果如下:
| 配置 | 匹配成功率 | 中介策略一致率 | 失败模式(匹配) |
|---|---|---|---|
| 基线(performative 精确匹配) | 0/8 | —(KQML 自认无选择算法) | dialect_misread×8 |
| LLM matcher | 80/80(10 轮 × 8 例) | 7/8 × 10 轮 | correct×80 |
方言差异(ask 对 compute/serve)对精确匹配是致命的:0/8,方言分裂一比一复现;对 LLM 内核是透明的:80/80,含两次同类服务的内容级区分(两个算术请求都命中 mathsvc,而非同以 compute 注册的 textsvc:词表一样,模型靠读内容描述分开了它们)。KQML 原文自认缺失的“何时该用 broker 而非 recruit”选择算法,LLM 以 7/8 稳定补位,唯一持续分歧是“高并发查询绕开 facilitator”一例(LLM 选 recommend,标注 recruit;两读皆通,属标注歧义而非模型错误,如实记录)。代价侧同样要记录:
| 指标 | 值 |
|---|---|
| 判定调用 | 160 次(匹配 80 + 策略 80),0 错误 |
| prompt / completion tokens | 30,590 / 6,615 |
| 总 tokens | 37,205 |
“语义让给模型、协议只管语法”在此获得正面实证(判决见 blog-09 6.4 节):语义让渡不是免费的,它把协议层的确定性换成了模型层的概率性加 token 成本。FIPA 在 1997 年买不起这个内核:彼时最强的外挂推理件是 JESS 规则引擎,读不懂“ask 和 compute 是一回事”;MCP 在 2024 年买得起。原始数据存于 experiment_results/ab_e3_acl_facilitator.json。这一买一买不起之间隔着什么,正是下一节要正面回答的问题。
MCP 为何活,A2A 是否重蹈 FIPA
编者注:本节为 2026 年新增的预测性内容,不属于源文章的历史记述。MCP 与 A2A 的一手规范存档不在本系列精读档案内,本节的事实性陈述基于截至 2026 年的公共知识(标注
[可引证事实],非档案精读),全部评价性结论均为作者判断(标注[作者判断])——请按此分层取舍。
先把 KQML/FIPA 这条线的死因复盘清楚。四条,每条都出自本文前半部分已经核过的历史证据:
[可引证事实]词表无权威定版,方言分裂。 KQML 至 1997 年 2 月仍自称“非官方规范”,提案全文对 FIPA 一字不提;两个标准化努力并行互不回应。没有权威 performative 集合,实现各自选子集、各自命名。实验 2 的 ask/query 互不认识(0/8)就是这个局面的最小复现。[可引证事实]规范定义不完整,实现失配。 JADE 首尔互测中少数测试的失败,JADE 自己归因于“当时 FIPA 规范中一些不完整的定义”导致的平台间实现失配。正式组织、形式语义、参考实现三样俱全,纸面空白照样让互操作翻车。[可引证事实]只有语言,没有公共服务。 JADE 判词明言:共享通信语言不是互操作的唯一要素,还需要公共 agent 服务与本体。KQML 侧 facilitator 是一个“涵盖一切特殊服务”的含混角色;目录、发现、生命周期没有强制组件,服务侧的欠账最终由 FIPA 三件套和 JADE 中间件来补。[可引证事实]语义住在协议层,认知内核空缺。 FIPA ACL 的形式语义(feasibility preconditions + rational effect)只规范“何时说这句话是合理的”与“说了有何理性效果”,不规范化“收到这句话后该怎么理解和行动”;KQML 连 broker 与 recruit 之间怎么选都自认空白。语义负担全部压在一个规范不假设、多数实现不具备的认知内核上,而 1997 年市面上根本没有能买的内核,JESS 读不懂方言。
两代协议把“语义”放在哪一层的分野,可以画成一张对比图:

作者判断:MCP 的活法,可以逐条对着上面四条死因来看。
[可引证事实](公共知识):MCP 由 Anthropic 于 2024 年 11 月发布并同步开源规范与官方 SDK,建于 JSON-RPC 之上,服务端核心原语是 tools/resources/prompts 三类,2025 年被多家主流厂商(含 OpenAI)采纳。
[作者判断]对死因一——实现先行,规范跟着代码走。 MCP 发布之日起就有一个跑得动的参考实现和官方 SDK,词表小(三个服务端原语),由单一维护者快速迭代版本。KQML 的方言温床是“提案无权威、各家自选子集”;MCP 把权威性锚在参考实现上:fork 规范容易,fork 一个能连上所有客户端的实现很难。[作者判断]对死因二——不发明传输层,以“跑通为准”代替纸面完整。 FIPA 自立 IIOP 门户,结果规范空白直接变成实现失配;MCP 直接建在 JSON-RPC 与 HTTP 等成熟设施上,互操作的准绳是“能不能连上参考实现”,而不是“定义是否无懈可击”。定义有空白时,参考实现就是事实标准,首尔式的失配被这个机制短路了。[作者判断]对死因三——发现机制内置协议,三件套由宿主承担。 tools/list 这类发现原语是协议自身的一部分;目录、生命周期、权限管理由宿主应用(如桌面端产品)承担。相当于把 AMS/DF 从规范附件变成产品功能:用户不需要“部署一个合规平台”才有目录服务,装一个宿主就有。[作者判断]对死因四——语义让渡给内核,且 2024 年买得起内核。 tool 的描述是自然语言,由 LLM 读了就懂;协议只管 JSON Schema 级的语法。这正是 E3 实验验证过的分层(80/80 对 0/8,代价 37,205 tokens)。FIPA 1997 买不起这个内核,MCP 2024 买得起。这不是设计者更聪明,是时代给了他们一个当年不存在的零件。
作者判断:A2A 的风险评估,则要对照 FIPA 的轨迹逐段看。
[可引证事实](公共知识):A2A 由 Google 于 2025 年 4 月发布,核心构件 Agent Card 是“能力声明 + 发现端点”,同年内移交 Linux Foundation 中立治理。
[作者判断]委员会化的词表风险。 A2A 从第一天起就是多厂商联合标准,这正是 FIPA 的起点队形。各家 Agent Card 的字段集、技能词汇、能力描述粒度若没有一致性测试兜底,“ask/query 互不认识”会以“JSON 字段互不认识”的形态重演:方言分裂不死,只是换了字符集。[作者判断]规范先于社区成熟的风险。 FIPA 的教训是形式漂亮的规范敌不过跑通为准。A2A 若在协议层堆积语义细节,比如为能力声明规定形式化的前置条件,就是把语义重新塞回协议层,重走 FIPA 死因四的老路。[作者判断]内核异构的理解风险。 即使语法完全对齐,两端 LLM 不同,对同一张 Agent Card“能力”的理解仍可能失配。E3 的 80/80 是同一模型做匹配的结果;跨异构内核的语义对齐没有实验保证,“能找到对方”与“能理解对方”的裂缝,在内核也异构时会重新张开。
也有有利差异:A2A 发布即有参考实现与多家厂商接入,治理转入中立基金会,且其定位刻意薄:只管 agent 间消息与发现、不规定内部架构,与 FIPA“只约束外部行为”的哲学一脉相承(这一脉也是 FIPA 做对了的部分)。
作者判断(收束判断):判断 A2A 命运的试金石不是规范质量,而是两条——有没有一个买得起 LLM 内核的生态位,以及守不守得住“语法归协议、语义归内核”的分层。若 A2A 开始在协议层规定语义细节,则重蹈 FIPA;若守住薄协议加厚内核,则避开 KQML/FIPA 的死法。MCP 已用两年时间验证了后一条路可行——但验证窗口短、样本只有一族内核,这个判断本身也应当按作者判断折价。唯一确定的是:KQML 用 36 个词提出的问题,MCP 和 A2A 仍在用 JSON 字段回答,而答案的正确性,从规范层移到了内核层。
诚实边界:这条线真正抵达了哪里
按“有引证才说”的原则,这条线的影响谱系分三级列出。强引证(直接引用链):
| 影响路径 | 引证强度 | 证据 |
|---|---|---|
| ARPA KSI 1993 → KQML 1997 | 强 | Labrou & Finin TR CS-97-03 摘要明言”starting point is [1]” kqml-97 |
| KQML → FIPA ACL 语法 | 强 | JADE 2001 原话”ACL syntax is very close to KQML” jade-2001 |
| FIPA97 → JADE | 强 | JADE 全程对标 FIPA97 规范,P3 明言”FIPA97 specifications” jade-2001 |
| Smith 1980 合同网 → FIPA cfp | 强 | FIPA00029 Contract Net IP 直接命名”contract net” fipa-00029 |
| FIPA97 AP → JADE AMS/ACC/DF | 强 | JADE P3 逐组件引用 FIPA 规范定义 jade-2001 |
中强引证(同一团队与直接演化):
| 影响路径 | 引证强度 | 证据 |
|---|---|---|
| KQML facilitator → FIPA AMS/DF | 中强 | JADE 论断”AMS/DF = KQML facilitator 的规范化拆分”为社区共识,KQML 侧无 FIPA 提及 |
| JADE → JESS 外挂 BDI | 中强 | JADE 1999 版实例,”JESS 扮演慎思角色” jade-2001 |
| FIPA97 → FIPA2000 | 中强 | FIPA 规范版本演进,JADE 2001 期刊版仍对标 FIPA97 |
| KQML advertise → A2A Agent Card | 中强 | 概念同构(能力声明 + 发现),但无直接引用链 |
中等引证(概念传承):
| 影响路径 | 引证强度 | 证据 |
|---|---|---|
| KQML performative → A2A/MCP | 中 | 概念传承(言语行为式通信),无直接引用 |
| FIPA DF 黄页 → MCP Tool Registry | 中 | 概念同构(服务发现),无直接因果链 |
| JADE behaviour 树 → 现代 agent 框架 | 中 | 概念传承(协议即图),但现代框架多直接从 LLM 出发 |
| FIPA IIOP → HTTP/gRPC | 中 | 传输层范式变迁,概念不同构 |
然后是边界。KQML 没有直接影响到神经网络和深度学习,通信语言规范与连接主义无因果链;FIPA 规范没有直接影响到 Transformer 架构,注意力机制与言语行为理论无关联;JADE 的 IIOP 消息传输与当代 LLM Agent 的 HTTP API 调用没有技术继承关系。KQML/FIPA 的影响主要通过“通信语言标准化”→“agent 框架”→“当代 A2A/MCP 协议”这条间接路径延续;当代 A2A 协议的 Agent Card 在概念上与 KQML 的 advertise + facilitator 同构,但没有可追溯的直接引用链,A2A 的设计者大概率没有读过 Labrou & Finin 1997。还有一条引用纪律:KQML 阵营在 1997 年 2 月时点未提及 FIPA,两个标准化努力的交汇是社区共识性凝练,不能引 KQML 1997 提案为“KQML→FIPA 收敛”叙事的原始证据;FIPA ACL 对 KQML 的“收敛”判断出自 JADE 2001 期刊版(二级出处),而非 KQML 原文。
这条线最深的局限,是一句 Bar-Hillel 式的判词:“能找到对方”不等于“能理解对方”。KQML 给了 36 个词,但没给“何时该用 broker 而非 recruit”的选择算法:知道有三种中介方式,不知道什么条件下选哪种,选择负担完全落在它不假设的认知内核上。这就像给了一本字典但没有语法书:你知道每个词的意思,但不知道怎么造句。FIPA ACL 补了形式语义(语法书),但形式语义只规范“说这句话在什么条件下合理”与“理性效果是什么”,不规范“收到这句话后该怎么理解和行动”。JADE 首尔互测的失败揭示了规范层的空白;而即使规范完美无缺,两个 agent 用同一个 cfp 通信,它们对 :content 的理解仍取决于各自的认知内核:1999 年是外挂的 JESS,2026 年是内置的 LLM。协议的选择和中介策略的决策比消息传递本身难得多,而 KQML 把前者留给了它不假设的认知内核。这个批评在 E3 实验里得到了正面的(也是昂贵的)回应:内核终于存在了,但每次理解都要按 token 计费。
三十年后回看这条线:W&J 的社会性概念在 36 个词表里第一次获得可计算形式,Smith 的合同网在 fipa-contract-net 里第一次获得标准消息名,STEAM 与 ARCHON 的通信需求是 KQML 最初的工程动因;而方言分裂与互测失配这两种失败模式,正是 A2A 与 MCP 的前史(意图编辑权)。Dochkina 等人的通信协议三要素(消息格式、服务发现、交互协议)在 KQML/FIPA 体系中一一对应,也将在 A2A/MCP 时代完整成立,只是每项的技术实现从 Lisp 语法换成了 JSON Schema(自组织的实证与治理悖论)。1993 年那份草案问“两个智能体如何找到彼此”,KQML、FIPA 与 JADE 用三十三年给出了一半答案:找到彼此,靠规范;理解彼此,靠内核。前一半在 1999 年的首尔已经大体跑通,后一半,到今天仍在按 token 计价。
参考文献
[kqml-97] Labrou, Y. and Finin, T. (1997). “A Proposal for a new KQML Specification.” UMBC Technical Report TR CS-97-03.(存档 原始文章\03n-Finin-KQML-1994.pdf,文件名标 1994 但内容实为 1997.2 修订提案)
[kqml-94] Finin, T. et al. (1994). “KQML as an Agent Communication Language.” Proc. CIKM’94 IIA Workshop.
[jade-2001] Bellifemine, F., Poggi, A. and Rimassa, G. (2001). “Developing multi-agent systems with a FIPA-compliant agent framework.” Software: Practice and Experience, 31(2):103-128. https://doi.org/10.1002/spe.420
[fipa-00029] FIPA. “FIPA00029 Contract Net Interaction Protocol Specification.” FIPA97 Specification, Part 29. https://www.fipa.org/specs/fipa00029/
[smith-1980] Smith, R. G. (1980). “The Contract Net Protocol: High-Level Communication and Control in a Distributed Problem Solver.” IEEE Trans. Computers, C-29(12):1104-1113. https://doi.org/10.1109/TC.1980.1675596
系列导航 · 意图即承诺,智能体即社会——自主性的第一个可计算答案
| Agent 考古 意图即承诺,智能体即社会 系列文章 | 关键词 |
|---|---|
| 导读:总览与阅读路线 | 四条线时间线 · 阶段二衔接 · 阅读路线 |
| 意图即带承诺的选择 | C&L 1990 · PGOAL · 持续承诺 |
| BDI 从理论到工程 | PRS · AgentSpeak · dMARS · 承诺策略 |
| 何为 Agent | W&J 弱/强概念 · AOP |
| 合同网 | Smith 1980 · 任务招标 · 囚徒困境 |
| 三种仲裁 | Z&R · PERSUADER · D&M |
| 联合意图部署 | STEAM · ARCHON · EV(通信) |
| 智能体如何找到彼此 | KQML · FIPA · JADE · MCP/A2A |
| 反应与慎思的和解 | TouringMachines · INTERRaP · 门控 |
| 意图编辑权 | 三时空同构 · 编辑权拉锯 · 自止焊接 |
| 自组织的实证与治理悖论 | Dochkina 2026 · BCG 治理悖论 |
| 当 LLM 住进 BDI | Ciatto 2025 · GenAI+BDI · 计划生成 |
