同一套智能体只看画面,在六个 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 局监测均值。
28ab8cfd(进化开始前):19 杀1f88db2b:25 杀28ab8cfd:17 杀(4 倍速)1f88db2b:59 杀(4 倍速)目标进度
计划给 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(事件信号)和指令栈沟通,执行器按固定顺序仲裁谁来控制每个动作通道。
快速层:规则与小网络
规则是受限加载的源码(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 轮。每一轮从经验库和收件箱里拿到候选改动,经过筛选、序贯验证和确认三道关,通过的改动整套上线;上线后表现退化就自动回滚。候选来源有四类:系统调控用大模型提出的改动,从经验中挖掘出的高置信决策模式,各工作线训练好、经收件箱提交的小网络与规则,以及沉淀产生的效率改动。
感知:只看画面
最终成绩一律只用画面输入。检测模型(YOLO11n)和位姿估计把画面转成统一的 PerceptionState,策略只读其中对策略可见的字段;训练检测模型用到的游戏内标注不进入最终评测。
自研 CS 模拟器
C++ 写的状态级模拟器 cs_sim,覆盖 Dust2 与 Mirage,单核 1v1 运行速度远超实时,结果在不同机器上逐位一致。v2 加入道具、炸弹、经济和团队 bot,并用 CS2 对局录像校准;智能体侧带 200 毫秒以上的反应延迟和鼠标速度上限。
ViZDoom 结果
进化把每个场景都推了上去,三个场景已超过 Sample Factory
下图把每个场景的得分除以 Sample Factory 满预算训练后的成绩(在 H800 上、同一批监测种子上重新测得),1.0 表示持平。灰点是进化开始前的初始版本,深蓝点是当前版本。
对 bot:端到端像素策略用 3000 万帧追上 SF 约 2 亿帧的水平
A2 在规则之上训练残差小网络,把 deathmatch_bots 从 27 杀提到 47 杀后曲线走平。A6 换成能持续进步的策略形式:卷积加 GRU 直接读画面和 HUD,先用 100 局教师录像做行为克隆热启动,再在精简环境里用 PPO 训练,部署成快速层的一条规则(单步 0.63 毫秒)。
统计纪律:一次回滚
第 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 加入了团队层、中速层和慢速层。
消融:中速层、网络和仲裁各自有用
目标 8 要求去掉任何一个关键机制都会让核心指标显著变差。为了让机制差异能被测出来,消融在五人对五人里进行,对手是冻结的 v5 快速层陪练队(对 Expert 队已经赢下 99% 的回合,测不出差别)。下图是开发阶段的结果,正式检验在保留种子上盲测运行,结果冻结前谁都看不到。
"双慢速模型"一项曾经无法测:三版回合规划器都没有通过事先写好的保留规则,从 v5 中移除。按决策人的决定,B2 限时重做了一个整场经济规划器(qwen3.7-plus,8 秒内给出半场的购买与存钱计划),在 10 个开发种子上把回合胜率提高 4.37 个百分点 [+0.63, +8.12],通过保留规则;在新种子上的确认正在进行。
推进方案
10 月 10 日起,工作迁到一台共享的 8 卡 H800 服务器,按目标拆成并行的工作线,最多 6 个同时运行。每条工作线有自己的规格、种子段和资源份额,成果通过进化闭环的收件箱验证后上线,或由主管按预注册的检验激活。
| 工作线 | 目标 | 做法 | 进展 |
|---|---|---|---|
| evo1 | 目标 5,各场景 | 大模型提议、经验挖掘、收件箱;筛选、序贯验证、确认、原子上线 | 第 762 轮,17 个计入采纳 |
| A1 | 目标 1 | defend_the_center 开火控制,health_gathering_supreme 零帧模拟器,my_way_home 导航 | 开火控制上线,已结束 |
| A2 | 目标 2 | 规则之上的残差小网络,PPO | deathmatch_bots 27 → 47 杀,两次采纳 |
| A3 | CS 1、3 | 200 毫秒延迟下的瞄准;自我对弈联赛重设计 | 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 | 端到端像素策略:行为克隆热启动加 PPO | 30M 帧约 56 杀,已采纳;三种子正式运行中 |
| A7 | 目标 3 | 把慢速层的 token 沉淀成规则与快速策略;消融定位表现损失 | 查出第 744 轮的退化;非劣效检验准备中 |
| B1 | CS 2 | 模拟器 v2:道具、炸弹、经济、团队 bot,CS2 录像校准 | 校准验证完成 |
| B2 | CS 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 审查。