只看一场比赛的AI,会在第二场犯什么错
先看一个模拟场景(以下数据均为示例,不是真实统计):玩家B在足球11人制模式里用一支虚构球队“江岸流星”打第41场比赛。他0比2落后到第70分钟,之后几乎每次进攻都直接长传找9号中锋。如果AI只看这一场,它会得出结论:这名玩家是长传冲吊型,下一场应该让中卫站得更深,提高争顶优先级。
但玩家B过去40场的数据完全是另一回事:他绝大多数进攻都是短传渗透,长传只在落后且剩余时间不足20分钟时才大量出现。第41场的长传不是他的风格,而是特定比分下的应急手段。下一场开局,AI中卫退得很深,中场和后卫线之间拉开大片空当,玩家B用惯常的短传配合轻松打穿。
这是只看单场的典型错误:把情境反应当成性格。更麻烦的是,玩家很快就会发现这种AI的规律——只要在一场里故意换个打法,下一场它就会跟着跑偏。单场样本太少,而且被比分、对手、阵容和玩家当时的状态严重污染。一个认真的智能对手,需要一个跨越几十场的长期模型,再加一个只描述“此刻”的短期状态,两者分开存、分开用。
长期模型和短期状态,回答的是两个不同问题
| 对比项 | 长期玩家模型 | 短期状态 |
|---|---|---|
| 回答的问题 | 这名玩家通常怎么踢 | 这名玩家今天、此刻怎么了 |
| 时间尺度 | 过去几十场,按衰减加权 | 本场、最近两三场 |
| 典型内容 | 进攻方向分布、传球长度偏好、压迫习惯、换人时机 | 连败、刚换阵容、本场失误率异常 |
| 更新速度 | 慢,一场比赛只推动一小步 | 快,几分钟内就会变化 |
| 用途 | 决定AI的基础战术倾向 | 决定是否临时收手、提示或调整节奏 |
两者混在一起时,最常见的问题是短期状态把长期模型冲掉:玩家连输三场、心态急躁、开始乱打,AI把这些当成新习惯学进去;等他冷静下来恢复正常打法,AI又错了。反过来,只有长期模型也不行,AI会对当下的变化视而不见,比如玩家刚换成三中卫阵型,AI还在按过去四后卫时的习惯布防。
几十场比赛里,AI到底该记住什么
记住几十场,不等于保存几十场录像。对智能对手有用的,是从行为里提炼出来的特征,而且每个特征都要带着情境标签,否则就会重复上面的错误。以足球模式为例,一个示例特征集可以是:
- 进攻发起区域:左、中、右三路的占比,按领先、平局、落后分开统计。
- 推进方式:短传渗透、长传转移、个人带球突破的比例。
- 终结偏好:禁区内射门、远射、传中后头球的比例。
- 防守习惯:前场压迫的触发条件、是否习惯手动切换到最近的后卫、铲球频率。
- 节奏:领先后是否主动控球拖时间,落后时从什么时间点开始冒险。
- 阵容关联:换用不同阵型时,上述特征是否明显不同。
每个特征除了数值,还应记录样本量和最近一次被观察到的时间。样本量决定AI对它有多确定,时间决定它是否还值得相信。一个方向偏好到底是真实习惯还是偶然,可以参考判断玩家是否真的喜欢从左路进攻的讨论。
学术上有一个可以借鉴的结构。斯坦福与Google的Generative Agents研究提出了“记忆流、反思、规划”的架构,让智能体先从大量原始记忆里归纳出较高层的结论,再据此行动。体育游戏的玩家模型不需要语言模型来做这件事,但分层思路相通:原始事件在底层,归纳出的倾向在上层,Strategy只读上层。
数据衰减:老习惯什么时候该被忘掉
玩家会进步,也会换风格。如果第1场和第41场的数据权重相同,AI会一直被玩家刚入门时的笨拙习惯拖住。
一个常用做法是按场次做指数衰减。示例参数:每过一场,旧数据的权重乘以0.95。
| 距今场次 | 权重(示例,衰减系数0.95) |
|---|---|
| 0 | 1.00 |
| 10 | 约0.60 |
| 20 | 约0.36 |
| 50 | 约0.08 |
这样最近十几场主导模型,更早的数据并没有完全消失,在样本不足时仍能提供背景。但衰减系数不应全局统一,几条经验性的区分:
- 与操作相关的特征衰减快一些,比如射门时机、抢断时机,因为手感进步很快。
- 与战术偏好相关的特征衰减慢一些,“喜欢打边路”这类习惯往往持续很久。
- 与阵容强相关的特征按阵容分桶,换阵容后原桶冻结而不是衰减,玩家换回来时模型仍然可用。
- 衰减按场次而不是按自然日计算,避免玩家休息一个月回来就被当成陌生人。
玩家变了,AI怎么判断他是真的变了
衰减只能让旧数据被动淡出,但玩家有时会突然转型,比如看了一段教学后从边路传中改为中路配合。等衰减慢慢起作用,要十几场才能跟上。
所以长期模型旁边还需要变化检测:持续比较“最近5场的特征分布”和“长期模型的预测”。如果连续几场的偏差都朝同一个方向,且超出正常波动范围,就判定为行为变化,临时提高近期数据的权重。如果偏差只出现在一场,并且那场有明显的特殊情境,例如大比分落后、对手阵容特殊、中途掉线重连,就只记入短期状态,不改长期模型。
有一种情况要特别对待:玩家刻意骗AI。他发现AI会根据习惯布防,于是连续两场都走左路,第三场突然全走右路。系统不需要去“识破”它,因为这本身就是玩家在做Tactical Adaptation,是在读AI。好的对手应该被这种战术骗到一次,然后才逐步调整,而不是立刻看穿。AI能被骗,比赛才有博弈。
短期状态应该让AI收手,而不是加压
短期状态最重要的用途,是让AI知道什么时候不该继续针对。几条示例规则:
- 玩家连续输掉三场,且失分集中在同一种进攻方式上:先在复盘里指出问题,下一场AI维持原战术,不追加针对。
- 玩家刚换了新阵容:与阵容相关的长期特征暂时降权,AI上半场用通用策略,下半场再根据本场观察调整。
- 本场前20分钟传球失误率明显高于长期水平:可能是换了手柄或网络波动,这段数据不写入长期模型。
- 玩家领先后开始控球拖时间:这是长期模型里已有的习惯,AI可以按模型提前组织前场逼抢。
这些规则都受同一组约束:AI的调整只能体现在站位、战术选择和决策倾向上,Reaction Time与Observation保持在难度档位对应的范围,Decision Delay不能因为模型更准就被取消。信息边界是固定的,模型可以告诉AI“他通常怎么踢”,但永远不能告诉AI“他下一秒要怎么踢”。
长期模型最容易在哪里出错
- 多人共用账号。家里两个人用同一个账号,模型会学出一个混合体。可以通过操作特征的突变提示“是否为另一位玩家”,并允许建立子档案。
- 模式混用。3v3街头模式和11人制模式不能共用一个模型,场地尺寸和人数不同,方向偏好没有可比性。
- 对手强度差异。玩家面对强队和弱队的打法可能完全不同,模型要按对手强度分层。
- 模型自我固化。玩家长期被AI按老习惯针对,就不敢尝试新打法,模型因此越来越“确定”,形成自我强化的循环。缓解办法是给模型设置不确定性下限,让AI始终保留一部分通用防守。
长期模型再准确,也只改变AI的判断,不改变AI的身体。对手知道你过去几十场有七成进攻从左路发起,它可以提前让左后卫收窄、让后腰向左侧补位,但它的冲刺速度、抢断成功率和反应时间仍然和同级别球员一致。玩家行为模型提供的是战术依据,一旦被用来悄悄提高数值,它就从战术学习变成了数值作弊,这条线在乐鱼体育里是写死在对手参数之外的。
让玩家看到并管理自己的模型
长期记住玩家,意味着玩家有权知道AI记住了什么。在乐鱼体育的设计中,玩家模型以可读的方式出现在体育游戏复盘和个人页里,例如“过去30场,你在落后时更多选择右路进攻”“最近5场你的中路配合明显增多,AI已提高这部分的权重”。玩家可以重置模型、冻结模型(比如练新打法期间不想被学习),或者只对某个模式开启学习。乐鱼体育把这些开关放在玩家手里,是因为长期记忆一旦出错,只有玩家本人最清楚错在哪里。
上线前验证长期模型的一个方法
随机抽取玩家最近一场没有参与训练的比赛,用长期模型加短期状态预测他的进攻方向分布、推进方式和冒险时间点,再和实际对比;同时用“只看上一场”的朴素方法做同样的预测。只有当前者明显更准,并且在比分和阵容变化时没有大幅失准,这个模型才值得交给Strategy层使用。否则,宁可让AI按通用战术踢,也不要让它带着错误的记忆去针对玩家。