混合智能体通关暗黑破坏神I:钢铁侠模式抵达第9层

混合式AI智能体在《暗黑破坏神I》钢铁侠模式下通关第1-9层,展示算法与强化学习分工的工程范式。
开发者rouming公布了一个混合式AI智能体在《暗黑破坏神I》钢铁侠模式下的最新进展:智能体连续完成第1至第9层地下城,距离最终Boss Diablo更近一步。项目核心设计是让确定性任务交给传统算法、不确定性决策留给强化学习——监督器状态机在DUNGEON和PATHFIND模式间切换,CNN加LSTM加FiLM的网络负责战斗与探索决策。装备管理从属性加权求和升级为基于DevilutionX引擎的完整战斗效率公式,并引入未鉴定物品的诅咒回退机制。训练迭代依赖事件频率表和逐层统计,蒙特卡洛模拟用于校准训练课程。当前瓶颈在第5-8层地下墓穴,仅3%的回合能到达第9层。
一个混合式AI智能体在《暗黑破坏神I》的钢铁侠模式(Ironman)下,连续完成了第1层到第9层地下城的挑战。这是该项目的第四次进展更新,开发者rouming在Reddit上公布了完整的技术细节。

什么是钢铁侠模式
项目的核心目标是让智能体在无人工干预的情况下,一次性击杀最终Boss Diablo。钢铁侠模式意味着:不能回城、只有一条命、掉落的物品永久留在当前楼层、必须依次通过全部16层地下城。
这个选择不只是为了增加难度。开发者在原文中坦承,钢铁侠模式反而是"最容易实现的模式"——没有回城就意味着不需要编写城镇导航代码,只有一条命就没有成功或失败的模糊地带,英雄只管往下走,智能体永远不需要决定是否回溯。更少的决策意味着更少的出错空间。
另一个关键设定是禁用任务系统。在《暗黑破坏神I》中,部分任务会改写地下城布局,比如第6层的骨之密室(Chamber of Bone)和第7层的盲者之厅(Halls of the Blind),都会生成必须完成任务才能打开的门,而楼梯恰好藏在门后。禁掉任务后,地下城布局保持可预测,楼梯永远可达。开发者也不避讳地承认:没有屠夫(Butcher)确实让存活数据好看了不少。
《暗黑破坏神I》的任务系统并非单纯的支线内容,它会直接改写地下城的地形生成。以第6层的骨之密室为例,玩家必须找到并阅读一本特定的书,才能打开通往下一层的门;第7层的盲者之厅同样需要先击杀特定怪物取得钥匙。对于人类玩家而言这只是流程的一部分,但对智能体来说,任务触发条件、道具获取路径和门锁状态都属于额外的隐藏变量——一旦某次随机生成中任务物品未出现或模型遗漏了交互,整局就会卡死在楼梯前。禁用任务后,地下城生成器只使用基础房间和走廊模板,楼梯的连通性得到保证,智能体的探索策略也因此可以简化为纯几何问题。屠夫则是第2层固定出现的精英怪,伤害极高且会冲锋,是早期楼层最主要的死亡来源;禁任务顺带移除他之后,前四层的存活率数据确实更平滑,但代价是智能体也失去了应对高压近战敌人的训练机会。
混合架构:算法负责确定性,神经网络负责不确定性
这个项目最核心的设计理念不是"用AI做一切",而是"能写成算法的就写成算法,只有真正困难的部分才交给神经网络"。
监督器(Supervisor)是一个状态机。大部分时间它运行在DUNGEON模式,由强化学习模型掌控决策。当每层的步数预算耗尽或击杀足够怪物后,监督器切换到PATHFIND模式,用BFS寻路到最近一次看到的楼梯。模型本身从未见到楼梯触发器——它被伪装成墙壁,防止模型在战斗中误触。是否下楼,由监督器决定。
强化学习模型负责地下城中的所有决策:往哪走、何时攻击、探索哪条走廊、是否开门/开箱/开石棺、何时拾取物品。药水使用同样由模型决定——它观察当前的小/大/回春药水数量,在判断时机合适时发出恢复生命或法力的指令。
网络结构上,CNN处理21x21的局部观察窗口,LSTM跨步骤携带记忆。在CNN之上叠加了三个注意力模块:SelfAttention、MemoryCrossAttention和FiLM。Part 3的消融实验显示,FiLM几乎承担了全部有效工作,另外两个在训练好的模型中形同虚设——这个结果令开发者感到意外。
项目训练了两个独立模型:一个负责第1-4层(大教堂),另一个负责第5-8层(地下墓穴)。两个区域的几何结构、怪物池和英雄属性都不同,单一模型覆盖所有楼层效果更差。第9层及以后回退使用大教堂模型,因为只有约3%的回合能到达那里,不值得单独训练。
FiLM(Feature-wise Linear Modulation)是一种条件归一化技术,最初用于视觉推理任务。它的做法是用一个辅助网络根据当前上下文生成一组缩放系数γ和偏移系数β,再对主特征图的每个通道做仿射变换:输出 = γ · 特征 + β。在本项目中,FiLM 让模型能够根据当前血量、法力、药水数量等标量状态,动态地重新加权 CNN 提取的空间特征——相当于告诉模型“现在该更关注敌人位置还是逃生路线”。SelfAttention 和 MemoryCrossAttention 的作用分别是让空间特征内部互相参照、以及让当前帧去查询 LSTM 中存储的历史信息。消融实验显示后两者在训练完成后贡献接近零,这说明 21x21 的局部窗口本身已经包含了足够决策所需的空间关系,而 LSTM 的隐状态已通过 FiLM 的调制通道间接影响了特征提取,无需额外的注意力路径。这个结果也提示:在观察窗口较小、状态维度有限的场景中,复杂注意力模块可能被更简单的条件调制所替代。
属性策略:敏捷冲刺
每次升级获得5个属性点。智能体采用"敏捷冲刺"(dex-rush)策略——这是《暗黑破坏神I》玩家使用了30年的技巧:优先堆敏捷,其他属性往后放。
原因直接:敏捷直接进入攻击评级公式,决定攻击是否命中。第1-4层敌人护甲低,堆敏捷让战士打得更准,战斗结束更快,受到的伤害更少。开发者试过力量优先和均衡分配,敏捷冲刺胜出。这个策略是硬编码的,不需要学习。
装备管理:从加权求和到完整战斗公式
装备系统经历了最多的重写。最初版本用属性加权和来评分物品——敏捷权重高于体力,以此类推。这在早期楼层还行,到了深层就开始以难以调试的方式失败,因为《暗黑破坏神》的属性交互不是线性的。
解决方案是把DevilutionX引擎中计算攻击评级、伤害和护甲值的原始代码翻译成Python,得到一个计算英雄对当前楼层平均怪物预期战斗效率的函数:
(hero_hp * hero_damage_per_hit * hero_hit_chance) /
(monster_hp * monster_damage_per_hit * monster_hit_chance)
每层平均怪物属性从真实引擎中跨200个种子测量得出。新物品出现时,智能体虚拟装备它、重新计算这个值、与当前值比较。如果数值上升,就值得装备。这个方法的关键在于:一个+10敏捷的戒指可能极好也可能毫无价值,取决于命中率是否已经达到95%上限、英雄是否持盾、当前角色等级是多少。加权求和无法感知这些,完整公式可以。
未鉴定物品是特殊情况。智能体可以用可见属性(基础护甲值、原始伤害范围)直接装备,但物品可能是被诅咒的。装备未鉴定物品时,前一件装备会保留在背包中作为备份。如果新物品鉴定后暴露诅咒属性,智能体丢弃它并回退到备份装备——英雄永远不会在战斗中赤膊上阵。
DevilutionX 是《暗黑破坏神I》的一个开源重制引擎,它用 C++ 重新实现了原版游戏的战斗、物品和怪物逻辑,并保证与原版行为一致。开发者把其中计算攻击评级、伤害和护甲的代码逐行翻译成 Python,等于在智能体内部嵌入了一个轻量级的游戏规则模拟器。这个做法的关键优势在于可验证:模拟器算出的命中率和伤害值可以与真实游戏帧中的数据逐项对照,任何偏差都能定位到具体公式项。预期战斗效率函数中的每个量都有明确来源——hero_hp 是当前生命上限,hero_damage_per_hit 是经过力量、武器伤害和技能修正后的单次期望伤害,hero_hit_chance 由攻击评级与怪物防御评级之比决定;分母同理对应怪物一侧。跨200个种子取平均是为了消除单次生成中怪物组合的随机波动,让每层的“平均对手”成为稳定的比较基准。这样一来,物品评分不再依赖人工调参,而是直接从游戏规则推导出来,换楼层、换角色等级时也不需要重新设计权重。
奖励塑形:事件表驱动的迭代
训练从稀疏奖励开始——只有终端结果触发奖励,模型自己摸索其余部分。这条路走得很远,然后停滞了。之后的塑形基本靠试错。
每次训练结束后,所有动作事件被导出到表格中:每回合攻击次数、收集物品数、浪费的动作等。这个做法简单但极其有用。如果模型在空法力时反复释放火球八次,表格会立刻告诉你,修复方案一目了然。如果提高惩罚后浪费攻击下降了,说明塑形有效;如果没有下降,说明另有原因。
从事件频率表可以看到:移动惩罚占总事件的48.3%,探索格子占21.7%,攻击怪物占14.5%。其中一些调整有效——惩罚附近无怪物时的穿墙(phasing)行为奏效了。群体战斗放大器被测试后最终放弃:与其调整奖励,不如在训练中降低英雄属性,这样英雄自然承受更多伤害并学会引诱敌人。
最难的部分是平衡移动惩罚和探索奖励。在版本16引入探索奖励后,逐步计算仍然让"原地不动"稍微更优。必须同时调整两个数值,智能体才开始真正探索新格子。最后一个可用的环境版本是17。
蒙特卡洛模拟:校准训练课程
为了设置正确的训练课程,需要知道真实回合在每层是什么样子。战士在第1-4层赚多少经验?进入第5层时通常是什么等级?现实可获得什么装备?
开发者编写了一个模拟器(仓库中的scripts/diablo-sim.py),用马尔可夫循环让战士通过全部16层:从真实引擎测量到的击杀数中采样经验,应用升级公式,追踪装备的层间传递。经过足够多次模拟后,可以得到进入每层时英雄状态的分布。在错误的角色等级上训练,会产生在训练中有效但在真实回合中崩溃的智能体。
马尔可夫循环在这里指的是一种状态转移模型:把“当前楼层、英雄等级、装备强度、剩余药水”作为状态,把“击杀怪物获得经验、拾取物品、升级、下楼”作为转移事件,每一步的转移概率从真实引擎的测量数据中估计。由于《暗黑破坏神I》的楼层生成和经验分配具有随机性,单次模拟的路径没有参考价值,必须运行成千上万次才能得到进入每一层时英雄属性的分布。开发者关心的具体问题是:如果训练时把英雄初始等级设得太低,模型学会的是以弱胜强的冒险打法,在真实回合中一旦装备运气不好就会暴毙;设得太高,模型又学不到必要的保守行为。用模拟器得到的分布来设定训练课程,相当于让智能体在“典型开局”而非“理想开局”下学习。scripts/diablo-sim.py 本身不参与实际对战,它只是一个校准工具,但缺少它,训练环境和真实环境之间就会出现系统性偏差。
当前瓶颈与下一步
开发者在原文中坦言已陷入瓶颈。过去几个月一直在尝试提升第5-8层的存活率,但训练曲线已经拉平。他不确定这是当前架构的天花板,还是自己遗漏了什么。
地下墓穴是瓶颈所在——只有3%的回合能到第9层,这是第5-8层太难的结果,而非第9-12层不可能。最直接的变通方案是允许回城和交易:更好的装备和更多治疗药水会有很大帮助。但这意味着编写城镇导航和交易代码,开发者觉得这有点像放弃了钢铁侠的初衷。
仓库地址:https://github.com/rouming/DevilutionX-AI
据Reddit来源和开发者rouming的项目更新:这一系列实验展示了一种务实的混合AI设计思路——将确定性任务交给传统算法,将不确定性决策留给强化学习,可能是游戏AI乃至更广泛智能体研究中值得关注的工程范式。
相关推荐

uGAP:统一100+非洲地理数据集的AI平台
uGAP是开普敦大学团队开发的非洲地理空间AI平台,统一120余个非洲数据集并提供Python SDK,支持数据发现、处理与模型训练一站式工作流,已用于气旋洪水制图等实战场景。

Cursor能控制你的电脑了:AI代理可驱动桌面应用测试
Cursor 新增桌面控制能力,AI 代理可驱动 iOS 模拟器等桌面应用测试自己构建的功能。本文分析这一更新对开发工作流的影响、技术实现可能路径及可靠性考量。

Vibecoding自研推理引擎:理想丰满,现实骨感
Reddit开发者分享Vibecoding自研推理引擎的真实经历:用WebGL2和GLSL在浏览器跑GGUF Q4模型,却陷入tokenizer调试地狱。本文分析浏览器端LLM推理的工程难点,以及为何直接clone llama.cpp是更理性的选择。