首页 / 第十章

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 的实践推理理论:

bdi_agent.py
"""家用机器人 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请求对方执行动作
acl_dialogue.py
"""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),中标者执行并回报结果。 整个过程没有中心强制分配,是市场机制式的协商。

contract_net.py
"""合同网协议模拟:一项运输任务的招标、投标、授标与执行"""

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)的领域。 下面用最优反应动态演示:两个机器人采集资源,必须一人采集、一人运输才能高效产出, 没有任何人下达分工命令,分工却能自发涌现。

marl_demo.py
"""多智能体协作博弈:最优反应动态与分工涌现"""

# 联合奖励矩阵 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 的经典配方是:

AI Agent = 大模型(推理/决策)+ 记忆 + 规划 + 工具调用
react_agent.py
"""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 理论。