AgentOB 公开构建记录 01
最早想到让 AI 做游戏导播时,我的出发点很直接:我认为 AI 擅长做预测。如果持续给它实时、足够的上下文,它能不能判断接下来会发生什么?
把这个设想放进游戏比赛里,问题就变成了:它能不能提前知道下一处值得看的镜头在哪里,决定该切给谁,并胜任导播这份工作?
当时这还是一个待验证的想法。AI 对文本的预测能力,能在多大程度上用于比赛中的交战和镜头选择,需要实际做出来再看。我也想到明星选手、人物背景和赛事叙事。一个镜头值得被留下,可能因为某次翻盘,也可能因为观众正在跟随这个人的处境。
后来,Jev 这个判断模型发布了。它可以直接给程序返回判断,让我们对这个导播设想有了进一步的思考:既然比赛发生在数字系统里,我们能不能直接把具体数据交给 AI,让它根据人物位置、动作和事件作选择?
这里有一个对我很不一样的收获。之前想怎么解决问题,我很容易沿着人的习惯去想:人通过眼睛看画面,理解发生了什么,再用语言说明判断。于是,给 AI 设计任务时,也容易让它先看画面,再解释自己要做什么。
机器可以走另一条信息路径。游戏里的状态本来就以数据存在,它可以直接读这些状态,通过数字和逻辑关系处理,再给程序一个能执行的选择。人在屏幕上看到的画面,和机器作判断所需要的输入,可以分别设计。
这让最初的设想有了一个具体入口。我们开始给程序限定能读取哪些信息、怎样作出镜头选择,再把选择播放出来,看观众能不能跟上比赛。
AgentOB 从这里进入工程。现在,它能够读取 CS2 比赛 demo,也就是保存比赛过程的回放文件,自动选人、切镜,并在二维画面里连续播放。我们还能把不同版本放在同一段比赛里对照。
程序运行以后,新的问题才逐渐露出来。它把镜头切给某位选手,半秒后又切走。它选到了人,我还没来得及看清那里发生了什么。继续调选人的分数之前,我得先说清楚:这一眼究竟要让观众看见什么?

