首页 / 第十章
10分布式人工智能与 Agent
单个智能再强,也需要协作来应对开放、复杂、分布的真实世界。本章是全书的收束: 从分布式人工智能的两大流派出发,手写一个会"相信、想望、意图"的 BDI 智能体, 再让多个智能体用 FIPA 风格的语言交谈、用合同网协议招标、在博弈中学会分工—— 这正是今日大模型智能体(AI Agent)与多智能体系统的思想源头。
10.1 分布式人工智能概述
20 世纪 80 年代,随着计算机网络与并行计算的发展,研究者意识到: 人类的智能大量产生于群体协作,把知识、控制与数据分布到多个自主节点上, 更能应对大规模、不确定、信息不完备的问题。 分布式人工智能(Distributed Artificial Intelligence, DAI)由此诞生。
| 研究方向 | 分布式问题求解 DPS | 多智能体系统 MAS |
|---|---|---|
| 出发点 | 把一个问题拆给多个节点并行求解 | 多个自主智能体各自有目标 |
| 目标关系 | 全局目标统一、预先设计 | 目标可能一致、冲突或需要协商 |
| 典型问题 | 任务分解、结果综合、负载均衡 | 协调、协商、通信、组织规范 |
| 典型例子 | 分布式传感网络、并行搜索 | 机器人足球、自动驾驶编队、电商竞价 |
DAI 的三个基本特征:分布性(数据与控制在空间上分散)、 独立性(各节点自主决策,无全局控制中心)、交互性(通过通信协作或竞争)。 它带来鲁棒性(单点故障不致全局瘫痪)、可扩展性与并行效率,但也引入了协调困难、 通信开销与目标冲突等新问题。
10.2 Agent 的概念与分类
◈ Agent(智能体)
Agent 是驻留于某一环境中,能够自主感知环境、做出决策并采取行动, 以实现其设计目标的计算实体。Wooldridge 与 Jennings 给出的"弱定义"包含四个基本特性:
自治性 Autonomy
无须人或其他实体直接干预,对自身行为与内部状态有控制权。
反应性 Reactivity
及时感知环境变化并做出响应。
主动性 Pro-activeness
不仅被动反应,还能抓住机会、主动采取行动实现目标。
社会性 Sociality
能通过通信语言与其他 Agent(或人)交互、协作与协商。
"强定义"进一步赋予 Agent 人类式的心智概念:信念(Belief)、愿望(Desire)、意图(Intention)等。
| 类型 | 思想 | 优点 / 缺点 |
|---|---|---|
| 慎思型(认知型) | 内部有符号化世界模型,用规划与推理决策 | 深思熟虑 / 响应可能迟缓 |
| 反应型 | "感知—行动"直接映射,无显式符号推理 | 响应快、鲁棒 / 难以处理长远目标 |
| 混合型 | 分层:底层反应、高层慎思 | 兼顾实时性与远见,实际系统主流 |
10.3 实战一:BDI 智能体
BDI 模型是最经典的慎思型智能体架构,源于哲学家 Bratman 的实践推理理论:
- 信念 Belief——智能体对世界和自身的认识(可能不完整或错误);
- 愿望 Desire——希望达到的状态,可能相互冲突;
- 意图 Intention——从愿望中选定并承诺执行的目标;
- 配套的三个过程:信念修正函数 BRF(感知更新信念)、 选项生成(信念产生愿望)、过滤(愿望筛成意图),最后执行规划库中的动作。
"""家用机器人 BDI 智能体:感知 -> 信念 -> 愿望 -> 意图 -> 行动"""
class BDIAgent:
def __init__(self, name):
self.name = name
self.beliefs = set() # 信念
self.intentions = [] # 意图栈
# 规划库:意图 -> 动作序列
self.plans = {
"充电": ["连接充电桩", "等待电量恢复"],
"带伞上班": ["检查雨伞", "出发去公司"],
"公园散步": ["换上运动鞋", "出门散步"],
"室内看书": ["取一本书", "在沙发阅读"],
}
# ① 信念修正:用传感器信息更新信念
def brf(self, env):
self.beliefs.clear()
self.beliefs.add("下雨" if env["weather"] == "雨" else "天晴")
self.beliefs.add("电量低" if env["battery"] < 30 else "电量充足")
# ② 选项生成:由信念产生候选愿望
def options(self):
desires = []
if "电量低" in self.beliefs:
desires.append("充电") # 高优先
if "下雨" in self.beliefs:
desires += ["带伞上班", "室内看书"]
if "天晴" in self.beliefs and "电量低" not in self.beliefs:
desires += ["公园散步"]
return desires
# ③ 过滤:从愿望中承诺一个意图(此处取优先级最高者)
def filter_intention(self, desires):
self.intentions = [desires[0]] if desires else []
# ④ 执行意图对应的规划
def execute(self):
if not self.intentions:
print(" 无可行意图,保持待机")
return
goal = self.intentions[0]
print(f" 承诺意图:{goal}")
for act in self.plans[goal]:
print(f" 执行动作:{act}")
def step(self, day, env):
print(f"== 第 {day} 天,环境:{env}")
self.brf(env)
print(f" 信念:{sorted(self.beliefs)}")
desires = self.options()
print(f" 候选愿望:{desires}")
self.filter_intention(desires)
self.execute()
if __name__ == "__main__":
robot = BDIAgent("家务机器人")
week = [
{"weather": "雨", "battery": 80},
{"weather": "晴", "battery": 80},
{"weather": "晴", "battery": 15},
]
for day, env in enumerate(week, 1):
robot.step(day, env)
== 第 1 天,环境:{'weather': '雨', 'battery': 80}
信念:['下雨', '电量充足']
候选愿望:['带伞上班', '室内看书']
承诺意图:带伞上班
执行动作:检查雨伞
执行动作:出发去公司
== 第 2 天,环境:{'weather': '晴', 'battery': 80}
信念:['天晴', '电量充足']
候选愿望:['公园散步']
承诺意图:公园散步
执行动作:换上运动鞋
执行动作:出门散步
== 第 3 天,环境:{'weather': '晴', 'battery': 15}
信念:['天晴', '电量低']
候选愿望:['充电']
承诺意图:充电
执行动作:连接充电桩
执行动作:等待电量恢复
同样的环境、同样的程序,行为完全由心智状态的变化驱动——这就是"认知智能体"的味道: 信念是它眼中的世界,意图是它许下的承诺。真实 BDI 系统(如 JACK、JaCaMo)还包含目标维护、 意图重新考虑、失败重试等机制。
10.4 实战二:智能体通信语言
协作的前提是通信。Agent 间交换的不是裸字节,而是言语行为(Speech Act): "告知""请求""承诺"本身就是行动。FIPA ACL(源自 KQML)规定了消息的交际语(performative) 与发送者、接收者、内容、回复标识等字段。常见语包括:
| 交际语 | 含义 |
|---|---|
| INFORM | 告知对方某个事实 |
| QUERY-IF | 询问命题是否成立 |
| CFP | 招标(Call for Proposals) |
| PROPOSE | 投标 / 提出方案 |
| ACCEPT / REJECT | 接受 / 拒绝方案 |
| REQUEST | 请求对方执行动作 |
"""FIPA ACL 风格的智能体消息与对话模拟"""
class ACLMessage:
def __init__(self, sender, receiver, performative, content, reply_to=None):
self.sender = sender
self.receiver = receiver
self.performative = performative
self.content = content
self.reply_to = reply_to
def __repr__(self):
return (f"[{self.performative}] {self.sender} -> {self.receiver}:"
f"{self.content}")
class MessageSystem:
def __init__(self):
self.boxes = {}
def register(self, name):
self.boxes[name] = []
def send(self, msg):
self.boxes[msg.receiver].append(msg)
class Agent:
def __init__(self, name, system):
self.name, self.system = name, system
system.register(name)
def send(self, to, perf, content, reply_to=None):
self.system.send(ACLMessage(self.name, to, perf, content, reply_to))
def run(self):
for msg in list(self.system.boxes[self.name]):
self.system.boxes[self.name].remove(msg)
self.handle(msg)
def handle(self, msg):
print(msg)
class WeatherAgent(Agent):
def handle(self, msg):
print(msg)
if msg.performative == "QUERY-IF":
self.send(msg.sender, "INFORM", "今日晴转多云,22~28℃", msg)
class PlannerAgent(Agent):
def handle(self, msg):
print(msg)
if msg.performative == "INFORM":
print(f" ({self.name} 收到天气,决定:适宜外出,已更新日程)")
if __name__ == "__main__":
sys_ = MessageSystem()
planner = PlannerAgent("规划智能体", sys_)
weather = WeatherAgent("天气智能体", sys_)
planner.send("天气智能体", "QUERY-IF", "今天会下雨吗?")
weather.run() # 天气智能体回答
planner.run() # 规划智能体接收并处理
[QUERY-IF] 规划智能体 -> 天气智能体:今天会下雨吗? [INFORM] 天气智能体 -> 规划智能体:今日晴转多云,22~28℃ (规划智能体 收到天气,决定:适宜外出,已更新日程)
10.5 实战三:合同网协议(任务招标)
合同网协议(Contract Net Protocol, CNP)是最著名的任务分配机制, 模拟工程招标:管理者发布任务公告(CFP),有能力的智能体投标(PROPOSE), 管理者评标并授标(ACCEPT/REJECT),中标者执行并回报结果。 整个过程没有中心强制分配,是市场机制式的协商。
"""合同网协议模拟:一项运输任务的招标、投标、授标与执行"""
class Task:
def __init__(self, name, weight, destination):
self.name, self.weight, self.destination = name, weight, destination
class Bidder:
def __init__(self, name, capacity, price, days):
self.name, self.capacity = name, capacity
self.price, self.days = price, days
def bid(self, task):
if self.capacity < task.weight:
return None # 能力不足,放弃投标
return {"bidder": self, "price": self.price, "days": self.days}
def contract_net(manager, task, bidders):
print(f"【招标公告】{manager}:{task.name},"
f"{task.weight}吨货物运至{task.destination},请有意者投标")
proposals = []
for b in bidders:
p = b.bid(task)
if p:
print(f"【投标】{b.name}:报价 {b.price} 元,{b.days} 天送达")
proposals.append(p)
else:
print(f"【弃标】{b.name}:运力 {b.capacity} 吨,无法承运")
winner = min(proposals, key=lambda p: p["price"]) # 最低价评标
print(f"【授标】{manager} 决定由 {winner['bidder'].name} 中标")
print(f"【执行】{winner['bidder'].name} 运输中…… "
f"{winner['days']} 天后货物送达,合同完成 ✔")
return winner
if __name__ == "__main__":
task = Task("3 吨电子元件运输", 3, "上海")
bidders = [
Bidder("迅捷物流", capacity=2, price=4000, days=1),
Bidder("顺路车队", capacity=5, price=6000, days=3),
Bidder("安心快运", capacity=8, price=8500, days=2),
]
contract_net("供应链调度中心", task, bidders)
【招标公告】供应链调度中心:3 吨电子元件运输,3吨货物运至上海,请有意者投标 【弃标】迅捷物流:运力 2 吨,无法承运 【投标】顺路车队:报价 6000 元,3 天送达 【投标】安心快运:报价 8500 元,2 天送达 【授标】供应链调度中心 决定由 顺路车队 中标 【执行】顺路车队 运输中…… 3 天后货物送达,合同完成 ✔
评标函数换成 price + α·days 就能权衡价格与时效;
实际系统中还需处理流标、转包、违约与多轮谈判。合同网广泛用于智能制造调度、
物流配载、计算资源(云计算竞价)与卫星协同。
10.6 多智能体强化学习:在博弈中学会分工
当环境中同时存在多个学习者,一个智能体的最优策略依赖其他智能体的策略, 问题就从马尔可夫决策过程升级为随机博弈,这是多智能体强化学习(MARL)的领域。 下面用最优反应动态演示:两个机器人采集资源,必须一人采集、一人运输才能高效产出, 没有任何人下达分工命令,分工却能自发涌现。
"""多智能体协作博弈:最优反应动态与分工涌现"""
# 联合奖励矩阵 R(智能体1的动作, 智能体2的动作)
PAYOFF = {
("采集", "采集"): 1, # 都采集,无人运输
("运输", "采集"): 10, # 分工:1采集 2运输
("采集", "运输"): 10, # 分工
("运输", "运输"): 1, # 都运输,无人采集
}
ACTIONS = ["采集", "运输"]
def best_response(who, other_action):
"""给定对方动作,选择使联合奖励最大的自身动作。"""
if who == 1:
return max(ACTIONS, key=lambda a: PAYOFF[(a, other_action)])
return max(ACTIONS, key=lambda a: PAYOFF[(other_action, a)])
if __name__ == "__main__":
a1 = a2 = "采集" # 初始策略
print("轮次 机器人1 机器人2 团队奖励")
for rnd in range(4):
reward = PAYOFF[(a1, a2)]
print(f" {rnd} {a1} {a2} {reward}")
new_a1 = best_response(1, a2) # 机器人1 先调整
new_a2 = best_response(2, new_a1) # 机器人2 随后适应
if (new_a1, new_a2) == (a1, a2):
print("策略不再变化 -> 系统达到均衡,分工稳定")
break
a1, a2 = new_a1, new_a2
轮次 机器人1 机器人2 团队奖励 0 采集 采集 1 1 运输 采集 10 2 运输 采集 10 策略不再变化 -> 系统达到均衡,分工稳定
第 0 轮两机都采集、奖励只有 1;机器人 1 单方面改变动作后奖励跃升到 10, 机器人 2 发现保持采集最优——分工就此固化。这正是博弈论中纳什均衡的迭代到达过程。 真正的 MARL(如独立 Q 学习、QMIX、MAPPO)用神经网络与联合训练处理更大规模的合作与竞争, 被用于机器人足球编队、无人系统协同与游戏 AI(如 OpenAI Five)。
10.7 大模型时代的智能体与展望
2023 年以来,大语言模型让 Agent 获得了通用"大脑"。现代 AI Agent 的经典配方是:
- ReAct 循环:思考(Reason)→ 行动(Act,调用搜索/代码/API)→ 观察(Observation)→ 再思考, 与产生式系统的"匹配-冲突消解-执行"循环遥相呼应;
- 多智能体框架:AutoGen、MetaGPT、CrewAI 让多个角色化 Agent 分工协作完成软件开发、研究报告;
- 具身智能:Agent 接入机器人身体,在物理世界感知行动;
- 经典 DAI 的回归:微服务编排、多机器人系统、智能电网、自动拍卖与网约车调度, 都是合同网、拍卖、组织模型等经典思想在产业中的延续。
"""ReAct 智能体骨架(工具调用以桩函数模拟,可替换为真实 LLM 与 API)"""
def search_tool(query):
# 真实场景中调用搜索引擎 API
return f"搜索结果:{query} -> 今日晴,气温 22~28℃"
def calculator(expr):
return str(eval(expr)) # 教学演示,生产环境需沙箱解析
TOOLS = {"search": search_tool, "calc": calculator}
def react_agent(question, max_steps=4):
scratchpad = [] # 思考-行动-观察的工作记忆
print("用户问题:", question)
for step in range(max_steps):
# 规则模拟 LLM 的决策(真实实现中由大模型输出)
if step == 0:
thought, action, arg = "需要先查到天气", "search", "今天天气"
elif step == 1:
thought, action, arg = "信息已足够,可以作答", "finish", "今天天气晴,适合外出"
else:
break
print(f"思考{step+1}:{thought}")
if action == "finish":
print("最终回答:", arg)
return arg
observation = TOOLS[action](arg)
print(f"行动:{action}({arg!r}) -> 观察:{observation}")
scratchpad.append(observation)
if __name__ == "__main__":
react_agent("今天适合出门跑步吗?")
用户问题: 今天适合出门跑步吗?
思考1:需要先查到天气
行动:search('今天天气') -> 观察:搜索结果:今天天气 -> 今日晴,气温 22~28℃
思考2:信息已足够,可以作答
最终回答: 今天天气晴,适合外出
✦ 结语
从第一章的图灵测试,到本章的多智能体协作,我们走过了知识表示、确定性与不确定性推理、 搜索、计算智能、机器学习、专家系统、自然语言处理与智能体——它们看似不同,实则同一条主线: 如何在不确定的世界中,表示知识、做出决策、积累经验、并与他者协作。 愿你把这些代码当作思考的起点,亲手构建自己的智能系统。
本章小结
- DAI 包括分布式问题求解(DPS)与多智能体系统(MAS),核心特征是分布性、独立性、交互性。
- Agent 的四大基本特性:自治性、反应性、主动性、社会性;架构上分为慎思型、反应型、混合型。
- BDI 模型以信念、愿望、意图刻画心智状态,经"信念修正—选项生成—过滤—执行"循环运作。
- FIPA ACL 用交际语标准化通信;合同网协议以招标-投标-授标实现分布式任务分配。
- 多智能体学习处于随机博弈框架,个体适应可自发形成分工与纳什均衡。
- 大模型智能体以"LLM+记忆+规划+工具"复兴并发展了经典 Agent 理论。