4000个居民如果每半小时都被问一次“你现在做什么”,一个模拟日就要近20万次模型调用。批量推理要解决的,不是让模型更快,而是让绝大多数时刻根本不必调用它。
先算一笔账:4000个居民逐个“想一想”,一天要调用多少次
先说明:下面所有数字都是模拟示例,用来说明逻辑,不是任何实测结果。假设城市里有4000个居民,一个模拟日切成48个半小时时间片。如果每个时间片、每个居民都问一次大模型“你现在准备做什么”,一天就是4000乘以48,等于19.2万次调用。再假设每次调用平均2秒,串行执行需要约38.4万秒,也就是107个小时左右,四天多才能跑完一个模拟日。
这笔账说明瓶颈在哪里:不在模型够不够聪明,而在“调用次数乘以单次延迟”。Xie 等团队于2024年在 AI Metropolis 一文中报告,在他们测试的 Generative Agents 例子里,约95%的模拟时间花在大模型推理上。这个比例只对应他们的具体工作负载,不能推广到所有模拟,但它提示了优化的方向:先减少和合并推理调用,再去优化寻路和渲染。
大发娱乐城市AI的设计顺序因此是两问:这一次调用有没有必要?如果有必要,能不能和别人合并?大发娱乐AI在城市场景里花的每一次推理,都要能在账本上找到理由。下面按这个顺序展开。
一天里绝大多数时间片,居民其实不需要“思考”
看一个普通居民的一天:睡觉、通勤、上班、午饭、下班、回家。绝大多数半小时里,他做什么已经由日程和习惯决定,状态也没有任何变化。让模型为“继续睡觉”写一段推理,是纯粹的浪费。所以决策先分三档:
| 档位 | 触发条件 | 处理方式 | 占全部时间片决策的比例(模拟示例) |
|---|---|---|---|
| 惯性 | 日程与状态都没有越过阈值 | 查表或规则,不调用模型 | 约96% |
| 偏差 | 某个状态变量越线:通勤比预期长很多、钱包见底、库存用完、心情跌到低位 | 进入批量队列,用较小的模型成批处理 | 约3.5% |
| 重大 | 失业、搬家、买房、换职业这类改变长期轨迹的事 | 单独或小批次调用较强的模型,并写入长期记忆 | 约0.5% |
按这个比例重算:19.2万个时间片决策里,惯性档约18.4万个,完全不花模型;偏差档约6720个;重大档约960个。偏差档如果每32个居民合并成一次调用,是210次;重大档逐个调用,是960次。合计约1170次,比原来的19.2万次少了两个数量级。这个比例本身也是需要在运行中校准的参数:如果偏差档占比长期偏高,说明阈值设得太敏感,居民在为一点小波动反复重新思考。
批量不是把4000个人塞进一个提示词:怎么分组才不把居民“平均化”
批量推理最大的风险,是同一批居民得到几乎一样的答案。一个提示词里列出32个人,模型很容易给出32份相似的“合理选择”,城市里的多样性就被抹平了。大发娱乐模型在设计上用几条规则来避免这件事:
- 按“决策类型”分批,而不是按居民编号分批。通勤路线一批,午饭去哪里一批,失业后找工作一批。同一批里的问题相同,比较才有意义。
- 批内共享一份世界快照(天气、路况、物价、营业状态),但每个居民的画像、收入约束和近期记忆摘要放在各自独立的槽位里,不混写。
- 批的大小有上限,示例中取32。再大,每个人的个体信息在上下文里被稀释,趋同会更严重。
- 输出必须是预先定义的动作ID加一句理由。模拟器校验动作是否合法,不合法就重试一次,仍不合法就回退到规则。
“在预先生成的动作空间里选择”并不是本站的发明。Ye 等团队于2025年在 MobileCity 一文中报告,他们的多交通方式城市模拟使用4,000个模拟智能体,并通过预生成动作空间和用本地模型生成智能体记忆来降低算力成本。它印证的是一个通用做法:让模型在有限选项里做选择,而不是每次自由生成一段行动描述再去解析。
模型的分工也是分层的:偏差档的日常小事,用较小的模型或模板化提示就够了,成本低、延迟短;重大档才动用较强的模型,因为这些决定要解释得清、影响也长。把强模型留给少数时刻,是批量推理省下来的钱能够花在刀刃上的前提。
检验分组是否合格,看批内动作的集中度。如果同一批32个居民里,选择同一个动作的比例超过某个阈值(假设为80%),而他们的画像本来应当产生分歧,这一批结果就要标记并重排。
居民A不必等居民B:依赖关系决定了能并行多少
成批调用解决的是“一次问多少人”,还有另一个问题:什么时候可以问。最朴素的做法是全城同步,每个时间片所有居民一起决策,最慢的那批拖住所有人。Xie 等团队在同一篇论文里指出,全局同步步进会制造“假依赖”,限制并行度和批大小,他们用依赖追踪做乱序执行,摘要报告相对带全局同步的标准并行模拟有1.3倍到4.15倍的加速。同样要强调,这是他们那组工作负载和硬件上的结果。
放到城市里,道理很直观。住在城北的居民和城南的居民,午饭去哪里互不相干,谁也不需要等谁。真正需要排队的是有交互的情形:两个人竞争同一个岗位名额,一群人挤同一条路段,几个人抢同一家小店的最后几个座位。大发娱乐城市AI的做法是把模型只当作“意图”的来源,冲突由模拟器按确定性规则结算:岗位名额、路段容量、店铺库存都由模拟器裁决,被拒绝的居民带着“落选”这条新信息回到下一轮。这样,没有依赖的居民可以各自推进,有依赖的才互相等待,结算结果也可以复现。
这种分工与事件驱动的NPC调用方式是同一个思路:模型只在有事发生的时候出场,其余时间由模拟器自己往前走。
省下来的时间,不能换成看不见的错误
批量推理引入了几类单个调用时不会出现的失败,设计时要逐个堵上。
失败一:趋同造成集体行动
早高峰,一批居民同时判断“地铁比公交快”,一起改乘地铁,结果车厢爆满。对策有三层:批内保留画像差异,让对拥挤敏感度不同的人给出不同倾向;把地铁当前的拥挤度放进快照;最后由模拟器按容量结算,超出的人改乘备选。
失败二:拿着过期状态做决定
批次发出时,某家超市还有货;模型返回时,货已经被前面的居民买光。对策是返回时按最新状态再校验一遍,失效的意图进入下一轮重排,而不是硬执行。
失败三:动作写回了,理由没写回
批处理很容易只更新“他去了哪里”,却没有更新“他为什么这么做”,结果居民第二天像失忆,无法解释自己的选择。对策是每个返回项必须附带一句话的记忆摘要,重大档才写完整的长记忆,两者分开存储,成本也不同。
每个模拟日结束后该看哪几个数
大发娱乐的模拟里,批量推理是否健康,不能靠“看起来居民都很忙”来判断,需要一份每天都能读出来的账本。示例指标如下:
- 每居民每日模型调用次数:整体是否落在预算内,有没有某个类型突然翻倍。
- 惯性档占比:过低说明阈值太敏感,过高说明居民对世界变化反应迟钝。
- 批内动作集中度:衡量“平均化”,是最重要的一个数。
- 回退到规则的比例:模型输出不合法或超时的比例,持续偏高说明提示词或动作空间有问题。
- 返回后二次校验的驳回率:反映批次延迟带来的状态过期有多严重。
- 同类居民的跨日行为差异:同一画像的人,每天是否总在做完全相同的事。
如果想了解玩家侧感受到的表现,可以对照大型模拟运行很慢时的规模与设备关系,以及几千个角色同时运行时的性能问题。这些文章从不同角度讨论的是同一件事:算力总是有限的,模拟要决定把它花在哪里。
批量推理真正的价值,并不是让大发娱乐城市AI里的4000个居民“想得更快”,而是让他们在绝大多数时刻根本不用想,把有限的推理留给少数真正改变轨迹的时刻,并且保证这些时刻的答案彼此不同。