AI 测试笔记
用自动自我对局平衡 AI 卡牌游戏
Moonfall 让游戏自己把比赛打完,并给每一场完成的比赛打分,好在玩家遇到之前就抓出含混的卡牌。
Moonfall 的卡牌没有攻击力或生命值数值。每一次出牌都是一段提示词,由 AI 游戏主持当场决定它做什么。这就产生了一类单元测试抓不到的缺陷:卡牌这样写,故事那样暗示,局面却落在第三个地方。这三样要等一场比赛走完才会缠到一起。而且故事并非一次性的——一场完成的比赛可以变成有人分享出去的漫画故事书。
让游戏自己去玩
自动自我对局把没有真人坐在里面的 Moonfall 比赛完整跑完。真实服务器上由两个 socket 客户端占据玩家的位置,模拟玩家从合法着法中挑一个,故事系统则完全按照正式对局的方式把它结算掉。没有任何东西被 mock,所以不会出现这里通过、生产环境失败的情况。
比赛以批次为单位并行运行。一场奇怪的比赛什么也说明不了;同一种奇怪出现在二十五场中的六场,那就是一个可以去找的缺陷。
每场比赛都会留下一份轨迹:初始状态、每一个动作、故事系统的调用、它发出的补丁,以及局面最后真正落在哪里。把这些放在一起比对,才能把"刚才感觉不对"变成"第七回合的补丁移除了一张故事里从未提到的牌"。
给结果做评判
完成的比赛会走一段很短的阶梯。先是确定性检查,因为程序能拍板的事不该拿来争论。剩下的交给 LLM 裁判:它不打十分制的分数,而是回答二选一的问题,并引用决定该答案的那个回合。这两点都遵循了关于 LLM 评估和先推理再打分的公开建议。
最要紧的是通常被交给感觉的那一半:是否真的出现过令人意外的时刻,恐惧是文字挣来的还是只是宣称的,结算有没有尊重卡牌名字所许诺的东西。重复出现的发现会变成小提案,受限的改动在护栏下自动应用,并留下审计记录供监控和可选的介入。
十个批次显示了什么
每个点是一个二十五场的批次。只有完整跑完的比赛才计分。
故事变得意外得多。第一个批次里,裁判在 44% 的比赛中找到了真正令人意外且公平的时刻;最后两个批次则是 95%,然后是 100%。准确率如今提升得更慢——此前的多轮运行已经把它显著拉高,十个批次中始终保持在 92.6% 到 97.1% 之间。
两点说明。这里的准确率是估算值:从未被关联到已登记正确性缺陷的故事系统调用所占的比例,更适合用于批次之间的比较,而不是裁定任何单场比赛。另外,十个批次是试点:数百场比赛,而不是数十万场。
AI 卡组有可能在游戏里互相对战吗?
这套测试框架本身已经是一种自走棋:由 AI 操控的卡组彼此施压,故事系统叙述结果。它的某种形态放进 Moonfall 里也许会很有意思——人把注意力放在选牌和组卡上,而不是逐回合点击。这不是功能预告,只是这项工作在测试之外同样有意思的一个原因。
眼下它做的事要窄得多。Moonfall 本该让你意外,这套循环存在的意义,就是让那份意外来自比赛,而不是来自一张措辞含混的卡牌。