我构建了一个2D物理竞技场,让LLM智能体在其中实时进行剑斗。结果发现,这出人意料地成为测试战术推理能力的绝佳方式。

Reddit r/AI_Agents 工具

摘要

Stickblade Arena 是一项新基准测试,让LLM智能体在2D物理刀剑格斗模拟器中控制布娃娃角色,测试其在对抗压力下的多回合战术推理、空间感知和实时决策能力。早期结果揭示了能力差距:DeepSeek R1在近战中占据主导地位,但因时间限制无法使用弓箭,而小模型在近距离战斗中表现出色。

**TL;DR** — 我构建了一个名为 **Stickblade Arena** 的基准测试:两个 LLM 在一个 2D 物理模拟器中运行 agent 循环——每模拟 3 秒,每个 agent 收到一个 JSON 世界状态,有大约 15 秒的时间提交一个动作,然后物理引擎解决后果。人类匿名投票谁打得好,每个(模型、武器、锋利区域)组合追踪 ELO 分数。它揭示了一些标准评测无法发现的性能差距。 # 为什么我要构建这个 大多数 LLM 评测都是 **静态且封闭形式** 的——比如 MMLU、HumanEval、MT-Bench。它们测试的是模型 *知道什么*,而不是它是否能在 24 个对抗回合中,在惩罚糟糕空间推理的确定性环境中保持一个计划的连贯性。所以我构建了一个能做到这点的评测。 Agent 循环极其简单: ``` textloop: state = build_state(me, opponent, last_events) # ~600 字节 JSON reply = llm.decide(state) # 15 秒截止 controller.execute(reply) # 3 秒物理模拟 events = combat_system.resolve_hits() ``` 每一回合模型收到的内容类似: ```json { "turn": 4, "my_hp": 67, "enemy_hp": 80, "distance": 142, "me": { "torso":[412,150], "head":[412,191], "weapon_tip":[461,180], "facing": 1, "velocity":[30,-2] }, "enemy": { "torso":[554,150], "head":[554,193], "facing":-1 }, "relative": { "dx":142, "dy":0, "enemy_is":"right", "facing_enemy":true }, "ranged_hint": { "arrow_flight_time_s":0.20, "vertical_drop_to_compensate":24 }, "enemy_last_action": "guard_high", "last_turn_hits": [ { "by":"enemy", "zone":"edge", "damage":4.1, "was_sharp":false } ] } ``` 并且必须回复一个战术动作 + 步法(MACRO 模式)或者身体**每个关节**的伸展/弯曲/保持/放松状态(JOINT 模式——基本上就是 Toribash 风格)。 # 我实际测试的是什么 | 能力 | 标准评测 | 这个评测 | |:-|:-|:-| | 静态知识 | ✅ MMLU | 不测试 | | 多轮连贯性 | ❌ 大多单轮 | ✅ 24 回合状态连续性 | | 实时截止时间 | ❌ 无时间预算 | ✅ 每回合 15 秒,超时判负 | | 空间推理 | 部分 | ✅ 连续 2D 物理 | | 约束满足 | 部分 | ✅ 只有特定武器区域才能造成伤害 | | 对抗压力 | ❌ 固定对手 | ✅ 对手是 *另一个同样在适应的 LLM* | | 基于结果的创造力 | ❌ 基于文采判断 | ✅ 基于谁打出致命一击判断 | # 看过几百场战斗后的意外发现 * **DeepSeek R1** 在 MACRO 模式下剑术占优(它确实会蓄力然后跨回合连贯出剑),但 **输在弓箭上**——其冗长的推理链会在速射时耗尽 15 秒预算 * **小模型(Llama 3.2 3B)** 在 **匕首/缠斗距离** 上表现出超常水平——它们不会对近距离博弈过度思考 * **GPT-OSS 120B** 拥有最一致的多回合计划;几乎可以看到它在执行一个三连击杀链 * **JOINT 模式极其残酷**——即使强模型也难以将“伸展肩膀 + 弯曲肘部”组合成一次连贯挥击。战略规划与具身运动规划之间存在巨大差距 * 那些忽略 `relative.facing_enemy` 的模型第一次攻击就会落空,再也无法挽回。这个单一字段清晰地测试了模型是否真正解析了状态 匿名投票设置(服务器端随机化哪个模型变成绿色或蓝色布娃娃)意味着排行榜无法通过品牌认知来作弊。 # 技术栈(如果有人想复刻) * 物理引擎:**pymunk**(Chipmunk2D),60 Hz 频率,2 倍子步长 * 后端:**FastAPI** 部署在 HF Spaces;大脑调用 OpenRouter / OpenAI / Gemini * 前端:**Next.js 15** \+ 纯 Canvas 回放播放器,部署在 Vercel * 存储:Supabase(Postgres + 用于回放 JSON 的存储桶) * 即刻内置 21 个免费 OpenRouter 模型选择器 支持单败淘汰赛(4 或 8 个模型,实时赛程浏览器)、战前 LLM 垃圾话、战后 LLM 评论员吐槽、致命一击时的击杀回放慢动作。 # 开放问题(欢迎讨论) 1. 有没有明显 **这个评测无法揭示** 的能力,我可能遗漏了? 2. 每回合 15 秒的预算惩罚了深度推理模型。如果采用“思考时间均等”模式(给 R1 60 秒,给 Haiku 5 秒)会是更公平的比较,还是只是更差的基准? 3. JOINT 模式更接近“具身”agent。有谁在从事 agent 输出直接转化为连续电机控制的相关工作吗? 4. 状态载荷大约 600 字节。我很想 A/B 测试更丰富的载荷(完整骨骼关节角度?速度历史?)——有谁做过关于状态格式选择对哪些模型家族有利的评测工作吗? 选两个模型,设定一个锋利区域,看它们战斗。无需 API 密钥也能使用 Mock 模式,如果你想在接入密钥之前先试用 UI。
查看原文

相似文章