先管住一个知道结局的程序
比赛 demo 里,整场事情都已经发生了。程序很容易拿到后来的结果。
进入工程前,我先提了一个要求:它作判断时,只能用当时已经知道的事情。我想看它能否提前给出好镜头,所以必须把后面发生的事挡住。
这条要求后来变成了输入范围和时间约束。它也影响了我们怎么读实验结果:程序提前选中了一个人,得继续检查它依据的事实是什么。已经知道谁会击杀,再把镜头切给他,无法回答最初的问题。
后面,我们又单独研究了允许读取未来五秒的条件。它可以帮助探索带延迟的导播,但必须和只用当前信息的版本分开。现有回放里的五秒窗口可以运行,真实直播的延迟缓冲还没有完成。
这也成了整个项目的工作方式:先说清程序允许知道什么、要完成什么,再看它实际做了什么。一个看起来很漂亮的镜头,也得能解释来路。
我带给程序的,是一段段不对劲
做着做着,我越来越具体地体验到:一些人类凭经验完成的判断,需要很多工作才能写进程序。
比如,我们曾经用人物之间的距离帮助判断交战。我提出过 Dust2 中门的例子:两个人离得很远,狙击手和经过中门的人仍可能形成值得提前给镜头的对峙。距离本身交代不完这件事,还得看点位、武器和经过的路线。
这个例子先作为反例进入讨论,怎样变成可靠的规则,还要继续验证。它让我能够指出程序的判断缺了什么,同时也暴露了我自己还没有说清的部分。
项目由我和几个 AI 协作推进。我提出方向,把具体画面和反例带进去,让它们整理方案、写代码、做对照,再把结果拿回来继续看。我还需要决定哪些值得接着做,哪些先停。
在这个过程中,给出一句观看判断通常很快。解释它依赖哪些事实,在哪些情况下会失效,就慢得多。AI 可以继续写实现,我也得继续补充判断的依据。
于是,最近几轮实验逐渐围着几个具体画面展开。
半秒钟,来得及看见什么
最先暴露的问题是快闪。
镜头刚切过去,半秒后又走了。系统可能已经选中过关键人物,观众却来不及认清位置。连续几次这样的选择,画面就碎了。
我对这段画面的要求很明确:至少留一点时间,让人看懂。我们给镜头加了最短停留约束,实验里先试两秒。
短镜被限制住以后,新的代价也出现了:镜头留在这里,另一边的动作可能已经发生。只看切换次数,新版本可能更安静;回到比赛里,还要检查它漏掉了什么。
一句别切那么快,写进程序后就有了成本。两秒是目前试过的参数,合适的停留长度还要回到具体画面里判断。
一次配合,要看两个人
另一段比赛里,Wicadia 投出闪光弹,XANTARES 随后接敌。
如果镜头只在交火时给到 XANTARES,观众能看到执行,却可能看不到队友为这次拉出做的准备。先跟投闪的人,再切给接敌的人,才能把这段配合连起来。
这条经验已经有了一处可运行的表达。在允许读取未来五秒事件的离线实验里,镜头先跟随 Wicadia,投闪后切给 XANTARES,并留住后续的一段交战。
过程中还出现过事件关联误判。我们回查原始事件,修正条件。程序要把两个人连起来,需要比这里有配合更具体的依据。
这段路径接起来了,整场表现仍然要继续看。为了保留它,其他过程也可能失去镜头。对照里的策略有多处差异,这个局部案例还不足以证明整体观看质量更好。
镜头一前一后给到两个相关的人,观众才有机会看到一次配合。怎样在其他比赛里也稳定做到,我们还没有完成。
给等待建个档案:38.5秒,未结案
Spinx 有一段约38.5秒的长持镜,目前仍然没有解决。
最容易想到的办法,是时间到了就切走。但没有开枪,不足以说明架枪没有价值。镜头可能在等一条路线,也可能在维持一个尚未兑现的期待。那段时间里,其他人也在移动、开枪、使用道具。
如果追着每一处动静切,快闪的问题又会回来。
我们尝试给镜头增加任务:正在跟随什么过程,什么时候完成,什么变化足以让另一件事接替它。这个长镜头仍然留着,增加未来信息也没有把它修好。
这段失败值得保留。它把问题放得很具体:等待在什么条件下仍有价值?观众是否知道它在等什么?哪种变化会让继续等下去失去依据?
下一次修改得回答这些问题。再加一个计时器,暂时还交代不了这38.5秒。
模型接上了,收益还得另外找
Jev 确实进入过这个项目。早期接法里,规则先挑事件,模型再从关联人物中选视角。后来我们把镜头历史补进去,让它参与选择要跟随的过程。
这一轮局部对照仍然没有看出额外收益,因此先暂停了这条尝试。目前默认继续用规则导播,模型的代码和结果保留着。
这轮结果只能说明当前接法还没带来我们要的改善。下一次重开之前,需要先给模型一道边界清楚的题:它能看到哪些事实,能改变哪一步,怎样判断画面因此更好。
最初,Jev 帮我找到一个工程入口。走到这里,项目还需要我们把导播的判断继续拆细。
这件展品,留在工作台上
AgentOB 还在开发,暂未开源。已经有的,是一套能执行选择、连续回放和对比版本的离线底座,以及几条完成了局部转译的经验。真实 CS2 镜头执行仍待验证,让观众稳定看懂比赛也没有做完。
我想在研究所里持续记录它的构建过程。一段看不明白的画面,怎样被指出来,怎样变成条件,改完以后补回了什么,又舍弃了什么。顺利的案例和未结案的等待,都留在这里。
这份记录也保留我自己怎样改变问题。最初问 AI 能不能提前找到好镜头,后来开始问一个镜头需要什么前情,以及什么时候该放弃等待。每次程序作出选择,我们都能回到同一段比赛里检查。
下一步先处理等待。找出该继续等和该结束的对照片段,写清各自依赖的事实,再做一个小改动,回到同一段比赛里检查。
如果你看 CS2 比赛,或者做过导播、剪辑,欢迎带来一个你觉得该切或不该切的具体片段。最好连同你希望观众看到什么。我们可以把它作为下一份待拆解的案例。