性格
每个 NPC 都有性格。它影响着每一个决策、每一篇日记、每一次互动。
为什么需要性格?
没有性格,NPC 的行为千篇一律。有了性格,它们才成为人。
AI World Sim 中的性格系统:
- ✅ 量化 —— 以数值特质存储,而非自由文本
- ✅ 稳定 —— 很少改变(仅在重大生活事件时)
- ✅ 有影响力 —— 偏置 NPC 的每一个行为
模型:大五人格 + 自定义特质
我们采用混合方案:
大五人格特质(OCEAN)
每个 NPC 在大五人格维度上都有评分:
| 特质 | 范围 | 含义 |
|---|---|---|
| 开放性 | 0-1 | 好奇心、创造力、对新体验的开放程度 |
| 尽责性 | 0-1 | 条理性、自律、可靠性 |
| 外向性 | 0-1 | 社交能力、活力、健谈程度 |
| 宜人性 | 0-1 | 信任感、利他性、合作意愿 |
| 神经质 | 0-1 | 焦虑感、情绪化、情绪波动性 |
自定义特质
此外,每个 NPC 还有一组二值或量化的自定义特质:
| 特质 | 范围 | 含义 |
|---|---|---|
romantic | 0-1 | 寻求浪漫关系的可能性 |
aggressive | 0-1 | 发起争吵的可能性 |
religious | 0-1 | 去教堂、祈祷的频率 |
alcohol_tolerance | 0-1 | 在酒馆喝多少酒 |
risk_taking | 0-1 | 冒身体/财务风险的意愿 |
parental | 0-1 | 对子女幸福的关注程度 |
gossipy | 0-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 性格在世界创建时一次性生成,使用:
- 种子(NPC 的原型:"退休图书管理员"、"夜班杂工")。
- 小幅随机方差。
- 约束条件(没有任何特质低于 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 中。