返回资讯中心
外部精选
软件工程
#开发者实时流

开发者用Forge引擎搭建MTG基准,让大模型组队打万智牌

来源标题:Show HN: Building a Magic the Gathering Benchmark

一位开发者基于开源万智牌规则引擎Forge搭建了LLM对战基准,让多个模型作为玩家进行8人锦标赛。测试发现模型会犯严重失误,例如Kimi在推理中本应保留Karakas未横置以弹回Emrakul,却未执行。该原型支持模型与人类、内置AI或其他模型对战。

Hacker News 最新12390asdjkas2026/11/2 · 2 天前30 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

最近我在玩《万智牌:竞技场》(Magic The Gathering Arena),用一套牌对着 MTG Arena 内置的 AI 机器人 Sparky 做测试。很明显 Sparky 并不怎么聪明,它似乎会随机出牌,甚至有些出牌逻辑是硬编码的。于是我有了个想法:如果模型真像 benchmark 宣称的那么强,那这事应该小菜一碟?于是我动手寻找让 LLM 玩这款游戏的办法,最终选定了 Forge——一个用 Java 写的非官方开源 MTG 规则引擎,可以在本地运行。折腾了几个小时后,我做出了一个能用的原型:agent 可以代替玩家,与人类、Forge 内置 AI 或另一个 agent 对局。那么下一步顺理成章:办一场 8 个 agent 互相对战的锦标赛,看看哪个模型能赢。问题也正是从这套测试框架的第一版开始暴露出来的。

一开始看比赛还挺有意思,但兴奋劲很快过去了,因为我发现这些 agent 犯下严重失误。比如这个例子:Kimi 的推理显示它应该留着 Karakas 不横置,这样就能像上一回合那样把 Emrakul 弹回 Fable 的手牌,从而保住自己。可它却犯下这个致命失误,输掉了这局,而且这还违背了它自己制定的计划。再看最后一个例子:Gemini 的计划把场上一个永久物误认成自己手里还没打出的咒语,结果它启动了这个永久物的异能,牺牲掉了自己唯一的生物。在这里模型完全误解了场面状态。模型的推理链明明表明它们知道该怎么做,所以我决定查一查,问题是不是出在我把它塞进去的那个“驾驶座”上。毕竟,如果刹车被人剪断、还被蒙上眼睛开车,车技再好也没用。

我发现的第一个问题是决策的产生方式。从模型到 Forge 引擎的许多选择,都是靠朴素地解析模型回复、匹配与动作或游戏对象对应的字符串来完成的。在下面这个例子里,模型要决定是保留起手手牌还是调度(mulligan)换一手。Opus 说它会保留这手牌,但仅仅因为提到了“mulligan”这个词,调度就被执行了。 模型说:"No reason to mulligan, I'll keep this hand." 解析器看到:MULLIGAN 游戏执行了:mulligan 这里的问题甚至不在模型身上,而在框架处理模型指令的方式。另一个问题是,框架没有把完整的游戏状态展示给模型,这也就解释了在那个 reanimate 例子里,Grok 为什么没意识到根本没有生物可供 reanimate。Kimi 没有保留 Karakas 不横置的问题,则是两方面原因叠加:框架提供的事件历史非常有限,而最大的问题在于,框架会悄悄回退到 Forge AI 及其自动选择——横置地、选择攻击者等等,这些选择乍看像是模型做出的,其实是框架设计上的疏漏。

很明显,一个孱弱的框架能让强大的模型显得很弱。我的新目标是把框架提升到这样的水平:它展示给模型的信息,与人玩家看游戏时能获得的全部信息完全一致。框架应该尽可能不阻碍模型打牌。

那么问题就变成了:如何让我的框架不再有所保留,让模型能用上 30000 多张不同的牌?通过观看之前的对局、观察模型在哪里没能采取行动,我找出并修复了以下问题。

现在我不再在模型回复里搜索文本,而是改用 tool call:模型通过填写带有固定字段的表单来回答每个决策,这样就不会从模型自己的思考里解读出任何东西。

现在每个决策都会把人类玩家能看到的一切展示给模型:从双方战场到坟场,甚至手牌和牌库里的牌数。旧框架还会截断文字量大的牌,或者留下占位文本。这里最重要的改动,是把引擎允许的每一个合法动作列成清单交给模型。

场上每个对象都会获得一个唯一 id,比如 @67,在它转换区域之前保持不变。这些 id 也让新的游戏日志变得可读,模型可以读日志,看清哪些同名的对象还在场上。完整日志不会全部放进上下文,因为对话越长模型表现越差。所以我只在上下文里保留最近、最相关的事件,同时给模型提供工具,让它们在需要时能搜索、翻页查看完整日志。

在旧框架里,Forge AI 会悄悄替模型做决策,而日志却错误地记成这是模型的选择。现在这些回退已经移除;如果模型确实因故没能做出选择,就会采用一个默认选项,并在日志里清楚标明。

我还给了模型查询官方 MTG 规则的能力,就像玩家可以查规则一样。但更有意思的工具是模拟某个动作会产生什么效果。这意味着模型可以预览打出某张牌会带来什么结果。这不算作弊,因为模型看不到对手的牌,也看不到自己牌库深处的内容,但它对避免失误很有用。比如,当模型想施放一个要消灭某个生物的咒语,而那个生物具有不灭(indestructible)、无法被消灭时,这个工具就帮上了忙:模型能看到模拟结果显示该生物不会被消灭,于是就不会浪费这个咒语。

我把框架打磨得足够完善,模型不仅与其他模型对局毫无困难,甚至还能跟我的几位人类朋友对局。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →