三层游戏智能体:ViZDoom 与自研 CS 模拟器阶段成果

规则与小网络每一帧给出动作,本地小模型处理战术选择,大模型负责目标规划和离线进化;系统在严格的统计检验下自我改进。

黄锐,HKU MMLab

数据截至 2026 年 10 月 11 日 22:30,H800 推进第 2 天

defend_the_center:本局 25 杀满分。100 局监测均值 24.95,Sample Factory 满预算 24.01。
deathmatch_bots:对最高难度内置 bot,本局 59 杀(4 倍速)。端到端像素策略今晚被进化闭环采纳。
health_gathering_supreme:本局在毒地上存活满 2100 tic。监测均值 1723,Sample Factory 1907。
CS 5v5,Dust2:v5 快速层对模拟器的 Expert 队,4 回合全胜(俯视回放,4 倍速;橙色为 T,蓝色为 CT)。

同一套智能体只看画面,在六个 ViZDoom 标准场景中已有三个超过 Sample Factory 满预算成绩,对内置最高难度 bot 的两种对战全部取胜;自研 CS 模拟器里 1v1 对 Expert 胜率 98.65%。

摘要

这个项目做一个真正能用的游戏智能体。快速层由规则和小网络组成,每一帧在 5 毫秒内给出动作,运行时不调用语言模型;中速层用本地小模型在给定选项中打分,负责交战、撤退、换位这类战术选择,目标延迟 150 毫秒以内;慢速层调用两个大模型,一个规划每局的目标与约束,一个离线修改规则、反应 slot 与路由。

系统在 ViZDoom 上自我进化:经验库挖掘候选改动,固定种子的配对实验验证收益,通过的改动整套原子上线。截至今晚,进化闭环在统计检验下自动采纳了 17 个有显著收益的改动,初始版本在 8 个场景上的得分全部提升,多数场景达到初始的 3 倍左右,其中 basic、defend_the_center、deadly_corridor 已超过 Sample Factory 满预算训练后的成绩。

我们还用 C++ 写了 CS 状态级模拟器,覆盖 Dust2 与 Mirage,执行器带人类反应限制(反应延迟不少于 200 毫秒,鼠标速度与加速度有上限)。1v1 智能体 v4 对 Expert 胜率 98.65%;五人队智能体 v5 在开发阶段对模拟器的 Expert 队 20 场全胜。

口径:本页 ViZDoom 数字来自监测种子 11000–11099,用来跟踪进展,不参与任何决策。决定目标是否达成的数字只来自预注册、经独立审查、只用一次的保留种子段(ViZDoom 12000–12099),最终评测尚未运行。

录屏

下面每段录像都是当前版本(进化闭环的现行 bundle 1f88db2b)在监测种子上实际打的一局,感知只用画面,中速层接本地决策服务,和评测走同一套代码。画面顶部是对局时间与游戏内计数。单局成绩有好有坏,说明里同时给出 100 局监测均值。

目标进度

计划给 ViZDoom 定了 7 项量化目标,给 CS 模拟器定了 8 项。下表按"已达成、进行中、待最终评测、未达成"标出现状。目标一律按原文读,不降低;数据表明做不到的,带着证据交给决策人,例如目标 1 的帧数口径(见表下说明)。

目标要求现在状态
ViZDoom(最终成绩一律在只看画面的模式下测)
1 单人场景6 个标准场景中至少 5 个达到或超过 Sample Factory 满预算成绩,帧数不超过其 1/10监测:3/6 超过 SF(basic 83.49 对 81.93,defend_the_center 24.95 对 24.01,deadly_corridor 2196 对 2083);health_gathering_supreme 1723 对 1907、my_way_home 0.9748 对 0.9834、deathmatch 47.51 对 78.65 仍差进行中
2 对 bot对最高难度内置 bot 胜率 100%;得分不低于 SF 公开模型(60.40 / 33.14)两种对战监测胜率均为 20/20;deathmatch_bots 47.15 杀,随后采纳端到端像素策略(确认 +21.4%);duel_bots 20.25 杀进行中
3 沉淀快速层决策占比 ≥ 90%;每游戏小时中速调用与慢速 token 各降 10 倍;表现不下降(非劣效,边际 5%)v1:快速层占比 99.7%,中速调用降 13 倍,慢速 token 降 4.6 倍;新的沉淀版本与非劣效检验进行中进行中
4 实时35 Hz 下快速层每 tic p99 < 5 ms;本地中速决策 p95 < 150 ms;漏 tic 为 0;实时成绩 ≥ 同步模式的 95%开发测量:p99 4.4 ms,0 漏 tic,实时与同步之比 1.006;中速决策 p95 141 ms待最终评测
5 进化质量≥ 20 个自动采纳的改动,各有显著收益;回归 ≤ 2%;重复规则 < 5%17 个;回归 0;重复规则 0%进行中
6 换图≥ 2 张未见地图上,用 ≤ 1/10 纯强化学习的经验恢复到原水平的 90%两张新地图(freedm_bots、cig_bots)的 6 个 SF 参照训练进行中,门槛约 10 月 13 日凌晨出来进行中
7 对比 GameSense战斗类任务显著优于两种仿 GameSense 设置;不暂停游戏;重复模块 < 5%v1:不暂停、重复 0%,只有 deathmatch_bots 全面领先;按"经验量相同"和"最终版本"两种口径在最终评测复评待最终评测
CS 模拟器(最终成绩一律在人类反应限制模式下测)
1 Dust2 1v1对 Expert ≥ 95%;对 Hard ≥ 99%v4:Expert 98.65%;Hard 99.044%(121,000 回合,95% 置信下界 98.987%)Expert 已达成 Hard 差 0.013 个点
2 5v5对 Expert 队整场胜率 ≥ 95%v5 开发阶段 20/20 场,回合胜率 99.0–99.4%;正式检验待预注册进行中
3 规模效应自我对弈联赛的 Elo 在 1 万游戏小时以上持续上升;对未参与训练的风格持续提高联赛 v2:3 个种子各 1 万游戏小时,明早约 9 点结束,评估方案已预注册进行中
4 样本效率达到对 Expert 95% 所需经验 ≤ 纯强化学习的 1/10≥ 11 倍:纯强化学习每个种子跑 36.3 亿 tick 仍未达到 95%已达成
5 沉淀快速层占比 ≥ 90%,中速调用降 10 倍以上部署的 v3:快速层占比 100%,中速调用 0已达成
6 换到 Mirage用 ≤ 1/10 的 Dust2 经验恢复到原水平的 90%对 Hard 99.1%、对 Expert 98.6%,计入的经验只有 Dust2 的 0.49%已达成
7 实时64 tick 墙钟下快速层 p99 < 2 ms,不漏 tick;成绩 ≥ 加速模式的 95%p99 0.38 ms,260 万 tick 0 漏,比值 1.000(在上一台机器测得,H800 上在最终评测中重测)已达成
8 消融去掉任一关键机制,至少一项核心指标显著变差开发阶段:去掉中速层 −12.6、去掉网络 −8.8、去掉仲裁 −3.8 个百分点;三项已在保留种子上盲测运行;隔离验证一项预计无结论;双慢速模型一项在重试(见 CS 一节)进行中

目标 1 的帧数:推进中决策人决定取消"帧数不超过 SF 的 1/10"这一硬上限,以成绩为先,账本照常记录每一帧,最终报告同时给出两种口径。按 1/10 口径,defend_the_center、health_gathering_supreme、deathmatch 三个场景的帧数已超出,目标 1 无法达成;按"不超过 SF 全量帧数"的口径仍可达成。CS 目标 4–7 是 v1 阶段的结果(当时的智能体为 v3),模拟器在不同机器上逐位一致。

方法

智能体按反应速度分三层,每层只做自己擅长的事。快速层不经过语言,保证每一帧都有动作;中速层只在少数时刻被叫醒,在有限选项里做选择;慢速层不碰实时控制,专门规划和改进系统本身。三层通过 sign(事件信号)和指令栈沟通,执行器按固定顺序仲裁谁来控制每个动作通道。

三层架构。实线为每帧都发生的数据流,虚线为异步的指令、目标与配置改动。慢速层的系统调控在离线进化中改写快速层的规则、中速层的 slot 和 sign 路由,改动以 bundle 为单位原子切换。

快速层:规则与小网络

规则是受限加载的源码(AST 白名单,禁止 IO),带优先级、冷却、适用范围和可驱动的动作通道。说不清的连续控制(跟枪、横移、走位)交给小网络,先模仿规则,再做残差强化学习,稳定超过规则才替换。

执行器每 tic 为每个通道(瞄准、移动、开火、武器)只选一个控制者:用户停止 > 慢速层直接控制 > 有抢占权的反射 > 当前指令的技能 > 其他规则。每个输出都能追溯到具体规则或技能的版本。

中速层:本地决策服务

本地小模型(decider-2b,vLLM 部署)一次前向只生成 1 个 token,限定在选项标签上,读出每个选项的概率并做温度校准,得到置信度。置信度不够时升级给慢速层,超时就执行回退。

结果按优先级生效,与返回先后无关;提交前校验指令栈和配置的版本号,过期结果直接作废。延迟忠实模式下,决策按真实耗时折算成游戏时间送达,模拟器加速也不会让模型变成零延迟。

慢速层:两个大模型

目标规划(qwen3.7-plus,关闭思考)给出每局的阶段目标、约束和能力需求;系统调控(qwen3.7-max,开启思考)负责规则、技能、sign 路由、slot 与 prompt 的改动,以及验证、上线和回滚。

两者共用一个事件库,各有独立的队列和消费位置。慢速层运行在独立进程里,不会拖慢快速层:开发测量中快速层每 tic p99 为 4.4 毫秒。

自进化闭环

进化闭环(evo1)从 10 月 5 日运行至今,已到第 762 轮。每一轮从经验库和收件箱里拿到候选改动,经过筛选、序贯验证和确认三道关,通过的改动整套上线;上线后表现退化就自动回滚。候选来源有四类:系统调控用大模型提出的改动,从经验中挖掘出的高置信决策模式,各工作线训练好、经收件箱提交的小网络与规则,以及沉淀产生的效率改动。

一轮进化。验证用固定种子的配对对局和序贯设计,确认用新的种子再测一次;验证和确认用掉的对局都计入经验预算。只有"有显著收益"的改动计入目标 5;只降调用不提成绩的效率改动不计入,并且必须通过非劣效检验(置信下界高于 −2%)。

感知:只看画面

最终成绩一律只用画面输入。检测模型(YOLO11n)和位姿估计把画面转成统一的 PerceptionState,策略只读其中对策略可见的字段;训练检测模型用到的游戏内标注不进入最终评测。

自研 CS 模拟器

C++ 写的状态级模拟器 cs_sim,覆盖 Dust2 与 Mirage,单核 1v1 运行速度远超实时,结果在不同机器上逐位一致。v2 加入道具、炸弹、经济和团队 bot,并用 CS2 对局录像校准;智能体侧带 200 毫秒以上的反应延迟和鼠标速度上限。

ViZDoom 结果

进化把每个场景都推了上去,三个场景已超过 Sample Factory

下图把每个场景的得分除以 Sample Factory 满预算训练后的成绩(在 H800 上、同一批监测种子上重新测得),1.0 表示持平。灰点是进化开始前的初始版本,深蓝点是当前版本。

各场景得分相对 Sample Factory 满预算成绩的比值。监测种子 11000–11099,单人场景每个 100 局,对 bot 每个 20 场。当前版本数据为 10 月 11 日 17:00 的监测评测;deathmatch 取 13:00 的监测值,与当前版本的 deathmatch 配置一致(第 744 轮的改动已回滚)。deathmatch_bots 的空心点为 A6 像素策略采纳前的筛选成绩(开发种子),尚未在监测种子上测。
17
进化闭环自动采纳、收益显著的改动(目标 20)
0
回归套件退化;重复规则 0%
1206 → 0
中速层调用次数 / 游戏小时(初始版本 → 17:00 版本)
4.4 ms
快速层每 tic p99(开发测量,目标 < 5 ms)

对 bot:端到端像素策略用 3000 万帧追上 SF 约 2 亿帧的水平

A2 在规则之上训练残差小网络,把 deathmatch_bots 从 27 杀提到 47 杀后曲线走平。A6 换成能持续进步的策略形式:卷积加 GRU 直接读画面和 HUD,先用 100 局教师录像做行为克隆热启动,再在精简环境里用 PPO 训练,部署成快速层的一条规则(单步 0.63 毫秒)。

deathmatch_bots 每场击杀数随训练帧数的变化(横轴为对数刻度)。深蓝为 A6 试验运行 P1 的训练策略,方点为部署后的确定性策略在验证种子上的成绩;灰线为 Sample Factory 在同一资源上的训练曲线。30M 帧的检查点经筛选(45.68 → 56.88,+24.5%)和进化闭环的验证(+31%)、确认(+21.4% [+10.4, +30.4])后上线。三个独立种子各 1.5 亿帧的正式运行正在进行。

统计纪律:一次回滚

第 744 轮,进化闭环在 deathmatch 里采纳了一个效率改动:关掉中速层,每游戏小时调用从 319 次降到 0。当时的判定规则只要求"没有检测到显著变差",而 30 个种子上置信区间从 −15 到 +25 分,几乎什么改动都能通过。监测评测随后显示 deathmatch 从 47.5 降到 38.1。

按规则,监测种子不参与决策,所以我们在开发种子上做了配对检验:撤掉第 744 轮改动的版本,100 对比较平均多 15.32 分 [+6.79, +23.92];沉淀工作线 A7 在 400 对新种子上独立测得第 744 轮造成 −21.8% [−30.3%, −12.7%]。经 GPT-5.6 审查后回滚,这次回滚不计入目标 5;判定规则同时改为真正的非劣效检验(置信下界须高于 −2%)。

CS 模拟器

CS 部分从零开始:先写状态级模拟器并用 CS2 录像校准,再在里面训练三层智能体。1v1 智能体经过 v1 到 v4 四代,五人队智能体 v5 加入了团队层、中速层和慢速层。

98.65%
v4 1v1 对 Expert 胜率(目标 ≥ 95%)
99.044%
v4 1v1 对 Hard,121,000 回合(目标下界 > 99%,差 0.013 个点)
20 / 20
v5 对模拟器 Expert 队的开发比赛,回合胜率 99.0–99.4%
0.49%
换到 Mirage 后对 Hard 99.1%、对 Expert 98.6%,计入的经验只有 Dust2 的 0.49%

消融:中速层、网络和仲裁各自有用

目标 8 要求去掉任何一个关键机制都会让核心指标显著变差。为了让机制差异能被测出来,消融在五人对五人里进行,对手是冻结的 v5 快速层陪练队(对 Expert 队已经赢下 99% 的回合,测不出差别)。下图是开发阶段的结果,正式检验在保留种子上盲测运行,结果冻结前谁都看不到。

去掉各机制后,对陪练队的回合胜率变化(百分点,种子层面配对,误差线为 95% 置信区间)。开发种子:中速层、网络、仲裁各 15 个种子,每个种子正反两边各一场;经济规划器为它的保留检验(10 个种子)取反,即去掉它的代价。隔离验证的试点里,带验证的 3 次进化一个改动都没采纳,不带验证的改动接近中性,预计这一项无结论,会如实报告。

