先做一道算术题:全员每秒思考行不行

假设一座虚拟城市有1万个角色,每个角色每天要做30次决定,这只是示意,用来体会量级。如果每次决定都调用一次大模型,一天就是30万次调用。再假设每次调用包含记忆检索、当前状态和输出,都需要相当长的上下文,那么成本、延迟和并发压力都会立刻成为问题。

更糟的是,这30万次里,绝大多数在决定“下一步走哪条路”“午饭吃什么”,对任何玩家可见的故事都没有影响。把算力花在无人观看、也无后果的决定上,是最纯粹的浪费。

这并不只是我们的担忧。公开的研究里,Generative Agents 类系统因为频繁调用大模型而成本很高,Affordable Generative Agents 一类工作正是围绕这一点,提出分层决策、异步自我监控和“总结并遗忘”的记忆机制来降低调用成本,论文自述可降低最多约两个数量级。我们不把这个数字当作自己的成绩,只把它当作一个方向的证据:问题可以通过结构而不是单纯堆算力来解决。

精度跟着关注度走:把城市分成几档

思路的核心是一句话:不是每个人都需要同样的精度。可以把角色分成几档(示意):

档位 谁属于这一档 怎么推进
高精度 玩家周围、正在参与关键事件的角色 完整记忆检索、大模型规划与对话
中精度 与高精度角色有强关系、可能很快被卷入的人 规则为主,偶尔用大模型做关键选择
低精度远处、暂时无关的大多数角色 按家庭或街区聚合,规则与摘要低频更新

这与图形学里的“细节层次”(LOD)是同一种思想:近处的物体用高模,远处的用低模。区别在于,这里省下的不是多边形,而是决策的粒度。远处的面包师依然在“过日子”,只是系统不再逐句模拟他的心理活动,而是每隔一段时间统一结算他的收入、支出和关系变化。

这也是 AI模拟人生 里提到的“选择性模拟”:把大模型集中用在最需要细腻表达与决策的时刻。

事件聚合:一场大雨不必对一万个人各说一遍

分档解决的是“谁需要精细”,事件聚合解决的是“同类的事不要重复算”。

设想城里下了三天大雨,会同时影响所有摆摊的人。逐个模拟每个摊主的心情,既没有必要,也算不动。更好的做法是:

  1. 事件先在群体层面结算:以街区或行业为单位,计算这场雨使摆摊收入下降了多少。
  2. 再把结果分发给个体:每个家庭的账户按规则更新,情绪与压力随之调整。
  3. 只有被选中的人展开细节:比如玩家正好在场,或者某位摊主的状态跨过了“值得讲述”的阈值。

家庭、街区、企业都是天然的聚合单位。它们本来就是社会结构的一部分,用它们来分块,比随意切割更容易保持因果。失业后果的传播 里提到的“按街区聚合结算”,就是这一思路的具体例子。

升级与降级:角色如何在精度之间切换

分层最难的地方在于切换。一个原本在低精度里低频推进的角色,因为玩家走近或者事件牵动,需要升级为高精度,这个过程至少要做三件事:

  • 补全状态:根据聚合期间的摘要,恢复出一份当前可用的状态,比如“这周他一直在找工作,压力较高,与房东有些不愉快”。
  • 保持连续:升级后的行为不能与降级前的记录矛盾,不能刚才还是失业状态,一走近就突然有了工作。
  • 控制并发:同一时刻不能有太多角色同时升级,需要有优先级和预算上限。

降级则相反:事件平息后,把这段高精度经历压缩为几条摘要,写入长期记忆,并释放资源。压缩时保留什么很关键,重大承诺、关系转折、创伤类事件应被保护,琐碎的对话可以丢弃。这和 记忆系统怎么决定记什么、忘什么 中的写入与整合思路是同一套。

一个容易出错的地方是边界抖动:玩家在临界距离来回走动,角色反复升降,造成状态被反复重建。常见办法是加入迟滞,升级的门槛高一些,降级的门槛低一些,并设置最短停留时间。

举一个示意的例子:镇上的面包师在低精度档里,系统每周只结算一次,记录“收入略降、与供货商关系平稳”。某天玩家走进面包店,他被升级为高精度,系统用这几条摘要拼出他今天的状态:生意清淡,有点心事,但对老顾客依旧热情。玩家离开、当天的对话结束后,他再被降级,这次谈话被压缩成一条“玩家关心过我的生意”的关系记忆。下一次升级时,这条记忆就能被取回来,他会记得被问候过,而不是从头再来。

记忆的“总结并遗忘”,是规模化的另一半

即使是高精度角色,也不能把所有经历都放进上下文。随着时间推移,每个人的经历都会增长,检索也会变慢、变贵。

因此记忆需要生命周期:新的观察先进入近期记忆;一段时间后被总结成更高层的认识;不重要的细节逐渐被遗忘,重要的部分保留。Generative Agents 论文里的反思机制,正是把观察提炼成更高层认识的一种做法。对规模化来说,它的意义在于:每个角色携带的上下文有上限,而不是随着模拟天数一路膨胀

这也决定了预算的另一种写法:不是“每个角色每天几次调用”,而是“每天一共有多少调用预算,怎么分配给最值得的角色”

预算调度:谁值得这次调用

把这些拼起来,就得到一个调度问题:在有限的调用预算内,每一轮让谁升级、让谁思考、让谁只做规则结算?

可以用几个简单的信号来排序(示意):

  1. 与玩家的距离与可见度:玩家看得到的优先。
  2. 事件相关度:正处于冲突、转折点的角色优先。
  3. 叙事重要度:作者标记的关键角色优先。
  4. 状态变化幅度:变化大的角色更值得展开。

预算耗尽时,也要有降级策略:宁可让远景变粗糙,也不能让玩家眼前的人物变得迟钝。

压缩之后,怎么知道社会没有走样

压缩带来的风险是:为了算得动,社会可能不再自洽。需要检查这些问题:

  • 守恒:聚合结算前后,货币、人口这类总量是否与逐个模拟的结果大致一致。
  • 一致:升级后的角色与降级前的记录是否矛盾。
  • 敏感性:同一个事件,低精度与高精度模拟得出的趋势是否相近;差异过大就说明聚合规则有问题。
  • 回放:用相同的种子重放,能否复现同样的结果,便于定位问题。
说明:本文的城市规模、决策次数和分档方式都是示意与假设,用来解释预算逻辑,不代表大发娱乐已经达到的规模。压缩后的模拟追求可信与一致;文中引用的研究属于研究性模拟,研究性模拟不等于预测现实。

小结:省下的是无人观看的计算

让一万个AI人物活起来,关键不是同时调动一万个大模型,而是让精度跟着关注度走,事件按群体结算,记忆有生命周期,切换有迟滞与预算。省下来的,是对故事没有影响的那部分计算;留下来的,是人物、家庭、经济与关系之间可被检查的因果。