3.1 镇民的言语行为:KQML 与 FIPA-ACL


3.1 镇民的言语行为:KQML 与 FIPA-ACL

摘要:智能体通信语言(ACL)让镇民的消息不止传数据,更携带行为——请求、承诺、拒绝、通知。本节讲言语行为理论的语言学根基,逐字段解剖 KQML 与 FIPA-ACL 两种标准,解释"信封与信纸分离"的三层架构(消息层、内容语言、本体),并实现一个消息校验与路由的迷你邮局。

「Performative」——把这个术语挂在嘴边,你就摸到智能体通信的门槛了。上一章末尾镇民有了脑子与档案,这一章开邮政局,先解决最基本的问题:镇民开口说的第一句话,应该长什么样?答案藏在语言哲学家那里:说话本身就是做事。这一节是第 3 章的地基,后面的协商与合同网,全都靠这里的消息格式承载。

说话就是做事:言语行为理论

日常语言哲学家奥斯汀与塞尔发现,人类的许多句子不是在描述世界,而是在改变世界:"我保证明天到"不是在报道一个事实,而是当场创建了一个承诺。一句话可以拆出三层:言内行为(说出的字串本身)、言外行为(这句话做了什么——请求、警告、承诺)、言后行为(对听者产生的效果——被说服、被吓到)。智能体通信语言借鉴的正是中间那层:消息的核心不是载荷,而是它施加的言语行为类型

于是"帮我抬一下桌子"与"桌子很沉"载荷相近,言外行为完全不同:前者是请求,镇民收到后有义务回应接受或拒绝;后者是断言,收下即可。通信语言把这个类型显式做成消息的第一个字段——原语(performative / communicative act)。

图 3-1 KQML 消息解剖:信封、信纸与词汇表

图 3-1 KQML 消息解剖:信封、信纸与词汇表

KQML:知识查询与操作语言

KQML 是早期影响最大的智能体通信语言,出生在知识共享计划的时代。它的消息以原语开头,后跟一串冒号参数。常用原语分四族:

信息族tell(我断言……为真)、deny(我撤回……)、untell。发 tell 的镇民对内容负责,收信方可以选择不信——信任问题留给第 5 章。

查询族ask-ifask-oneask-allstream-all。区别在答案数量与交付方式:要一个还是要全部、一次给完还是边算边流。

请求族achieve(请让这个目标成真,怎么做你定)、request(请执行这个具体动作)、recommend-one(谁适合干这事)。

响应族replysorry(办不到,附带原因)。KQML 的 sorry 是个诚实的设计——失败必须回话,不许装死。

参数里最要紧的三个::language 声明信纸用什么语法写,:ontology 声明用哪套词汇表,:content 是信纸本身。信封只管"怎么说",信纸交给内容语言,词汇交给本体——三层解耦是 KQML 留给后人的最大工程遗产。

FIPA-ACL:标准化的收编

FIPA 标准化组织后来收编了这套思想,产出 FIPA-ACL。消息结构同源(原语加参数),但原语家族更精细,语义用形式化的前置条件与后置条件定义——每条消息像合同条款一样写明"发送前必须满足什么、发送后算数什么"。常用的几条:

request(请替我执行动作)、agree/refuse(接单/拒单)、inform/confirm/disconfirm(告知与确认)、cfp(招标邀请,第 3.2 节合同网的主角)、propose(投标报价)、accept-proposal/reject-proposal(授标与流标)、cancel(撤回先前请求)、not-understood(没看懂,附原因)。

FIPA 还顺手规范了配套件:智能体管理服务(名字服务,镇民按名投递)、消息传输服务(管编码与重传)。平台层面的血亲 JADE 正是实现这一套,第 8 章工坊再会。

💡 读消息的口诀:先看原语定行为,再看内容语言定语法,最后看本体定词义。三步走完,一条陌生消息就能安全处理;跳过任何一步,就可能把"问价"当成"报价"闹出事故。

实现一个迷你邮局

理论到手,写代码。下面的迷你邮局实现消息的合法性校验(必填字段)、原语语义检查(响应必须携带会话标识)与按名字路由,是第 4 章合同网实验的通信底座。