"双慢速模型"一项曾经无法测:三版回合规划器都没有通过事先写好的保留规则,从 v5 中移除。按决策人的决定,B2 限时重做了一个整场经济规划器(qwen3.7-plus,8 秒内给出半场的购买与存钱计划),在 10 个开发种子上把回合胜率提高 4.37 个百分点 [+0.63, +8.12],通过保留规则;在新种子上的确认正在进行。

推进方案

10 月 10 日起,工作迁到一台共享的 8 卡 H800 服务器,按目标拆成并行的工作线,最多 6 个同时运行。每条工作线有自己的规格、种子段和资源份额,成果通过进化闭环的收件箱验证后上线,或由主管按预注册的检验激活。

工作线目标做法进展
evo1目标 5,各场景大模型提议、经验挖掘、收件箱;筛选、序贯验证、确认、原子上线第 762 轮,17 个计入采纳
A1目标 1defend_the_center 开火控制,health_gathering_supreme 零帧模拟器,my_way_home 导航开火控制上线,已结束
A2目标 2规则之上的残差小网络,PPOdeathmatch_bots 27 → 47 杀,两次采纳
A3CS 1、3200 毫秒延迟下的瞄准;自我对弈联赛重设计Hard 99.044%;联赛 3 种子各 1 万小时
A4目标 4慢速层独立进程,蒸馏决策服务,24 小时稳定性快速层 p99 4.4 ms;稳定性运行明早结束
A5目标 1子弹 tick 瞄准控制,health_gathering_supreme 与 deathmatch 改进defend_the_center 22.80 → 24.95
A6目标 2端到端像素策略:行为克隆热启动加 PPO30M 帧约 56 杀,已采纳;三种子正式运行中
A7目标 3把慢速层的 token 沉淀成规则与快速策略;消融定位表现损失查出第 744 轮的退化;非劣效检验准备中
B1CS 2模拟器 v2:道具、炸弹、经济、团队 bot,CS2 录像校准校准验证完成
B2CS 2、8五人队智能体 v5、仲裁、CS 进化闭环;目标 8 消融运行时三项盲测运行中
B3目标 6、7两张新地图的 SF 参照与门槛;GameSense 复评协议6 个参照训练中;目标 7 协议已批准
F1全部最终评测:冻结清单、统一编排、自动出报告、开发种子演练演练通过,按审查意见修改中

怎样保证结论站得住

先写协议,再看数据

每个决定目标的检验先写预注册:样本量、种子段、判定规则、失败处理,经 GPT-5.6 独立审查后才开跑,跑完不再改规则。审查会否决不合规的方案,例如它否决过一次"看了部分试点数据后放宽样本量"的修订。

保留种子只用一次

ViZDoom 12000–12099 只给最终评测用一次;CS 从 7,000,000 起按目标分段;监测种子 11000–11099 每天评测,但不参与任何决策。

经验如实计算

账本记录每一帧:训练、筛选、验证、失败的候选都计入,只有最终评测和监测评测豁免。最终报告同时给出 1/10 帧数口径和实际帧数口径。

检验方法

固定种子配对、序贯设计、bootstrap 置信区间;"表现不下降"用非劣效检验;多重比较用 Holm 校正。一套系统同时满足所有目标:目标 3 测试的沉淀版本必须就是最终版本。

下一步

  • 明早约 9 点:A3 的 CS 联赛结束,按预注册方案评估目标 3;A4 的 24 小时稳定性运行结束;空出的 CPU 主要给 A6 的三个种子和 B2 的消融。
  • 10 月 12 日:A7 完成沉淀版本与非劣效检验,通过后激活为最终版本;B2 完成目标 8 的盲测和双慢速模型确认,写目标 2 的预注册。
  • 10 月 13 日凌晨:B3 的参照训练结束,得出换图门槛,开始在两张新地图上做适应(目标 6)。
  • 最终评测:各工作线冻结后,F1 的统一编排在 ViZDoom 12000–12099 上一次性运行(约 6–7 小时),自动生成 ViZDoom 与 CS 两份实验报告,再交 GPT-5.6 审查。