让 9 个 AI 自打一局狼人杀:AgentScope 多智能体协作案例实操
【免费下载链接】agentscopeBuild and run agents you can see, understand and trust.项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope
如果让 9 个 AI 自己打一局狼人杀,会发生什么?没有人工裁判,也没有规则脚本硬控——每个玩家都是一个 ReActAgent,由 AgentScope 的多智能体协作机制接管夜间行动与白天辩论。这篇文章从一条启动命令讲起,拆到底层三块积木,看看一个 AI 狼人杀博弈是怎么落地的。
🎮 一条命令跑起 9 人狼人杀
先跑起来。设置好 DashScope 的 API 密钥后,只执行这一条:
python examples/game/werewolves/main.py9 名 AI 玩家直接上桌:3 狼人、3 村民,外加预言家、女巫、猎人。整局游戏全靠自然语言推进——狼人在夜里密谋,村民在天亮后站队投票,你不需要手写任何一条规则分支。
改 main.py 里的model_name,就能在 Qwen、GPT 等主流大模型之间切换;中英文提示词和游戏存档也一并内置。下图是 AgentScope 多智能体控制台的协作现场,AI 智能体在同一会话里轮流发言、决策、行动:
角色分工:9 个 AI 玩家各自在做什么
狼人杀难在信息不对称,这个例子把 9 个角色拆成三条行动线:
- 狼队(3 狼人):夜里在私密通道里轮流发言、投票,谈拢了就锁定击杀目标。
- 神职(预言家、女巫、猎人):各自有技能触发条件——查验身份、救人或毒杀、阵亡反噬,用不用、用在谁身上,全由模型自己权衡。
- 村民(3 人):没有技能,只有推理。白天发言和投票环节,他们得从别人的话里找出破绽。
这个设计的妙处在于:规则代码里没有一行if 是狼人 then …。每个角色的行为,是模型推理加系统提示词涌现出来的。
🧱 三块底层积木:多智能体协作机制藏在哪
ReActAgent:每个角色的决策大脑
它解决的坑:怎么让模型输出"结构化决策",而不是一通自由发挥。
每个角色就是一个 ReActAgent:思考、发言、释放技能。技能释放靠结构化输出约束——比如"今晚狼队刀谁",必须以可被代码直接读取的字段返回,而不是埋在一段话里。狼队的深夜密谋就是一个轮询循环:
async with MsgHub(players.werewolves, enable_auto_broadcast=True) as werewolves_hub: for _ in range(MAX_DISCUSSION_ROUND * n_werewolves + 1): res = await players.werewolves[i % n_werewolves] if res.metadata.get("reach_agreement"): break每轮狼王发一次言,一旦reach_agreement为真就散会定刀。实现可以看 ReActAgent 源码。
MsgHub:带密道的群聊广播站
它解决的坑:怎么让"一部分人听见,另一部分人听不见"。
MsgHub 用发布-订阅模式做多智能体通信:把几个智能体丢进同一个 hub,消息就只在圈内流转。狼队讨论用 3 人密道;天亮了,再把所有存活玩家拉进公共频道广播:
async with MsgHub(players.current_alive, name="alive_players") as hub: await hub.broadcast(await moderator(Prompts.to_all_night))一行上下文,权限就划清了。下图是 AgentScope 控制台里智能体执行动作的演示,多智能体通信机制驱动的就是这类连续行动:
JSONSession:一键存档与读档
它解决的坑:一局打到一半崩了,或者你想明天接着玩。
9 人局动辄几十轮对话,JSONSession 把全体玩家的状态序列化到本地,下次启动从存档续上:
session = JSONSession(save_dir="./checkpoints") await session.load_session_state(session_id="players_checkpoint", **{p.name: p for p in players})实现见 JSONSession 源码。整局的夜晚/白天回合机,都写在 狼人杀主逻辑 里。
🎯 三个可玩性改造:每次只改一行
1. 把 AI 玩家换成真人。在 main.py 里把某个 ReActAgent 换成 UserAgent,就变成人机混战:
from agentscope.agent import UserAgent players[0] = UserAgent(name="HumanPlayer")2. 切换游戏语言。在 game.py 改一行 import,整局台词从中文切到英文:from prompt import ChinesePrompts as Prompts与EnglishPrompts二选一。
3. 调整角色策略。main.py 第 40–69 行的系统提示词定义了每个角色的发言风格和决策倾向。把狼人写得更激进、村民写得更保守,对局气质立刻不同。所有角色提示词集中在 prompt.py。
延伸阅读:只留两个入口
- examples/game/werewolves/game.py:读一遍夜晚/白天回合机,整个 AgentScope 多智能体案例就通了。
- src/agentscope/agent/:从智能体基类到结构化输出,三块积木对应的 ReActAgent 实战源码。
"智能体 + 通信中枢 + 存档会话"这套组合拳,拿去改提示词就能搬进拍卖、辩论或项目模拟。想动手的话,下一步就一条命令:
git clone https://gitcode.com/GitHub_Trending/ag/agentscope【免费下载链接】agentscopeBuild and run agents you can see, understand and trust.项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考