REQUIRED = {"performative", "sender", "receiver", "content"} VALID_ACTS = {"tell", "ask-one", "achieve", "request", "inform", "agree", "cfp", "propose", "accept-proposal", "refuse", "sorry"} # 每种开场原语允许的应答原语:会话语义表 REPLY_RULES = {"ask-one": {"tell", "inform", "sorry"}, "cfp": {"propose", "refuse"}, "request": {"agree", "refuse", "inform"}} def validate(msg): """邮局收件三查:字段齐、原语合法、会话可闭合。""" missing = REQUIRED - set(msg) if missing: return f"not-understood: 缺字段 {sorted(missing)}" if msg["performative"] not in VALID_ACTS: return "not-understood: 原语不在登记簿" if msg["performative"] == "propose" and "in-reply-to" not in msg: return "not-understood: 投标必须挂在某次招标下" return "ok" class PostOffice: """按名字路由的迷你邮局,带会话登记与会话语义检查。""" def __init__(self): self.boxes = {} # 镇民信箱 self.sessions = {} # 会话号 -> (发起人, 开场原语) def register(self, name, handler): self.boxes[name] = handler def deliver(self, msg): status = validate(msg) if status != "ok": return self.boxes[msg["sender"]](status) if "reply-with" in msg: # 登记新会话及其开场行为 self.sessions[msg["reply-with"]] = (msg["sender"], msg["performative"]) if "in-reply-to" in msg: # 应答须答非所问的检查 sess = self.sessions.get(msg["in-reply-to"]) if sess is None: return self.boxes[msg["sender"]]( "not-understood: 会话不存在") opener, opening_act = sess allowed = REPLY_RULES.get(opening_act, VALID_ACTS) if msg["performative"] not in allowed: return self.boxes[msg["sender"]]( f"not-understood: {opening_act} 会话不接受 " f"{msg['performative']} 应答") return self.boxes[msg["receiver"]](msg) # 镇民注册:收信只是打印,真实镇民会触发 BDI 事件 post = PostOffice() post.register("water-office", lambda m: print("水务局收到:", m["performative"], m["content"])) post.register("mill-agent", lambda m: print("磨坊收到:", m)) post.deliver({"performative": "ask-one", "sender": "mill-agent", "receiver": "water-office", "content": "(price well east)", "reply-with": "q-17", "language": "FIPA-SL", "ontology": "town-water"}) post.deliver({"performative": "propose", "sender": "mill-agent", "receiver": "water-office", "content": "(bid 12)", "in-reply-to": "q-17"}) # 在问价会话里投标:语义不合,退回

第二封消息演示了邮局的把关作用:把投标挂在"问价"的会话下——会话存在,但 ask-one 开启的会话只接受告知类应答,投标被原样退回 not-understood会话号是消息的脐带,开场原语是会话的基因——多轮协商里每条响应不仅要能追溯到所属请求,行为类型还得与开场行为兼容,这是 FIPA 会话协议的核心纪律。

消息设计的工程守则

原语选型表是给工程人的速查卡:

你想让对方做什么 用哪条原语 对方义务
告知一个事实 inform / tell 可信可不信,可要求证据
求一个答案 ask-one / query-ref 必须回复答案或 sorry
请人办事(过程你不管) achieve 回 agree 或 refuse
请人办指定动作 request 同上,且拒绝时可给理由
招标 cfp 须回 propose 或 refuse
接标与流标 accept / reject-proposal 授标后即成契约,见第 5 章

⚠️ 常见坑:把 informrequest 用。断言"水井快干了"并不构成"请你去修"——听者没有任何行动义务。混用两者的系统会周期性地出现"我说了它怎么不动"的灵异故障,根因都是言外行为选错了。

沙盘推演小结

邮政局开张首日,镇民学会了把每句话的第一字段写成行为:问价用 ask-one,接活用 achieve,流标用 reject。信封管行为、信纸管内容、本体管词义的三层设计,让磨坊与水务局这对从未谋面的镇民第一次无歧义地对话。但"能说话"离"能谈成事"还差得远——下一节让镇民讨价还价:多轮报价、让步策略,以及把整个承包市场标准化的合同网协议。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U