Skip to content

性格

每个 NPC 都有性格。它影响着每一个决策、每一篇日记、每一次互动。

为什么需要性格?

没有性格,NPC 的行为千篇一律。有了性格,它们才成为

AI World Sim 中的性格系统:

  • 量化 —— 以数值特质存储,而非自由文本
  • 稳定 —— 很少改变(仅在重大生活事件时)
  • 有影响力 —— 偏置 NPC 的每一个行为

模型:大五人格 + 自定义特质

我们采用混合方案:

大五人格特质(OCEAN)

每个 NPC 在大五人格维度上都有评分:

特质范围含义
开放性0-1好奇心、创造力、对新体验的开放程度
尽责性0-1条理性、自律、可靠性
外向性0-1社交能力、活力、健谈程度
宜人性0-1信任感、利他性、合作意愿
神经质0-1焦虑感、情绪化、情绪波动性

自定义特质

此外,每个 NPC 还有一组二值或量化的自定义特质:

特质范围含义
romantic0-1寻求浪漫关系的可能性
aggressive0-1发起争吵的可能性
religious0-1去教堂、祈祷的频率
alcohol_tolerance0-1在酒馆喝多少酒
risk_taking0-1冒身体/财务风险的意愿
parental0-1对子女幸福的关注程度
gossipy0-1谈论他人的倾向

性格如何影响行为

决策偏置

在决策模块中,性格修正器会被应用:

ts
function applyPersonality(action: Action, personality: Personality): number {
  let modifier = 1.0;

  if (action.type === 'go_to_pub' && personality.extraversion < 0.3) {
    modifier *= 0.5;  // introvert avoids pub
  }
  if (action.type === 'start_argument' && personality.agreeableness > 0.7) {
    modifier *= 0.3;  // agreeable person avoids arguments
  }
  if (action.type === 'try_new_food' && personality.openness > 0.7) {
    modifier *= 1.5;  // open person is curious
  }

  return modifier;
}

日记风格

性格偏置日记生成:

  • 高神经质 → 更情绪化、焦虑的语调
  • 高开放性 → 更多反思、哲学性
  • 低宜人性 → 对他人更挑剔
  • 高尽责性 → 更有条理,提及职责

对话风格

当两个 NPC 互动时,性格影响谁说得多、谁会打断、谁会道歉。


性格档案(示例 NPC)

Margaret Caldwell(58 岁,退休图书管理员)

yaml
big_five:
  openness: 0.8
  conscientiousness: 0.85
  extraversion: 0.4
  agreeableness: 0.7
  neuroticism: 0.6

custom:
  romantic: 0.2
  aggressive: 0.1
  religious: 0.5
  alcohol_tolerance: 0.4
  risk_taking: 0.1
  parental: 0.7
  gossipy: 0.6

解读: 内敛但温暖,做事有条理,偶尔焦虑。喜欢聊天但不太主动。深爱自己的孩子。

Tom Whitfield(52 岁,医院杂工,夜班)

yaml
big_five:
  openness: 0.4
  conscientiousness: 0.7
  extraversion: 0.6
  agreeableness: 0.6
  neuroticism: 0.4

custom:
  romantic: 0.3
  aggressive: 0.4
  religious: 0.2
  alcohol_tolerance: 0.7
  risk_taking: 0.5
  parental: 0.5
  gossipy: 0.4

解读: 务实,社交但不张扬。比大多数人更爱去酒馆喝酒。不怕说出自己的想法。


性格变化

性格基本稳定。但重大生活事件可能导致偏移:

事件可能的变化
至亲去世神经质 ↑
坠入爱河宜人性 ↑
重大疾病尽责性 ↑,开放性 ↓
工作晋升外向性 ↑
搬到新城镇开放性 ↑

这些变化幅度很小(每次事件 ≤ 0.1)且缓慢(单次事件很少改变一个人)。


生成方式

NPC 性格在世界创建时一次性生成,使用:

  1. 种子(NPC 的原型:"退休图书管理员"、"夜班杂工")。
  2. 小幅随机方差。
  3. 约束条件(没有任何特质低于 0.1 或高于 0.95——人不会太极端)。

相同种子 → 相同性格,因此性格在不同世界间是可复现的。


数据模型

ts
interface Personality {
  npcId: string;

  big_five: {
    openness: number;
    conscientiousness: number;
    extraversion: number;
    agreeableness: number;
    neuroticism: number;
  };

  custom: {
    romantic: number;
    aggressive: number;
    religious: number;
    alcohol_tolerance: number;
    risk_taking: number;
    parental: number;
    gossipy: number;
  };

  version: number;       // incremented on each change
  lastChangedAt: WorldTime;
}

存储在 D1 表 npc_personality 中。

Released under the MIT License.