我花了一年左右的时间构建一个AI文本冒险平台,其中耗费最多工程时间的问题正是每个玩家都会抱怨的:模型会遗忘。我想把那些无效的尝试写下来,因为我认为失败模式比解决方案本身更有意思。

无效尝试:加强摘要
显而易见的做法是随着对话记录增长进行压缩。我们这样做了,反复调优,但玩家仍然反映出现偏移。原因是摘要恰好往错误的方向造成了信息损失——它保留了情节却丢弃了具体细节。"你抵达首都并遇见了商人"被保留下来;"你把母亲的戒指给了她"却未能留存。而戒指恰恰是玩家在意的东西。我们系统性地删除了承载情感的关键细节,只保留了故事骨架。

无效尝试:更大的上下文窗口
更长的上下文窗口将问题推迟了几小时,但让每次行动变得更慢、更昂贵。同时也加剧了第二种失败——当提示词中包含4万token的历史记录时,模型开始引用无关的旧事件,这呈现出另一种失常。

有效方案:彻底放弃以文本形式存储历史
现在,每个行为产生结构化结果,这些结果被写入世界状态——人际关系、派系立场、实体事实、与特定地点和人物关联的事件。检索系统会根据你当前所在地点、在场人物以及近期历史来组装提示词,而不是依赖滚动的对话记录。

具体来说,戒指变成了附着在角色身上的一个事实,而不是在上下文中争夺位置的一句话。二十次对话后,NPC能够主动提及它,因为检索它只需一次查找,而不需要为它在上下文窗口中预留位置。

过程中让我惊讶的几点:

  • 你没注意到的后果才是最有价值的。 手动编年史/世界信息的方式下,只有玩家记下来的事实才会留存。而基于状态的数据捕获能保留玩家即兴发挥后又遗忘的细节——正是这些细节让角色回访显得奇妙而非机械。
  • 世界需要在无人注视时自行运转。 我们在两次对话之间运行模拟进程,推动派系和冲突的发展。这在"让世界显得鲜活"方面比任何提示工程都有效。
  • 涟漪效应需要硬性上限。 让后果在实体图中自由传播,两步以内效果很好,到四步就变得混乱。我们限制了遍历深度。涌现是好的,但无界的涌现就是噪音。
  • 叙事者的语气不如是否记得更重要。 早期我们花了很多精力在文笔质量上。但用户的留存取决于叙事的连贯性,而非文风。

乐意深入探讨任何部分——检索组装和模拟进程管道是我最想与采用不同解决方案的人交流心得的环节。

(声明:这是我的产品。版主,按规则4标注为商业自荐。正文不附链接——有兴趣的话可以在我的个人资料里找到。)