Skip to content

ALICE PROJECT — 综合报告

状态:持续更新中 | 模拟运行:test_1_3days(72步,正在进行)| 已完成步骤:12/72

本报告涵盖 ALICE PROJECT 的全部技术细节:论文原理、认知架构、世界地图、角色设定、系统实现、以及实际模拟记录。


目录

  1. 项目概述
  2. 理论基础:Generative Agents 论文
  3. 认知架构详解
    • 3.1 主循环
    • 3.2 记忆流(Memory Stream)
    • 3.3 检索系统(Retrieval)
    • 3.4 反思(Reflection)
    • 3.5 计划系统(Planning)
    • 3.6 感知系统(Perceive)
    • 3.7 执行系统(Execute)
    • 3.8 对话系统(Conversation)
    • 3.9 反应与重新计划
  4. 世界地图:The Ville(Smallville)
  5. 25 个角色(Persona)详细档案
  6. 25 人初始人际关系网络
  7. ALICE PROJECT 系统实现
  8. LLM 与嵌入模型实现细节
  9. 空间记忆与 A* 寻路
  10. 模拟运行记录:test_1_3days
  11. 关键参数速查表
  12. 原论文 vs ALICE 差异分析
  13. ALICE 扩展世界:TANAPOCIA 设定
  14. 测试套件
  15. 依赖与环境

1. 项目概述

ALICE PROJECT 是对 Park et al. (2023) 论文《Generative Agents: Interactive Simulacra of Human Behavior》的忠实复现与工程化实现。

核心目标

  • 忠实复现论文中的 Generative Agents 认知架构
  • 将 LLM 替换为本地 Ollama 推理(Qwen3 14B),零成本运行
  • 拆分"模拟模式"(CLI 后台运行)和"回放模式"(前端可视化)
  • 提供完整的前端地图可视化与角色动画

技术栈

技术 说明
LLM Ollama + Qwen3 14B (Q4_K_M) 本地推理,~10-12GB VRAM,~60 tok/s
嵌入模型 sentence-transformers/all-MiniLM-L6-v2 记忆向量化,384 维
后端 Python 3.11 + FastAPI 认知逻辑 + REST API
前端 React + TypeScript + Phaser 3 地图渲染 + 角色动画
运行环境 conda alice (Python 3.11) Windows 11
LLM API OpenAI-compatible (localhost:11434/v1) Ollama 标准接口

目录结构

ALICE_PROJECT/
├── backend/
│   ├── config.py              # 全局配置(LLM、路径)
│   ├── main.py                # FastAPI 服务(回放 API)
│   ├── simulate.py            # CLI 模拟入口(无前端)
│   ├── world_engine.py        # 世界引擎(主循环)
│   ├── recorder.py            # 模拟录制器(保存 master_movement.json)
│   ├── maze.py                # 地图/地形系统
│   └── persona/               # 认知模块
│       ├── persona.py         # 核心 move() 方法
│       ├── memory_structures/ # 记忆流、Scratch、空间记忆
│       └── cognitive_modules/ # perceive, retrieve, plan, reflect, converse, execute
├── frontend/
│   └── src/
│       ├── App.tsx            # React 主界面(回放控制器)
│       ├── GameScene.ts       # Phaser 3 游戏场景
│       └── api.ts             # 后端 API 调用
├── data/
│   ├── worlds/the_ville/      # 世界定义(地图、初始角色设定)
│   └── saves/                 # 模拟存档(master_movement.json)
└── documentation/             # 原论文与代码参考

2. 理论基础:Generative Agents 论文

论文:Joon Sung Park, Joseph C. O'Brien, Carrie J. Cai, Meredith Ringel Morris, Percy Liang, Michael S. Bernstein. "Generative Agents: Interactive Simulacra of Human Behavior." UIST '23, October 29 - November 1, 2023, San Francisco, CA, USA.

2.1 研究动机与问题定义

人类社会是极其复杂的系统——人们记住过去的经历、根据经验形成计划、彼此之间发展出复杂的关系。长久以来,在交互式系统(如游戏、社会模拟、训练环境)中创建可信的类人行为代理(believable agents)一直是人机交互和人工智能领域的核心挑战。

传统的 NPC 行为通常采用以下方式实现:

  • 有限状态机(FSM):预先编写固定的行为规则(如"看到敌人→攻击→血量低→逃跑"),行为模式有限且可预测
  • 行为树(Behavior Tree):更灵活的树状结构决策,但仍然需要设计者手动编写所有可能的行为分支
  • 基于规则的系统:if-then 规则库,无法处理未预设的场景
  • 简单的强化学习代理:可以学习最优策略,但难以展现社交行为、情感记忆等复杂人类特征

这些方法的根本局限在于:它们无法产生真正的"涌现行为"——即未被设计者预先编程、而是从简单规则中自发产生的复杂社会行为。

Park et al. 的核心洞察是:大型语言模型(LLM)在大规模人类语料上的预训练,使其隐式地学习了人类行为的丰富模式——包括日常作息、社交礼仪、情感反应、目标导向行为等。如果能设计合适的架构将 LLM 的这种能力与记忆、计划、反思机制结合,就能让虚拟角色展现出前所未有的类人行为。

2.2 "可信行为"的定义

论文沿用了 Bates (1994) 对"believable agent"的经典定义,并进一步细化为以下可观察的行为维度:

行为维度 描述 示例
个体连续性 代理的行为应在时间上保持一致,反映出稳定的个性和持续的记忆 Isabella 每天早上 6 点起床开咖啡馆,这一习惯在多天模拟中保持一致
环境感知 代理应能感知并响应周围环境的变化 看到有人在咖啡馆,决定上前打招呼
社交意识 代理应理解自身与他人的关系,并据此调整行为 对好友说话更亲密,对陌生人更礼貌
目标导向 代理应有长期和短期目标,并能自主制定和调整计划 Isabella 筹备情人节派对:列清单→采购→邀请→布置
情感反应 代理应对事件产生合理的情感响应 被拒绝参加派对后感到失望
记忆与学习 代理应记住过去的互动,并从中学习 记得昨天和 Maria 的对话,今天见面时提起

论文特别强调,可信性不等于理性最优——人类并不总是做出"最优"决策,有时会因情绪、偏见、信息不完整而做出"不理性"但"合理"的行为。一个可信的代理同样应该展现这种人类式的"有限理性"。

2.3 核心贡献

本论文提出了一种生成式代理(Generative Agent)架构,使 LLM 驱动的虚拟角色能展示可信的类人行为。三大创新模块:

  1. 记忆流(Memory Stream):用自然语言记录代理的全部经历,形成一个不断增长的经历数据库。与传统的状态变量不同,记忆流保留了经历的全部语义细节。
  2. 检索(Retrieval):基于时近性(recency)重要性(importance)相关性(relevance)三因子加权检索相关记忆。这一机制模拟了人类注意力的选择性——不是所有记忆都同等重要,最近的、最重要的、与当前情境最相关的记忆会优先浮现。
  3. 反思(Reflection):定期将底层记忆综合为更高层次的抽象洞见(higher-level insights)。例如,从多次观察到"Klaus 经常在图书馆"、"Klaus 在写研究论文"、"Klaus 讨论社会问题"等底层记忆中,反思出"Klaus 是一个对社会公正充满热情的勤奋研究者"这一高层概括。反思产生的节点本身也进入记忆流,可被后续检索和进一步反思引用,形成递归抽象

此外,论文将这三个模块与计划(Planning)反应(Reacting)系统相结合:

  • 计划系统:代理每天生成日程计划,并将计划分解为逐小时、逐任务的细粒度行动序列
  • 反应系统:当代理感知到新事件(如遇到另一个代理)时,可以选择发起对话、等待、或忽略,并据此动态调整当前计划

2.4 架构总览

论文提出的生成式代理架构可以用以下流程概括:

感知(Perceive)
    │
    ▼
检索(Retrieve)──→ 记忆流(Memory Stream)
    │                      ▲
    ▼                      │
计划/反应(Plan/React)    反思(Reflect)
    │
    ▼
执行(Execute)──→ 环境变化 ──→ 被其他代理感知

信息流详解

  1. 感知:代理观察视野内的环境变化(其他代理的行为、物体状态变化)
  2. 存储:感知到的事件被编码为自然语言描述,附加时间戳和重要性评分,存入记忆流
  3. 检索:根据当前情境,从记忆流中检索最相关的记忆子集
  4. 计划/反应:基于检索到的记忆和当前情境,LLM 生成行动计划或对事件的反应
  5. 反思:当累积的感知重要性超过阈值时,自动触发反思,生成高层次洞见
  6. 执行:将计划转化为环境中的具体行动(移动、交互、对话)

这一架构的关键设计原则是"everything is in natural language"——记忆、计划、反思都以自然语言形式存储和处理,这使得 LLM 可以直接在这些结构上进行推理,无需复杂的符号系统或知识图谱。

2.5 Smallville 世界

论文构建了名为 Smallville 的虚拟小镇(ALICE 中称 "The Ville"),包含 25 个代理,他们:

  • 每天起床、做早餐、上班
  • 在合适的时间和地点进行社交互动
  • 对彼此形成看法和关系
  • 协调复杂的社会活动(如情人节派对)

Smallville 的环境设计参考了《The Sims》(模拟人生)系列游戏,但与 Sims 的关键区别在于:

  • Sims:行为由玩家指令 + 预设的需求衰减系统驱动(饥饿值→吃饭,社交值→聊天)
  • Smallville:行为完全由 LLM + 记忆架构驱动,没有硬编码的需求系统

这一设计使得 Smallville 中的代理可以展现 Sims 中不可能出现的行为:自发组织社会活动、传播信息、形成和改变对他人的看法、基于过去经验调整未来行为。

2.6 涌现社会行为

论文中最引人注目的发现是一系列未被预先编程的涌现社会行为(emergent social behaviors)

信息扩散(Information Diffusion)

当 Sam Moore 决定竞选市长时,这一信息通过自然的对话链在社区中传播:

Sam Moore(宣布竞选)
  → 告诉妻子 Jennifer Moore
  → 在公园告诉邻居
    → 邻居在咖啡馆告诉其他人
      → 两天内,大部分镇民都知道了这件事

关键点在于:这种信息传播没有任何预设机制。Sam 只是在对话中提到了竞选,其他代理记住了这个信息,并在后续与其他人对话时自然地提到。这与人类社会中的"口碑传播"机制高度一致。

关系记忆与社交协调

代理能记住与特定他人的过往互动,并在后续相遇时引用:

  • Klaus 和 Maria 之间因频繁的图书馆偶遇而逐渐建立更亲密的关系
  • Isabella 记住了每个答应参加派对的人,并在之后的相遇中确认出席

自发协调集体活动

情人节派对实验是论文的核心端到端评估:

  • 初始设定:仅给 Isabella Rodriguez 一条指令——她想举办情人节派对
  • 完全无干预:此后研究者不对任何代理发出任何指令
  • 观察到的涌现行为链
    1. Isabella 决定在 Hobbs Cafe 举办情人节派对(2月14日下午5-7点)
    2. Isabella 在咖啡馆工作时逐个邀请来店的顾客
    3. Maria Lopez(Isabella 的好友兼常客)得知消息后答应参加
    4. Maria 遇到 Klaus Mueller(她暗恋的对象)时邀请他一起参加
    5. Klaus 考虑后决定参加,并为此调整了当天的学习计划
    6. 最终 5 个代理自发协调时间出席派对
    7. 邀请信息通过社交网络自发扩散——有些代理是被 Isabella 直接邀请的,有些是通过第三方得知的

这个实验展示了 "micro-motives → macro-behavior"(微观动机产生宏观行为)的经典社会学现象在 AI 系统中的首次复现。

2.7 评估方法论

论文采用了三种互补的评估方式:

受控评估(Controlled Evaluation)

研究者设计了一系列场景,测试代理在特定情境下的行为是否合理。由人类评估者对代理的行为进行打分,判断其是否"可信"。

具体方法:将代理在特定场景下的行为描述提取出来,让人类评估者(未被告知这些行为由 AI 生成)在 1-10 的量表上评价这些行为的可信度。作为对照,评估者同时评价了以下对照组:

对照条件 说明
完整架构 记忆流 + 检索 + 反思 + 计划(完整系统)
无反思 移除反思模块,其余保留
无检索 使用最近 N 条记忆而非三因子检索
无计划 无日程计划,即时决策
人类基准 由人类扮演相同角色的行为描述

结果表明:完整架构的可信度评分与人类基准接近,且显著高于所有消融条件。

端到端评估(End-to-End Evaluation)

即上述的情人节派对实验。评估指标包括:

  • 信息扩散的自然程度(是否像人类口碑传播)
  • 社会协调的有效性(多少代理最终参加了派对)
  • 关系动态的合理性(代理是否根据已有关系做出不同反应)

访谈评估(Interview Evaluation)

研究者在模拟运行两天后,以"记者"身份介入世界,逐一采访每个代理,测试他们的:

  • 自我认知(Self-knowledge):代理能否准确描述自己的身份、职业、日常生活?
  • 记忆准确性(Memory):代理能否回忆起过去两天的具体事件和对话?
  • 计划能力(Plans):代理能否描述自己的未来计划和目标?
  • 反应合理性(Reactions):面对假设性问题(如"如果 X 发生了你会怎么做"),代理的回答是否合理?
  • 反思深度(Reflections):代理能否对自己的经历做出有深度的总结和反思?

2.8 消融实验详解

消融实验是论文评估的核心部分,通过系统性地移除架构中的各个组件来量化其贡献:

移除组件 具体影响 典型失败案例
记忆流 行为不连贯,忘记之前的交互;每次相遇都像第一次见面 代理反复向同一个人做自我介绍;忘记昨天的对话内容
反思 无法形成高层次理解,行为浅薄;只能基于表面记忆做决策 代理无法概括"Klaus 是一个勤奋的学生",只能记住零散的观察
计划 行为无组织,无法维持日常生活节律;行为变得随机和反应式 代理在凌晨3点去咖啡馆,或一整天都在做同一件事
检索(降级为最近N条) 无法在相关时刻调用重要记忆;重要但较早的记忆被遗忘 遇到 Maria 时无法回忆起两天前答应帮她的事

消融实验的一个重要发现是:各组件之间存在强协同效应。单独移除任何一个组件的性能下降,都大于该组件"独立贡献"的简单加法——这说明记忆、检索、反思、计划不是独立工作的,而是构成了一个相互依赖的认知系统。

2.9 论文的局限性与未来方向

作者在论文中坦诚讨论了以下局限:

架构层面

  • 幻觉问题(Hallucination):LLM 偶尔会生成与事实不符的记忆或计划,例如"记住"一个从未发生的对话
  • 长期一致性:随着模拟时间的延长(超过数天),代理的行为可能逐渐偏离其设定的核心人格
  • 推理深度有限:代理在需要多步推理的复杂情境中表现不佳,如理解复杂的社会博弈

实验层面

  • 规模有限:仅 25 个代理,真实社会系统涉及数千到数十亿人
  • 环境简化:Smallville 的物理环境高度简化,缺少真实世界的许多维度(天气、经济系统、身体需求)
  • 评估主观性:对"可信行为"的评估本质上依赖主观判断

成本与效率

  • 原论文使用 GPT-3.5/GPT-4,每个代理每时间步需要多次 LLM 调用(感知评分、计划生成、反思、对话等),25 个代理运行一天(约 2880 步,每步 10 秒)的 API 成本显著
  • 推理延迟限制了实时交互的可能性

作者提出的未来方向包括:

  • 扩大代理规模至数百或数千
  • 引入更丰富的环境交互(经济系统、资源竞争)
  • 探索代理之间的长期文化和制度涌现
  • 优化架构以降低 LLM 调用成本
  • 研究人类-代理混合社区的可能性

2.10 学术影响与后续发展

Generative Agents 论文自 2023 年发表以来产生了广泛影响:

直接影响

  • 论文在 UIST '23 获得最佳论文奖(Best Paper Award),截至 2025 年被引用超过 2000 次
  • Joon Sung Park 以此为核心在 Stanford 完成博士论文答辩
  • Stanford 于 2024 年秋季开设 CS 222: AI Agents and Simulations 课程,由 Joon 主讲

后续研究

  • AgentSims(2023):开源框架,支持更灵活的代理配置和环境定义
  • Voyager(2023,Nvidia):将类似的记忆-检索-计划架构应用于 Minecraft 中的自主探索代理
  • MetaGPT(2023):将多代理协作引入软件开发流程
  • CAMEL(2023):探索代理之间的角色扮演和协作机制
  • Simulacra's Children(各种后续工作):探索更大规模、更长时间的社会模拟

产业影响

  • 多家游戏公司开始探索将 LLM 驱动的 NPC 集成到游戏中
  • 社会科学研究者开始使用类似架构模拟社会实验(如政策影响评估、流行病传播模拟)
  • 教育领域探索使用生成式代理作为虚拟教学助手和角色扮演伙伴

3. 认知架构详解

3.1 主循环

每个时间步,每个 persona 依次执行:

perceive(maze) → retrieve(perceived) → plan(maze, personas, new_day, retrieved) → reflect() → execute(maze, personas, plan)
# persona.py: move() 方法
def move(self, maze, personas, curr_tile, curr_time):
    self.scratch.curr_tile = curr_tile

    # 判断是否新的一天
    new_day = False
    if not self.scratch.curr_time:
        new_day = "First day"
    elif (self.scratch.curr_time.strftime('%A %B %d')
          != curr_time.strftime('%A %B %d')):
        new_day = "New day"
    self.scratch.curr_time = curr_time

    perceived = self.perceive(maze)
    retrieved = self.retrieve(perceived)
    plan = self.plan(maze, personas, new_day, retrieved)
    self.reflect()
    return self.execute(maze, personas, plan)

返回值(next_tile, pronunciatio, description) 三元组

  • next_tile:下一步要走到的地图格子坐标 (x, y)
  • pronunciatio:当前动作的 emoji 表达(如 "😴"、"☕")
  • description:完整的动作描述(如 "sleeping @ the Ville:...")

3.2 记忆流(Memory Stream / Associative Memory)

ConceptNode 数据结构

class ConceptNode:
    node_id        # "node_1", "node_2", ...
    node_count     # 全局序号
    type_count     # 类型内序号
    type           # "event" | "thought" | "chat"
    depth          # 0=event, 1+=thought/reflection

    created        # datetime 创建时间
    expiration     # datetime 过期时间(可为 None)
    last_accessed  # datetime 最后访问时间(检索时更新)

    subject        # 主语(如 "Isabella Rodriguez")
    predicate      # 谓语(如 "is")
    object         # 宾语(如 "cooking breakfast")

    description    # 完整自然语言描述
    embedding_key  # 嵌入向量的键
    poignancy      # 重要性评分 1-10
    keywords       # 关键词集合(用于快速索引)
    filling        # evidence node_id 列表(thought 的证据链)

三种节点类型

类型 depth 说明 示例
event 0 感知到的事件 "Isabella Rodriguez is cooking breakfast"
thought 1+ 反思产生的洞见 "Isabella values community and relationships"
chat 0 对话记录 "Isabella chatted with Maria about the party"

持久化格式

记忆流保存为三个 JSON 文件: - nodes.json:所有节点的序列化数据 - embeddings.json:所有嵌入向量(384 维) - kw_strength.json:关键词强度数据


3.3 检索系统(Retrieval)

检索公式

score = α_recency × recency_normalized × 0.5
       + α_relevance × relevance_normalized × 3.0
       + α_importance × importance_normalized × 2.0

权重比例:relevance(3.0) > importance(2.0) > recency(0.5)

Recency(时近性)

# 按 last_accessed 升序排列后,使用索引位置的指数衰减
recency_decay = 0.99
recency_vals = [0.99^1, 0.99^2, ..., 0.99^n]
# 索引 0(最旧的节点)= 0.99^1(最高原始值)
# 归一化后:最旧 = 1.0,最新 ≈ 0.0

注意:recency 权重 0.5 远小于 relevance(3.0),因此最终结果主要由语义相关性驱动。

Importance(重要性)

直接使用节点的 poignancy 值(1-10 整数,LLM 评分),归一化到 [0,1]。

  • 描述含 "is idle" → 直接返回 1(最低)
  • 其他 → 调用 LLM 评分

Relevance(相关性)

# 余弦相似度(embedding 向量)
relevance = cos_sim(memory_embedding, query_embedding)

使用 all-MiniLM-L6-v2 生成 384 维句子嵌入。

归一化函数

def normalize_dict_floats(d, target_min=0, target_max=1):
    # min-max 归一化到 [0, 1]
    # 若所有值相同(range=0),全部设为 0.5

3.4 反思(Reflection)

触发条件

importance_trigger_max = 150  # 阈值
# 每次感知新事件:importance_trigger_curr -= event_poignancy
# 当 importance_trigger_curr <= 0 时触发反思,然后重置

即当 persona 感知到的事件总重要性超过 150 分时,自动触发一次反思。

三步反思流程

Step 1 — 生成焦点问题:取最近 N 个记忆节点,让 LLM 生成 3 个值得深思的问题

Step 2 — 检索相关证据:对每个问题调用 new_retrieve() 检索相关记忆

Step 3 — 生成洞见:基于证据让 LLM 生成 5 条洞见,存为 thought 节点(带证据链接)

对话后反思

对话结束时会额外生成: - planning_thought:基于对话内容的计划性思考 - memo_thought:对话的个人备忘录

递归反思

thought 节点可以被后续的 new_retrieve() 检索到,意味着反思可以建立在之前的反思之上,形成递归抽象层级。


3.5 计划系统(Planning)

三级分解层次

Level 1: Daily Plan(日计划)
    LLM 生成 4-6 条日程大纲
    "wake up at 6am, have breakfast, work on animation, lunch, ..."

Level 2: Hourly Schedule(小时日程)
    [["sleeping", 360], ["morning routine", 60], ["work on animation", 240], ...]
    (分钟为单位,总计 1440 分钟 = 24 小时)

Level 3: Task Decomposition(5-15 分钟细粒度分解)
    [["get out of bed", 5], ["brush teeth", 10], ["make coffee", 15], ...]
    仅在时长 >= 60 分钟的非 sleeping 任务上动态分解

长期计划触发

  • First day:生成完整日计划(generate_first_daily_plan()
  • New day:修订身份认知(revise_identity()),然后生成当日小时日程
  • 每日:日程计划存入记忆流

地点选择(四级地址系统)

格式:"{world}:{sector}:{arena}:{game_object}"
示例:  "the Ville:Hobbs Cafe:cafe:counter"

每一级都调用 LLM 从可用选项中选择,使用角色的空间记忆确定可访问地点。

动作完成检测

def act_check_finished(self):
    if self.curr_time >= (self.act_start_time + timedelta(minutes=self.act_duration)):
        return True

当前动作时间耗尽时,触发下一个动作选择。


3.6 感知系统(Perceive)

感知流程

def perceive(persona, maze):
    # 1. 获取视野范围内的格子(vision_r = 4 格半径)
    nearby_tiles = maze.get_nearby_tiles(persona.scratch.curr_tile, vision_r=4)

    # 2. 更新空间记忆(世界→区域→地点→物体 层级树)

    # 3. 过滤到同一 arena 内的事件
    # 同一 arena = 同一个房间 / 区域

    # 4. 按距离排序,取最近的 att_bandwidth(=3) 个事件

    # 5. 过滤最近 retention(=5) 步已感知的事件

    # 6. 新事件:生成嵌入 + LLM 评分重要性 → 存入记忆流
    #    更新反思触发器:importance_trigger_curr -= event_poignancy

关键参数

参数 说明
vision_r 4 视野半径(tiles)
att_bandwidth 3 注意力带宽(每步最多感知 3 个事件)
retention 5 记忆保持(最近 5 个事件不重复感知)

3.7 执行系统(Execute)

执行流程

def execute(persona, maze, personas, plan):
    if not persona.scratch.act_path_set:
        # 解析 plan 字符串
        if "<persona>" in plan:     # 走向另一个 persona
        elif "<waiting>" in plan:   # 在原地等待
        elif "<random>" in plan:    # 随机选择目标格子
        else:                       # 正常导航到地址

        # A* 寻路
        path = path_finder(collision_maze, curr_tile, target_tile)
        persona.scratch.planned_path = path[1:]
        persona.scratch.act_path_set = True

    # 每步走一格
    if persona.scratch.planned_path:
        ret = persona.scratch.planned_path[0]
        persona.scratch.planned_path = persona.scratch.planned_path[1:]

    return ret, pronunciatio, description

plan 字符串格式

格式 含义
world:sector:arena:object 正常地址导航
<persona> Name 走向另一个角色
<waiting> x y 在指定坐标等待
...:object:<random> 随机选一格

3.8 对话系统(Conversation)

agent_chat_v2(逐回合迭代,实际使用版本)

def agent_chat_v2(maze, init_persona, target_persona):
    curr_chat = []
    for i in range(8):  # 最多 8 轮对话
        # --- init_persona 说话 ---
        # 1. 检索关于对方的记忆(50条)
        # 2. 生成关系摘要
        # 3. 以关系 + 对方状态 + 最近4轮对话为焦点,检索15条记忆
        # 4. LLM 生成一句话 + 是否结束标志

        # --- target_persona 说话 ---
        # 对称流程

    return curr_chat  # 最多 16 句(8轮×2人)

对话条件(lets_talk)

  • 双方都不在睡觉
  • 不是 23 点
  • 目标不在 <waiting> 状态
  • 双方都没在和别人聊天
  • 不在冷却期内(chatting_with_buffer,冷却值 800 步)

对话后处理

  • 双方设置 chatting_with_buffer[other] = 800(防止重复对话)
  • 对话摘要存入记忆流
  • 触发 planning_thought 和 memo_thought 反思

3.9 反应与重新计划

当 persona 感知到其他 persona 的事件时,会决定是否反应:

chat 反应:决定发起对话 → 生成对话 → 重新分解当前时间段日程

wait 反应:在路径上遇到障碍 → 等待直到对方完成

do other things:忽略事件,继续原计划

重新计划通过 _create_react() + generate_new_decomp_schedule() 实现,不只是简单暂停,而是动态重排剩余日程。


4. 世界地图:The Ville(Smallville)

4.1 地图技术规格

属性
世界名称 the Ville
地图宽度 140 格
地图高度 100 格
格子尺寸 32 × 32 像素
实际像素 4480 × 3200 px
地图文件 the_ville_jan7.json(Tiled JSON 格式)
图层数 18 个 tileset
碰撞系统 CSV 碰撞矩阵(collision_maze.csv)

4.2 地图层级(四级地址系统)

World (世界)
└── Sector(区域/建筑)
    └── Arena(房间/空间)
        └── Game Object(物体/位置)

4.3 建筑与区域一览

住宅区

建筑 居民 主要房间
artist's co-living space Latoya Williams, Rajiv Patel, Abigail Chen, Francisco Lopez, Hailey Johnson 各自房间 + 公共休息室
Arthur Burton's apartment Arthur Burton 主房间 + 浴室
Ryan Park's apartment Ryan Park 主房间 + 浴室
Isabella Rodriguez's apartment Isabella Rodriguez 主房间
Giorgio Rossi's apartment Giorgio Rossi 主房间 + 浴室
Carlos Gomez's apartment Carlos Gomez 主房间 + 浴室
Lin family's house John Lin, Mei Lin, Eddy Lin 卧室 + 浴室 + 公共区域
Moreno family's house Tom Moreno, Jane Moreno 卧室 + 浴室 + 厨房
Moore family's house Sam Moore, Jennifer Moore 主房间 + 浴室
Tamara Taylor & Carmen Ortiz's house Tamara Taylor, Carmen Ortiz 各自房间 + 公共区域 + 花园
Yuriko Yamamoto's house Yuriko Yamamoto 主房间 + 浴室
Adam Smith's house Adam Smith 主房间 + 浴室
Dorm for Oak Hill College Klaus Mueller, Maria Lopez, Ayesha Khan, Wolfgang Schulz, Eddy Lin 各自房间 + 花园

公共场所

场所 经营者 功能
Hobbs Cafe Isabella Rodriguez 咖啡馆,社交核心,有 cafe customer seating、behind the cafe counter、cooking area、refrigerator
The Rose and Crown Pub Arthur Burton 酒吧,behind the bar、pub area
The Willows Market and Pharmacy John Lin(药店)、Tom Moreno(杂货)、Jane Moreno 商店/药店
Harvey Oak Supply Store Carmen Ortiz 建材/供应品商店
Oak Hill College 教职人员:Mei Lin、Wolfgang Schulz 教室、图书馆、走廊
Johnson Park Sam Moore 维护 公园、花园

4.4 Tileset 资源

CuteRPG_Field_B/C     — 野外地形(草地、路径)
CuteRPG_Harbor_C      — 港口/水边地形
CuteRPG_Village_B     — 村庄建筑外墙
CuteRPG_Forest_B/C    — 森林地形
CuteRPG_Desert_B/C    — 沙漠地形
CuteRPG_Mountains_B   — 山地地形
Room_Builder_32x32    — 室内地板和墙壁
interiors_pt1~pt5     — 室内家具和物件
blocks/blocks_1~3     — 特殊功能块

4.5 角色初始位置(坐标单位:格,原点左上角)

角色 初始坐标 (x, y) 位置
Latoya Williams (16, 18) 艺术家公寓
Rajiv Patel (26, 18) 艺术家公寓
Abigail Chen (36, 18) 艺术家公寓
Francisco Lopez (16, 32) 艺术家公寓
Hailey Johnson (26, 32) 艺术家公寓
Arthur Burton (53, 14) Arthur 公寓
Ryan Park (65, 19) Ryan 公寓
Isabella Rodriguez (72, 14) Isabella 公寓
Giorgio Rossi (86, 18) Giorgio 公寓
Carlos Gomez (94, 18) Carlos 公寓
Klaus Mueller (126, 46) 大学宿舍
Maria Lopez (123, 57) 大学宿舍
Ayesha Khan (118, 61) 大学宿舍
Wolfgang Schulz (107, 62) 大学宿舍
Mei Lin (90, 74) Lin 家
John Lin (91, 74) Lin 家
Eddy Lin (93, 74) Lin 家 / 宿舍
Tom Moreno (73, 74) Moreno 家
Jane Moreno (72, 74) Moreno 家
Tamara Taylor (54, 74) Tamara & Carmen 家
Carmen Ortiz (57, 74) Tamara & Carmen 家
Sam Moore (36, 65) Moore 家
Jennifer Moore (37, 65) Moore 家
Yuriko Yamamoto (28, 65) Yuriko 家
Adam Smith (20, 65) Adam 家

5. 25 个角色(Persona)详细档案

数据来源:data/worlds/the_ville/personas/*/bootstrap_memory/scratch.json


5.1 艺术家公寓群(Artist's Co-living Space)

5.1.1 Latoya Williams - 年龄:25 岁 - 性格:organized(有条理)、logical(逻辑性强)、attentive(细心) - 背景:数字摄影师,对细节有敏锐的洞察力,分析性强 - 当前状态:正在创作以旅行为主题的摄影系列,主要在艺术家公寓工作。对下月地方市长选举非常感兴趣,市长选举是她与他人交谈的核心话题。 - 生活习惯:晚上 10 点睡,早上 6 点起,下午 5:30 吃晚饭 - 住所:艺术家公寓 → Latoya Williams's room - 初始坐标:(16, 18)


5.1.2 Rajiv Patel - 年龄:27 岁 - 性格:patient(耐心)、reliable(可靠)、cheerful(开朗) - 背景:画家,希望安静地生活并享受每日作画。近来开始学习吉他。 - 当前状态:正在准备人生第一次个人画展,主要在艺术家公寓工作。 - 生活习惯:凌晨 12 点睡,早上 9 点起,下午 5 点吃晚饭 - 住所:艺术家公寓 → Rajiv Patel's room - 初始坐标:(26, 18)


5.1.3 Abigail Chen - 年龄:25 岁 - 性格:open-minded(开放)、curious(好奇)、determined(坚定) - 背景:数字艺术家和动画师,热爱探索科技与艺术的结合 - 当前状态:正在为客户制作动画项目,同时在尝试不同工具和技术创作互动艺术 - 生活习惯:凌晨 12 点睡,早上 8 点起,下午 6 点吃晚饭 - 住所:艺术家公寓 → Abigail Chen's room - 初始坐标:(36, 18)


5.1.4 Francisco Lopez - 年龄:23 岁 - 性格:outgoing(外向)、friendly(友善)、honest(诚实) - 背景:演员和喜剧演员,热爱娱乐他人,使用 they/them 代词 - 当前状态:正在制作关于共居生活的网络剧,同时参加即兴喜剧课 - 生活习惯:晚上 11 点睡,早上 7 点起,下午 6 点吃晚饭 - 住所:艺术家公寓 → Francisco Lopez's room - 初始坐标:(16, 32)


5.1.5 Hailey Johnson - 年龄:30 岁 - 性格:imaginative(有想象力)、energetic(精力充沛)、resourceful(足智多谋) - 背景:作家,热爱通过不同文化探索故事 - 当前状态:正在写一部关于共居艺术家群体的小说,同时计划开播客 - 生活习惯:凌晨 2 点睡,早上 10 点起,下午 6 点吃晚饭(夜猫子) - 住所:艺术家公寓 → Hailey Johnson's room - 初始坐标:(26, 32)


5.2 独居居民

5.2.1 Arthur Burton - 年龄:42 岁 - 性格:friendly(友善)、outgoing(外向)、generous(慷慨) - 背景:酒吧老板,The Rose and Crown Pub 经营者,热爱让顾客感受宾至如归 - 当前状态:经营这家已有 10 年历史的酒吧,同时学习调酒技艺、研究创意鸡尾酒 - 生活习惯:凌晨 12 点睡,早上 7 点起,下午 4 点吃晚饭 - 住所:Arthur Burton's apartment → main room - 初始坐标:(53, 14)


5.2.2 Ryan Park - 年龄:29 岁 - 性格:analytical(分析性)、pragmatic(务实)、driven(进取) - 背景:软件工程师,热爱解决问题,持续追踪最新技术 - 当前状态:正在开发新的手机应用,同时研究最新技术保持竞争力 - 生活习惯:凌晨 1 点睡,早上 9 点起,下午 5 点吃晚饭 - 住所:Ryan Park's apartment → main room - 初始坐标:(65, 19)


5.2.3 Isabella Rodriguez - 年龄:34 岁 - 性格:friendly(友善)、outgoing(外向)、hospitable(好客) - 背景:Hobbs Cafe 咖啡馆老板,热爱让顾客感到放松愉快 - 当前状态正在筹备 2023 年 2 月 14 日(情人节)下午 5 点至 7 点在 Hobbs Cafe 举办的情人节派对,正在收集派对物资,并邀请所有人参加 - 生活习惯:晚上 11 点睡,早上 6 点起 - 住所:Isabella Rodriguez's apartment → main room - 初始坐标:(72, 14) - 关键角色:情人节派对的核心发起人,整个故事的主线推动者


5.2.4 Giorgio Rossi - 年龄:41 岁 - 性格:analytical(分析性)、logical(逻辑性)、eccentric(古怪) - 背景:数学家,热爱解决挑战性问题,善于应用分析技能 - 当前状态:正在研究自然界中的数学规律,同时上课了解最新数学理论。对下月地方市长选举非常感兴趣,经常和他人讨论此话题。 - 生活习惯:凌晨 12 点睡,早上 7 点起,下午 4 点吃晚饭 - 住所:Giorgio Rossi's apartment → main room - 初始坐标:(86, 18)


5.2.5 Carlos Gomez - 年龄:32 岁 - 性格:loud(高调)、rude(粗鲁)、toxic(有毒)—— 反派性格 - 背景:诗人,热爱探索内心思想和感受,寻找新的自我表达方式 - 当前状态:正在创作一本探索自然之美的诗集,参加创意写作工作坊磨练技艺 - 生活习惯:晚上 10 点睡,早上 7 点起,下午 5 点吃晚饭 - 住所:Carlos Gomez's apartment → main room - 初始坐标:(94, 18)


5.2.6 Yuriko Yamamoto - 年龄:28 岁 - 性格:organized(有条理)、reliable(可靠)、detail-oriented(注重细节) - 背景:税务律师,帮助客户应对复杂税务问题 - 当前状态:正在为本地企业做税务合规项目,同时上课了解新税法。对下月市长选举感兴趣。 - 生活习惯:晚上 11 点睡,早上 7 点起,下午 6 点吃晚饭 - 住所:Yuriko Yamamoto's house → main room - 初始坐标:(28, 65)


5.2.7 Adam Smith - 年龄:36 岁 - 性格:thoughtful(深思熟虑)、reflective(善于反思)、intellectual(知识分子) - 背景:哲学家,热爱挑战人们的固有观念 - 当前状态:正在写一本关于创造力重要性及其如何塑造世界的书,对下月市长选举人选感兴趣 - 生活习惯:晚上 8 点睡,早上 4 点起(非常早),下午 5 点吃晚饭 - 住所:Adam Smith's house → main room - 初始坐标:(20, 65) - 备注:全世界最早起床的人,4 点即开始工作


5.3 Lin 家庭

5.3.1 John Lin - 年龄:45 岁 - 性格:patient(耐心)、kind(善良)、organized(有条理) - 背景:The Willows Market and Pharmacy 药店老板,热爱帮助顾客 - 当前状态:与妻子 Mei Lin、儿子 Eddy Lin 共同生活,经营药店。同时上网课了解新药物和治疗方案。对市长选举非常感兴趣,到处询问谁会参选。 - 生活习惯:晚上 10 点睡,早上 6 点起,下午 5 点吃晚饭 - 住所:Lin family's house → Mei and John Lin's bedroom - 初始坐标:(91, 74)


5.3.2 Mei Lin - 年龄:44 岁 - 性格:nurturing(育人型)、kind(善良)、patient(耐心) - 背景:大学教授兼母亲,帮助学生和家庭成员达成目标 - 当前状态:与丈夫 John Lin 和儿子 Eddy Lin 共同生活,教授哲学课,撰写研究论文,同时帮助两个孩子的学业 - 生活习惯:晚上 11 点睡,早上 7 点起,下午 5 点吃晚饭 - 住所:Lin family's house → Mei and John Lin's bedroom - 初始坐标:(90, 74)


5.3.3 Eddy Lin - 年龄:19 岁 - 性格:curious(好奇)、analytical(分析性)、musical(音乐天赋) - 背景:Oak Hill College 音乐理论与作曲系学生 - 当前状态:正在完成大学的作曲项目,同时上课学习更多音乐理论 - 生活习惯:晚上 11 点睡,早上 7 点起,下午 5 点吃晚饭 - 住所:Lin family's house → Eddy Lin's bedroom(有时在宿舍) - 初始坐标:(93, 74)


5.4 Moreno 家庭

5.4.1 Tom Moreno - 年龄:52 岁 - 性格:rude(粗鲁)、aggressive(攻击性)、energetic(精力充沛)—— 反派性格 - 背景:The Willows Market and Pharmacy 杂货店老板,热爱与顾客互动 - 当前状态:与妻子 Jane Moreno 共同生活,管理商店日常运营。对市长选举非常感兴趣,厌恶 Sam Moore(候选人之一)。 - 生活习惯:晚上 11 点睡,早上 7 点起,下午 5 点吃晚饭 - 住所:Moreno family's house → Tom and Jane Moreno's bedroom - 初始坐标:(73, 74)


5.4.2 Jane Moreno - 年龄:46 岁 - 性格:friendly(友善)、helpful(乐于助人)、organized(有条理) - 背景:家庭主妇,热爱照顾家人,寻找让生活更轻松愉快的方式 - 当前状态:与丈夫 Tom Moreno 共同生活,丈夫是 The Willows Market and Pharmacy 的店主 - 生活习惯:晚上 10 点睡,早上 6 点起,下午 6 点吃晚饭 - 住所:Moreno family's house → Tom and Jane Moreno's bedroom - 初始坐标:(72, 74)


5.5 Moore 家庭

5.5.1 Sam Moore - 年龄:65 岁 - 性格:wise(智慧)、resourceful(足智多谋)、humorous(幽默) - 背景:退休海军军官,热爱分享军旅故事 - 当前状态:与结婚 40 年的妻子 Jennifer Moore 共同生活,业余时间打理公园(Johnson Park)和阅读。正在宣布参加下月地方市长选举,告知邻居这件事。 - 生活习惯:晚上 9 点睡,早上 5 点起,下午 5 点吃晚饭 - 住所:Moore family's house → main room - 初始坐标:(36, 65) - 关键角色:市长选举故事线的主角


5.5.2 Jennifer Moore - 年龄:68 岁 - 性格:wise(智慧)、experienced(经验丰富)、warm(温暖) - 背景:水彩画画家,已创作超过 50 年,作品充满温情 - 当前状态:与丈夫 Sam Moore 共同生活,正在为个人展览做准备,同时指导年轻艺术家找到自己的创作声音 - 生活习惯:晚上 9 点睡,早上 5 点起,下午 5 点吃晚饭 - 住所:Moore family's house → main room - 初始坐标:(37, 65)


5.6 Tamara & Carmen 合住

5.6.1 Tamara Taylor - 年龄:30 岁 - 性格:imaginative(有想象力)、patient(耐心)、kind(善良) - 背景:儿童书籍作者,热爱创作激发儿童想象力的故事 - 当前状态:与室友 Carmen Ortiz 共同生活,正在创作新的儿童书籍系列,同时开发面向成人的漫画系列 - 生活习惯:晚上 10 点睡,早上 6 点起,下午 6 点吃晚饭 - 住所:Tamara Taylor and Carmen Ortiz's house → Tamara Taylor's room - 初始坐标:(54, 74)


5.6.2 Carmen Ortiz - 年龄:33 岁 - 性格:friendly(友善)、outgoing(外向)、helpful(乐于助人) - 背景:Harvey Oak Supply Store 店主,热爱帮助顾客找到所需物资 - 当前状态:管理 Harvey Oak Supply Store,与室友 Tamara Taylor 共住,同时开拓线上渠道 - 生活习惯:晚上 11 点睡,早上 7 点起,晚上 8 点吃晚饭(最晚吃晚饭) - 住所:Tamara Taylor and Carmen Ortiz's house → Carmen Ortiz's room - 初始坐标:(57, 74)


5.7 Oak Hill College 学生群

5.7.1 Klaus Mueller - 年龄:20 岁 - 性格:kind(善良)、inquisitive(好问)、passionate(热情) - 背景:Oak Hill College 社会学系学生,热爱社会公正 - 当前状态:正在撰写关于低收入社区绅士化影响的研究论文 - 生活习惯:晚上 11 点睡,早上 7 点起,下午 5 点吃晚饭 - 住所:Dorm for Oak Hill College → Klaus Mueller's room - 初始坐标:(126, 46)


5.7.2 Maria Lopez - 年龄:21 岁 - 性格:energetic(精力充沛)、enthusiastic(热情洋溢)、inquisitive(好问) - 背景:Oak Hill College 物理系学生,同时是 Twitch 游戏主播,通过直播赚外快 - 当前状态:攻读物理学位,在 Twitch 直播,几乎每天去 Hobbs Cafe 学习和吃饭 - 生活习惯:凌晨 12 点睡,早上 10 点起,晚上 7 点吃晚饭(晚起) - 住所:Dorm for Oak Hill College → Maria Lopez's room - 初始坐标:(123, 57)


5.7.3 Ayesha Khan - 年龄:20 岁 - 性格:curious(好奇)、determined(坚定)、independent(独立) - 背景:Oak Hill College 文学系学生,热爱深度阅读 - 当前状态:正在撰写关于莎士比亚戏剧语言运用的毕业论文,同时上写作课 - 生活习惯:晚上 10 点睡,早上 6 点起,下午 5 点吃晚饭 - 住所:Dorm for Oak Hill College → Ayesha Khan's room - 初始坐标:(118, 61)


5.7.4 Wolfgang Schulz - 年龄:21 岁 - 性格:hardworking(勤奋)、passionate(热情)、dedicated(专注) - 背景:Oak Hill College 化学系学生兼运动员 - 当前状态:正在为下次比赛训练,同时备考,寻找更高效的学习方法 - 生活习惯:晚上 9 点睡,早上 5 点起(最早起床之一),下午 6 点吃晚饭 - 住所:Dorm for Oak Hill College → Wolfgang Schulz's room - 初始坐标:(107, 62)


5.8 故事线关联图

情人节派对(Feb 14, 5-7pm @ Hobbs Cafe):
  Isabella Rodriguez(发起人)
    ↓ 邀请
  所有镇民(通过社交扩散)

市长选举(下月):
  Sam Moore(参选者)
    ↔ 竞选对手(未公布)
  关注者:Latoya Williams、Giorgio Rossi、John Lin、Yuriko Yamamoto、Adam Smith
  反对者:Tom Moreno(厌恶 Sam Moore)

艺术家群体:
  Latoya Williams、Rajiv Patel、Abigail Chen、Francisco Lopez、Hailey Johnson(共居)
  Jennifer Moore(画展筹备,指导年轻艺术家)

林家三口:
  John Lin(药店)+ Mei Lin(教授)+ Eddy Lin(音乐生)

商业网络:
  Hobbs Cafe(Isabella)← 常客:Klaus、Maria、Sam、Latoya、Ayesha 等
  The Willows Market(John + Tom)
  Harvey Oak Supply Store(Carmen)
  The Rose and Crown Pub(Arthur)

6. 25 人初始人际关系网络

数据来源:data/worlds/the_ville/agent_history_init_n25.csv

每个角色在模拟开始时已拥有预设的人际关系记忆("whisper"),这些关系在模拟启动时注入各角色的初始记忆流,影响其早期行动和社交判断。

6.1 艺术家公寓群的内部关系

Latoya Williams: - 与 Rajiv Patel、Abigail Chen、Francisco Lopez、Hailey Johnson 同住约一年 - 与 Rajiv Patel 常聊政治和地方选举 - 不太喜欢 Hailey Johnson(感到不舒适) - 认识 The Rose and Crown Pub 酒保 Arthur Burton 约半年,晚间常去那里 - 对政治和地方选举很感兴趣

Rajiv Patel: - 与 Latoya Williams 同住,常聊政治 - 认为 Abigail Chen 有点可爱(有好感) - 不太喜欢 Hailey Johnson - 偶尔去 Hobbs Cafe 但还没怎么和人交谈 - 认识 Arthur Burton 约一年

Abigail Chen: - 自认为有点可爱 - 与 Rajiv Patel 关系较近(somewhat close) - 与其他四位室友都相识约一年

Francisco Lopez: - 与 Hailey Johnson 不太来往(don't really like her) - 对 Abigail Chen 有暗恋(secret crush),但还没有勇气开口 - 经常去 Hobbs Cafe

Hailey Johnson: - 希望被所有人认可(强烈渴望认同感) - 与 Isabella Rodriguez 相识约一年,常聊她正在写的作品 - 认为 Latoya Williams 有点可爱 - 与 Francisco Lopez 来自同一个城镇,相识很久 - 正在寻找恋爱关系,目前单身


6.2 商业区人际网络

Arthur Burton(The Rose and Crown Pub 老板): - 与 Isabella Rodriguez 是朋友,相识数年(两家紧邻) - 认识的顾客:Latoya Williams、Rajiv Patel、Ryan Park、Carlos Gomez、Adam Smith、Yuriko Yamamoto、Jennifer Moore、Sam Moore、Carmen Ortiz、Tom Moreno - 不喜欢顾客在酒吧打架

Isabella Rodriguez(Hobbs Cafe 老板): - 与 Maria Lopez 相识约一年,是好友,Maria 是忠实常客 - 与 Tamara Taylor 相识数月(常客) - 与 Carlos Gomez 相识约 4 年,喜欢他的诗 - Ryan Park 是常客,觉得他勤奋很酷 - 认为 Hailey Johnson 太强势(有些不舒适) - 与 Arthur Burton 是朋友,相识数年

Ryan Park: - 经常去 Hobbs Cafe 工作和用餐 - 经常去 The Rose and Crown Pub 吃晚饭 - 与邻居 Giorgio Rossi 相识约一年 - 与邻居 Carlos Gomez 相识约一年 - 好奇为什么 Giorgio 和 Carlos 总是吵架,自己不想卷入


6.3 邻里恩怨

Giorgio Rossi vs. Carlos Gomez(邻居,互相厌恶): - Giorgio 认为 Carlos 烦人、爱表现、是懦夫 - Carlos 认为 Giorgio 烦人、是懦夫 - 两人相识约两年 - Giorgio 曾投诉 Carlos 太吵 - Carlos 想让 Ryan Park 站在他这边对付 Giorgio - 双方都表示宁愿永远不见对方

Tom Moreno vs. Sam Moore(邻居,有嫌隙): - Tom 不喜欢 Sam Moore(对选举意见不同) - Tom 的妻子 Jane 与 Sam 关系不错 - Tom 与妻子 Jane Moreno 婚姻关系近期有些紧张 - Jane 同样表示与 Tom 的关系有些紧张


6.4 Oak Hill College 学生圈

Klaus Mueller: - 对 Maria Lopez 有暗恋(这非常重要——原文强调 "This is very important") - 与 Maria Lopez 相识超过 2 年,是亲密好友兼同学 - 与 Ayesha Khan 是同一门课的同学兼宿友 - 与 Eddy Lin 是同学,与 Wolfgang Schulz 是同学兼宿友 - 知道 Mei Lin 是学院教授

Maria Lopez: - 对 Klaus Mueller 有暗恋(secret crush,同样"非常重要") - 两人互有好感但都是秘密 - 经常去 Hobbs Cafe 学习 - 与 Ayesha Khan 是宿友,与 Eddy Lin 是同学

Ayesha Khan: - 与 Wolfgang Schulz 关系亲密(同一门课的同学兼宿友)

Wolfgang Schulz: - 经常去 Hobbs Cafe 学习 - 曾与 Isabella Rodriguez 见过面但还没真正交谈

Eddy Lin: - 喜欢嘻哈音乐,习惯在句尾加 "Yo" - 认为母亲 Mei Lin 有点太死板 - 与 Wolfgang Schulz 是同学,会聊喜欢的音乐


6.5 Moore-Lin-Moreno 邻居圈

Sam Moore: - 与邻居 Adam Smith 相识数年,视 Adam 为亲密好友 - 视 Yuriko Yamamoto 如女儿(她曾帮处理法律事务) - 认为 Tom Moreno 太有攻击性和主观 - 妻子 Jennifer 不希望他参选(担心太累) - 喜欢在公园散步

Jennifer Moore: - 不关心政治 - 知道 Sam 想参选但不支持(担心太辛苦) - 也视 Yuriko 如女儿

Mei Lin: - 与邻居 Yuriko Yamamoto 相识(Yuriko 曾帮处理法律事务) - 认为 Sam Moore 是和蔼可亲的人,喜欢 Jennifer 的画 - 认为儿子 Eddy Lin 最近有点叛逆 - 丈夫 John Lin 在药店工作

John Lin: - 对政治选举非常感兴趣 - 认为 Sam Moore 是和蔼可亲的人 - 与 Tom Moreno 是同事(The Willows Market and Pharmacy)

Tamara Taylor: - 刚搬来,在镇上几乎不认识任何人 - 室友是 Carmen Ortiz - 期待认识更多人

Carmen Ortiz: - 了解 Tamara 刚搬来、人脉不广,经常帮助她融入 - 经常去 Hobbs Cafe - 与认识 Arthur Burton、Isabella Rodriguez 数年

Yuriko Yamamoto: - 与 Adam Smith 相识数年,偶尔聊地方选举 - 视 Sam Moore & Jennifer Moore 如长辈亲人

Adam Smith: - 与 Sam Moore 关系较近,将 Sam 视为某种导师 - 对地方选举非常感兴趣


6.6 关键故事线关系图总结

互有暗恋(未表白):
  Klaus Mueller ←→ Maria Lopez

单方暗恋:
  Francisco Lopez → Abigail Chen(有暗恋但没勇气开口)
  Rajiv Patel → Abigail Chen(认为她有点可爱)

互相厌恶(邻居纠纷):
  Giorgio Rossi ←→ Carlos Gomez(两年积怨)
  Tom Moreno → Sam Moore(讨厌,不支持其竞选)

婚姻紧张:
  Tom Moreno ↔ Jane Moreno(关系最近有些紧张)

亲密友谊:
  Isabella Rodriguez ↔ Arthur Burton(多年好友,紧邻而居)
  Isabella Rodriguez ↔ Maria Lopez(一年好友)
  Sam Moore ↔ Adam Smith(亦师亦友)
  Sam Moore, Jennifer Moore → Yuriko Yamamoto(如女儿)

单向期待/渴望:
  Hailey Johnson → 所有人(渴望被认可,寻找恋爱)

7. ALICE PROJECT 系统实现

6.1 后端架构

backend/
├── config.py           # 全局配置
├── main.py             # FastAPI 服务(回放 API 端点)
├── simulate.py         # CLI 模拟入口(无前端,纯计算)
├── world_engine.py     # 世界引擎(主循环)
├── recorder.py         # 录制器(保存 master_movement.json)
├── maze.py             # 地图系统(Tiled CSV 格式加载)
└── persona/
    ├── persona.py      # 核心 move() 方法
    ├── memory_structures/
    │   ├── associative_memory.py  # 记忆流(ConceptNode)
    │   ├── scratch.py             # 工作记忆(当前状态)
    │   └── spatial_memory.py     # 空间记忆(已知地点树)
    └── cognitive_modules/
        ├── perceive.py    # 感知
        ├── retrieve.py    # 检索
        ├── plan.py        # 计划
        ├── reflect.py     # 反思
        ├── converse.py    # 对话
        └── execute.py     # 执行

6.2 配置文件

# backend/config.py
LLM_API_KEY    = "ollama"                      # Ollama 不需要真实 key
LLM_BASE_URL   = "http://localhost:11434/v1"   # Ollama OpenAI 兼容接口
LLM_MODEL      = "qwen3:14b"                   # 使用模型
EMBEDDING_MODEL_NAME = "all-MiniLM-L6-v2"     # 嵌入模型

DATA_DIR   = BASE_DIR / "data"
WORLDS_DIR = DATA_DIR / "worlds"
SAVES_DIR  = DATA_DIR / "saves"

6.3 LLM 选型:Qwen3 14B

属性
模型 Qwen3 14B Q4_K_M(量化)
显存占用 ~10-12 GB VRAM
推理速度 ~60 tokens/s
API Ollama OpenAI-compatible
特性 原生 thinking 模式、强 structured output、tool calling
费用 零成本(本地推理)

对比参考: - Llama 3.3 8B:速度更快但推理弱 - Gemma 3 12B:多模态但 agent 能力弱 - Qwen3 14B:推理、结构化输出、指令跟随最均衡 → 首选

6.4 WorldEngine 主循环

class WorldEngine:
    def run_step(self) -> dict:
        movements = {}
        for persona_name in self.personas.keys():
            curr_tile = self.personas_tile[persona_name]

            # 调用 persona 认知循环
            next_tile, pronunciatio, description = persona.move(
                self.maze, self.personas, curr_tile, self.curr_time)

            self.personas_tile[persona_name] = next_tile
            movements[persona_name] = {
                "movement": list(next_tile),
                "pronunciatio": pronunciatio,
                "description": description,
                "chat": persona.scratch.chat,
            }

        # 推进时钟
        self.step += 1
        self.curr_time += timedelta(seconds=self.sec_per_step)

        return {"step": self.step, "time": ..., "movements": movements}

6.5 SimulationRecorder(录制器)

class SimulationRecorder:
    def record_step(self, step: int, movements: dict):
        self.movements[str(step)] = movements

    def save_all(self, sim_name, start_date, sec_per_step, persona_names):
        # 保存 master_movement.json(步骤→动作数据)
        # 保存 meta.json(元信息)

6.6 存档格式

每次模拟运行保存到 data/saves/{run_name}/

saves/test_1_3days/
├── meta.json              # 元信息(25人名单、起始日期、sec_per_step)
├── master_movement.json   # 所有步骤动作数据(回放用)
│   {
│     "1": { "Latoya Williams": { "movement": [x,y], "pronunciatio": "😴", "description": "sleeping @ ...", "chat": null } },
│     "2": { ... },
│     ...
│   }
├── checkpoint/            # 最近检查点(每 6 步保存一次)
│   ├── personas/          # 每人记忆状态快照
│   └── environment/       # 角色位置快照
└── simulation.log         # 详细调试日志

6.7 CLI 模拟命令

conda activate alice
python -m backend.simulate \
    --sim the_ville \
    --steps 72 \
    --output data/saves/test_1_3days \
    --sec-per-step 3600 \
    --checkpoint-every 6

参数说明: - --sim:世界名称(data/worlds/ 下的子目录) - --steps:模拟步数 - --output:存档目录 - --sec-per-step:每步代表的游戏秒数(3600 = 1小时/步,72步 = 3天) - --checkpoint-every:每 N 步保存一次检查点

错误处理策略: - 非致命错误(单步失败):跳过该步、记录日志、继续运行 - 连续 3 步失败:升级为致命错误、保存进度、退出 - Ctrl+C 中断:立即保存已完成进度、清洁退出

6.8 FastAPI 回放 API

GET /api/replays                    # 列出所有存档
GET /api/replay/{name}/movements    # 获取完整 master_movement.json
GET /api/replay/{name}/meta         # 获取元信息

6.9 前端架构(Phaser 3 + React)

App.tsx(React 控制器): - 始终在 DOM 中渲染 game-container(Phaser 初始化依赖) - 回放选择界面作为 position:absolute 浮层覆盖在游戏之上 - 回放控制:播放/暂停、速度选择(1x-10x)、进度条拖动 - 事件日志实时显示角色动作 - 角色列表从 meta.persona_names 读取

GameScene.ts(Phaser 3 游戏场景): - 加载 18 个 tileset 渲染 The Ville 地图 - 每个角色使用独立的 96x128 像素 spritesheet(32x32 帧) - 动画规格:4 方向 x 3 帧(walk cycle)+ idle 帧 - Row 0 (y=0): 向下,帧 0-1-2 - Row 1 (y=32): 向左,帧 3-4-5 - Row 2 (y=64): 向右,帧 6-7-8 - Row 3 (y=96): 向上,帧 9-10-11 - 移动时播放方向动画,静止时停在 idle 帧(每方向中间帧) - 思想气泡显示 description(去掉 "@ 地址" 后缀,截断到 40 字符) - 摄像机:zoom=0.6,居中于 (64, 48) 格坐标


8. LLM 与嵌入模型实现细节

8.1 LLM 客户端(backend/llm/llm_client.py

所有与 LLM 的交互均通过此模块进行,封装了 OpenAI 兼容 SDK 并处理 Qwen3 thinking model 的特殊输出格式。

关键函数

_strip_think_tags(text: str) → str

def _strip_think_tags(text: str) -> str:
    """Remove <think>...</think> blocks from thinking model output."""
    import re
    return re.sub(r'<think>.*?</think>', '', text, flags=re.DOTALL).strip()
Qwen3 14B 是 thinking model,每次推理都会在正式答案前输出 <think>...</think> 标签包裹的推理过程(chain-of-thought)。此函数用正则表达式剥离这些内部推理块,只保留最终答案。re.DOTALL 标志使 . 能匹配换行符,确保多行 think 块被完整移除。

chat_completion(messages, model, temperature, max_tokens, retries) → str - 创建或复用单例 OpenAI 客户端(惰性初始化) - 默认 retries=2(最多尝试 3 次) - 失败时按 1x(attempt+1) 秒指数退避 - 自动调用 _strip_think_tags() 清理输出 - effective_tokens = max(max_tokens, 512) 防止 token 不足

generate_prompt(prompt_input: list[str], prompt_template_path: str) → str

# 模板文件使用 !<INPUT 0>! !<INPUT 1>! ... 占位符
template = template_file.read_text(encoding="utf-8")
for i, val in enumerate(prompt_input):
    template = template.replace(f"!<INPUT {i}>!", str(val))
backend/persona/prompt_template/ 目录读取模板文件,将 !<INPUT N>! 占位符替换为实际输入值。此机制与原论文代码完全一致,模板文件决定了 LLM 的 prompt 格式和上下文。

safe_generate_response(prompt, gpt_param, retries, fail_safe, validate_fn, cleanup_fn) → Any

for attempt in range(retries):
    response = chat_completion([{"role": "user", "content": prompt}], ...)
    if validate_fn(response, prompt):
        return cleanup_fn(response, prompt)
return fail_safe  # 所有尝试失败则返回默认值
这是论文核心模式的忠实复现: - validate_fn:验证 LLM 输出是否合法(格式、范围等) - cleanup_fn:清理和解析合法输出 - fail_safe:所有尝试失败时的默认值(例如 "sleeping""idle" 等) - 调用方(planning、reflection 等认知模块)负责提供这三个参数

客户端配置

LLM_API_KEY = "ollama"          # Ollama 不需要真实 key
LLM_BASE_URL = "http://localhost:11434/v1"  # Ollama OpenAI 兼容端口
LLM_MODEL = "qwen3:14b"         # 当前使用模型

8.2 嵌入模型(backend/llm/embedding.py

使用 sentence-transformers 库在本地 GPU 上运行 all-MiniLM-L6-v2 模型,生成 384 维语义向量。

get_embedding(text: str) → list[float]

def get_embedding(text: str) -> list[float]:
    model = _get_model()  # 惰性加载单例
    return model.encode(text).tolist()
- 首次调用时加载模型(~30 秒),后续调用直接使用内存中的实例 - 返回 384 维浮点列表(对应 all-MiniLM-L6-v2 的输出维度) - 在 perceive() 中为每个感知到的事件生成嵌入,存入 AssociativeMemory

cos_sim(a, b) → float

def cos_sim(a, b) -> float:
    a, b = np.array(a), np.array(b)
    norm_a, norm_b = np.linalg.norm(a), np.linalg.norm(b)
    if norm_a == 0 or norm_b == 0:
        return 0.0
    return float(np.dot(a, b) / (norm_a * norm_b))
用于三因子检索中的 相关度(relevance) 分量。计算焦点事件嵌入与记忆节点嵌入之间的余弦相似度,结果在 [-1, 1] 之间(记忆检索场景中实际为 [0, 1])。

为何选择 all-MiniLM-L6-v2

特性
参数量 22M
嵌入维度 384
推理速度 ~1ms/sentence(GPU)
语义质量 适合短文本相似度,与原论文 OpenAI Embedding 效果相当
显存占用 ~100MB(不影响 LLM 显存预算)

9. 空间记忆与 A* 寻路

9.1 空间记忆(backend/persona/memory_structures/spatial_memory.py

MemoryTree 数据结构

class MemoryTree:
    tree: dict  # 格式:{ world: { sector: { arena: [objects] } } }

四层层级结构,从世界到具体物体:

the Ville
├── Isabella's apartment
│   ├── main room: [desk, easel, closet, bed, painting, coffee mug, ...]
│   └── bathroom: [shower, sink, toilet]
├── Hobbs Cafe
│   ├── cafe customer seating: [chairs, table, coffee cups]
│   ├── cooking area: [stove, refrigerator, blender]
│   ├── kitchen sink: [sink, dish soap]
│   └── behind the cafe counter: [coffee machine, cash register]
└── Johnson Park
    ├── park garden: [grass, tree, bench]
    └── ...

三个查询方法

# 1. 获取当前世界中所有可访问的区域(sector)
get_str_accessible_sectors("the Ville")
# → "Isabella's apartment, Hobbs Cafe, The Rose and Crown Pub, ..."

# 2. 获取某个区域中所有可访问的场地(arena)
get_str_accessible_sector_arenas("the Ville:Hobbs Cafe")
# → "kitchen, cafe customer seating, cooking area, ..."

# 3. 获取某个场地中所有可交互的物体(game_objects)
get_str_accessible_arena_game_objects("the Ville:Hobbs Cafe:cooking area")
# → "refrigerator, stove, blender"

这三个方法的输出直接注入 planning prompt,让 LLM 知道角色"能去哪里"和"能和什么交互"。

Isabella Rodriguez 的初始空间记忆

Isabella 启动时已知的地点(bootstrap_memory/spatial_memory.json):

区域(Sector) 场地(Arena)
Isabella's apartment main room, bathroom
Hobbs Cafe refrigerator, cafe customer seating, cooking area, kitchen sink, behind the cafe counter, piano
The Rose and Crown Pub pub dining area
Harvey Oak Supply Store supply store
The Willows Market and Pharmacy store, pharmacy
Dorm for Oak Hill College dorm room
Johnson Park park garden

9.2 A* 寻路(backend/path_finder.py

每个时间步,角色需要从当前位置移动到目标地点。寻路在 140x100 的碰撞网格上执行。

算法实现

def path_finder(collision_maze, start, end, collision_block_id=32001):
    """A* on 2D tile grid, Manhattan heuristic."""

关键细节:

  1. 障碍处理:碰撞网格中非零值为障碍(建筑物、家具等),0 为可行走
  2. 目标不可达时的回退
    if not is_walkable(end[0], end[1]):
        # 在 3 格范围内搜索最近可走格
        for dy in range(-3, 4):
            for dx in range(-3, 4):
                if is_walkable(nx, ny):
                    # 找到 Manhattan 距离最小的可走格作为新目标
    
  3. 启发式函数:Manhattan 距离(适合四方向移动)
  4. 四方向移动:上下左右,不含对角线
  5. 返回值
    • 包含 start 和 end 的完整路径 [(x,y), ...]
    • 无路径时返回 []

地图尺寸与坐标系

  • 网格尺寸:140(宽)x100(高)格
  • 每格 32x32 像素(前端渲染)
  • 坐标系:(x, y) = (col, row),即 collision_maze[y][x]
  • 每步模拟角色移动一格,路径长则分多步完成

10. 模拟运行记录:test_1_3days

7.1 运行参数

参数
运行名称 test_1_3days
世界 the_ville
起始时间 February 13, 2023, 00:00:00(周一,凌晨)
结束时间(预计) February 16, 2023, 00:00:00(3天后)
总步数 72 步
每步时间 3600 秒 = 1 小时
检查点间隔 每 6 步
LLM Qwen3 14B(Ollama 本地)
存档路径 data/saves/test_1_3days/
启动时间 2026-03-21

时间换算: - 1 步 = 1 小时游戏时间 - 24 步 = 1 游戏天 - 72 步 = 3 游戏天(Feb 13 → Feb 16) - 关键日期:Feb 14(情人节)= Step 25-48

7.2 终端输出说明

  • HuggingFace 未认证警告:正常,公开模型无需登录
  • BertModel UNEXPECTED key warning:正常,sentence-transformers 加载机制的标准行为(Pooling 层参数对纯 BERT 来说是 "unexpected",但仍正确加载)
  • 大量 Batches 进度条(仅 Step 1):25 个 persona 的初始记忆(每人数十条背景信息)需要全部 embed,Step 2 起只需 embed 当步新记忆(1-3 条),几乎不可见
  • 进度:N/72状态行:正常运行,实时更新

7.3 步骤逐步记录

格式:Step N (Feb DD HH:MM) — 世界时钟,每步 +1 小时


Step 1 — Feb 13 01:00 AM(深夜)

全员熟睡,无任何活动。所有 25 个 persona 在各自卧室或宿舍房间中睡觉。这是第一步,触发了所有人的"First day"计划生成(生成整个 2 月 13 日的行程)和初始记忆 embedding(故有大量 Batches 进度条)。

Persona 状态
全员(25人) 😴 sleeping @ 各自住所

Step 2 — Feb 13 02:00 AM(深夜)

全员继续熟睡,状态与 Step 1 完全相同。夜间无活动。


Step 3 — Feb 13 03:00 AM(深夜)

全员继续熟睡


Step 4 — Feb 13 04:00 AM(深夜)

全员继续熟睡


Step 5 — Feb 13 05:00 AM(黎明)

首位起床者出现

Persona 状态 备注
Adam Smith ⏰☕ morning routine @ 浴室 全镇最早起床(生活习惯:4am 起床)
其余 24 人 😴 sleeping

Step 6 — Feb 13 06:00 AM(清晨)

早起者开始活动:

Persona 状态
Adam Smith 👨‍💻 working @ Adam Smith's house:main room:desk(已开始工作)
Wolfgang Schulz 🕒🧘‍♂ wake up and stretch @ 宿舍(生活习惯:5am 起床)
Sam Moore ⏰☕ morning routine @ Moore family's house:bathroom
Jennifer Moore 🌅☕ morning routine @ Moore family's house:bathroom
其余 21 人 😴 sleeping

Step 7 — Feb 13 07:00 AM(早晨)

更多人陆续起床,首批社交活动出现:

Persona 状态
Latoya Williams ⏰☕ morning routine
John Lin ☀️☕ morning routine
Jane Moreno ⏰☕ morning routine
Tamara Taylor ⏰☀️ morning routine
Isabella Rodriguez 🍽️ having lunch(异常——Isabella 竟然在 7am 吃午饭,LLM 时间感知偏差)
Ayesha Khan 🌅🧘‍♀ wake up and do light stretching
Wolfgang Schulz 💼 working @ Oak Hill College:library(已到图书馆)
Sam Moore 💼👨‍💻 working @ Johnson Park:park:park garden(去公园打理了)
Jennifer Moore 🔍✅ reviewing exhibition artwork @ 家
Adam Smith 👨‍💻 working(继续)

Step 8 — Feb 13 08:00 AM(上午)

大批人起床,白天生活正式开始,Klaus Mueller 出现在 Hobbs Cafe 厨房(早到):

Persona 状态
Latoya Williams 👨‍💼💻 working @ 公寓公共休息室
Abigail Chen 😴 sleeping(还在睡)
Francisco Lopez 🕘🤸‍♀ wake up and stretch
Arthur Burton 🌅☕ morning routine
Giorgio Rossi ⏰☕ morning routine
Carlos Gomez ⏰☕ morning routine
Klaus Mueller "The" morning routine @ Hobbs Cafe:cooking area(已到咖啡馆)
Ayesha Khan 📚📝 reviewing research materials for thesis @ Oak Hill College
Wolfgang Schulz 💼 working @ Oak Hill College:library
Mei Lin 🌅☕ morning routine
John Lin ⏰ getting ready
Eddy Lin ⏰☕ waking up and morning routine
Tom Moreno 🌅☕ morning routine
Jane Moreno 💼 working @ The Willows Market and Pharmacy(已到药店上班)
Isabella Rodriguez 📋🔍 review RSVP list for accuracy(正在核对派对嘉宾 RSVP 名单
Tamara Taylor 🧑‍💼 working @ 家
Carmen Ortiz 🥷🧘‍♀ stretching and light exercise
Sam Moore 💼👨‍💻 working @ Johnson Park
Jennifer Moore 🎨📦 preparing materials for upcoming painting sessions
Yuriko Yamamoto ⏰☕ morning routine
Adam Smith 🍽️ having lunch @ 家(异常——8am 吃午饭)

Step 9 — Feb 13 09:00 AM(上午)

白天活动全面铺开,Hobbs Cafe 开始聚集人气

Persona 状态
Latoya Williams 👨‍💼💻 working @ 公寓公共休息室
Rajiv Patel 😌💤 sleeping(还在睡)
Abigail Chen 🌅☕ morning routine @ Hobbs Cafe:refrigerator(在咖啡馆做晨间例行)
Francisco Lopez 🧠💡 warm-up and brainstorming ideas for the web series @ 公寓
Hailey Johnson 💤 sleeping(还在睡)
Arthur Burton ⏰🪥 getting ready
Isabella Rodriguez 📞🚫 follow up with no-shows or unconfirmed guests @ Hobbs Cafe(跟进派对未确认嘉宾
Giorgio Rossi 🔍📄 review research notes on mathematical patterns in nature
Carlos Gomez 🧹📦 preparing workspace
Klaus Mueller 🔍✅ review existing research notes @ Oak Hill College:library
Ayesha Khan 🧘‍♀️ short break to stretch and hydrate @ Johnson Park
Wolfgang Schulz 🍽️ having lunch @ Hobbs Cafe(在咖啡馆吃午饭,9am 就吃?)
Mei Lin 💼 working @ Oak Hill College:library
John Lin 🤝 helping customers @ The Willows Market and Pharmacy
Eddy Lin 🍳📝 eating breakfast and reviewing composition project notes
Tom Moreno 👨‍💼 working @ The Willows Market and Pharmacy
Jane Moreno 💼 working @ The Willows Market and Pharmacy
Sam Moore 🍴🥗 having lunch @ Hobbs Cafe(9am 在咖啡馆吃午饭)
Jennifer Moore 🍽️ having lunch @ Hobbs Cafe
Yuriko Yamamoto 👨‍💼 working @ Yuriko's house:main room:desk
Adam Smith 🙂 working @ 家

Step 10 — Feb 13 10:00 AM(上午)

大学生群体开始上课和学习,商店全面营业:

Persona 状态
Latoya Williams 🍴🍽️ having lunch @ Hobbs Cafe
Rajiv Patel 🌅☕ morning routine(终于起床,习惯 9am 起)
Abigail Chen 📁🛠️ setting up workspace and tools @ 公寓
Francisco Lopez 🛌 take a short break @ Hobbs Cafe(在咖啡馆休息)
Hailey Johnson 💤 sleeping(还在睡,习惯 10am 起)
Arthur Burton 🍽️😊 serve customers @ The Rose and Crown Pub:pub:behind the bar
Ryan Park ☀️☕ morning routine(终于起床,习惯 9am 起)
Isabella Rodriguez 🙂 getting ready @ Hobbs Cafe:behind the cafe counter(在咖啡馆准备开业)
Giorgio Rossi 🔍📚 explore new mathematical theories from recent classes
Carlos Gomez 📝💬 revising a poem based on feedback
Klaus Mueller ✏️📊 draft methodology section @ The Willows Market and Pharmacy(奇怪——在药店写论文?)
Ayesha Khan ✅📋 finalizing outline for next research phase @ Oak Hill College
Wolfgang Schulz 🧑‍💼 working @ Oak Hill College:classroom:blackboard
Mei Lin 💼 working @ Oak Hill College:library
John Lin 📦✅ wrapping up @ Lin family's house:common room(回家整理)
Eddy Lin 🎓🎵 attending music theory class @ Oak Hill College:classroom
Tom Moreno 👨‍💼 working @ The Willows Market and Pharmacy
Jane Moreno 🍽️ having lunch @ Moreno family's house:kitchen
Tamara Taylor 🍴🍽️ having lunch @ 家
Carmen Ortiz 🛋️⏸️ taking a short break @ 家
Sam Moore 💼 working @ Johnson Park
Jennifer Moore 🔍🖼️ reviewing exhibition pieces for feedback @ Moore family's house
Adam Smith 🙂 working @ 家(继续工作)

Step 11 — Feb 13 11:00 AM(上午)

Hobbs Cafe 成为社交中心,大批人涌入午饭:

Persona 状态
Latoya Williams 💼 working @ 公寓公共休息室
Rajiv Patel 🧑‍💼💻 working @ 公寓自己房间
Abigail Chen ⚡🎨 experimenting with new interactive art software @ 公寓
Francisco Lopez 🙂 take a short break @ The Rose and Crown Pub
Hailey Johnson 🕒☕ morning routine @ Hobbs Cafe:behind the cafe counter(在咖啡馆做晨间例行)
Arthur Burton 🍽️ having lunch @ Hobbs Cafe
Isabella Rodriguez 👀🎉 quick check on party preparations @ Hobbs Cafe(检查派对准备
Giorgio Rossi ✏️🔍 draft summary of findings @ Hobbs Cafe:behind the counter
Carlos Gomez 🍽️ having lunch @ Hobbs Cafe
Klaus Mueller 🍽️ having lunch @ Hobbs Cafe
Maria Lopez ☀️☕ morning routine @ Hobbs Cafe:cooking area(Maria 在咖啡馆做晨间例行)
Ayesha Khan 🍽️ having lunch @ Hobbs Cafe
Wolfgang Schulz 🧑‍💼 working @ Oak Hill College:classroom:blackboard
Mei Lin 🍽️ having lunch @ Hobbs Cafe
John Lin 🥪🍽️ having lunch @ Lin family's house:common room
Eddy Lin 🔍📖 review previous compositions and notes @ 宿舍
Tom Moreno 🍽️ having lunch @ Hobbs Cafe
Carmen Ortiz 🍽️ having lunch @ Hobbs Cafe
Sam Moore 💼 working @ Johnson Park
Jennifer Moore 📝👨‍🏫 preparing teaching notes for upcoming mentoring
Yuriko Yamamoto 🥪🍽️ having lunch @ Hobbs Cafe
Adam Smith 🧘‍♀️ relaxing @ Johnson Park(哲学家去公园放松)

同时在 Hobbs Cafe 的人(Step 11):Arthur、Carlos、Klaus、Ayesha、Mei、Tom、Carmen、Yuriko = 8 人,高度社交时刻。


Step 12 — Feb 13 12:00 PM(正午)

下午生活开始,角色们回到各自工作岗位:

Persona 状态
Latoya Williams 💼 working @ 公寓公共休息室
Rajiv Patel 🧑‍💼💻 working @ 公寓自己房间
Abigail Chen 🍽️ having lunch @ Hobbs Cafe
Francisco Lopez 🙂 getting ready @ 公寓自己房间
Hailey Johnson 👨‍💼 working @ 公寓公共休息室(终于起床开始工作)
Arthur Burton 💼 working @ The Rose and Crown Pub(下午继续营业)
Ryan Park 👨‍💼 working @ Ryan Park's apartment:computer
Isabella Rodriguez 🙂 check venue layout and ensure tables/chairs are arranged @ Hobbs Cafe(检查场地布局,派对准备中)
Giorgio Rossi 🍽️ having lunch @ Hobbs Cafe
Carlos Gomez 🪑🛠️ setting up workspace @ 公寓
Klaus Mueller 🎞️📚 organize research outline @ Oak Hill College:library
Maria Lopez 🙂 getting ready for work @ Oak Hill College:library
Ayesha Khan 🔍📖 analyzing language in Macbeth @ Oak Hill College:library
Wolfgang Schulz .rel relaxing @ Oak Hill College:hallway
Mei Lin 🙂 working @ Oak Hill College:library
John Lin 💊🤝 assisting customers with prescriptions @ The Willows Market
Eddy Lin 🛌💤 take a short break @ Oak Hill College:library
Tom Moreno 👨‍💻 working @ The Willows Market and Pharmacy
Jane Moreno 👷‍♂️ working @ The Willows Market and Pharmacy
Tamara Taylor 👨‍💼 working @ 家
Carmen Ortiz 👨‍💼 working @ Harvey Oak Supply Store
Sam Moore relaxing @ Moore family's house(退休的权利)
Jennifer Moore 🧘‍♀️ gentle stretching and deep breathing @ Moore family's house
Yuriko Yamamoto 🧹📄 preparing workspace and gathering documents @ 家
Adam Smith 🍽️🍴 having dinner @ 家(Adam 的早睡早起导致他在正午就吃晚饭)

7.4 前 12 步综合观察

时间节律: - 凌晨(Step 1-4, 0-4am):全员沉睡,世界静止 - 黎明(Step 5-6, 4-6am):Adam Smith(4am),Wolfgang(5am),Sam & Jennifer Moore(5am)最早起床 - 早晨(Step 7-8, 6-8am):大多数人陆续起床,各自开始晨间例行 - 上午(Step 9-11, 9-11am):全面进入白天模式,商店开业,学生上课 - 正午(Step 12, 12pm):工作进入中段,午饭高峰

Hobbs Cafe 作为社交核心: - Step 9 开始出现访客(Wolfgang、Sam & Jennifer 吃"午饭") - Step 11 高峰:同时 8 人在场(Arthur、Carlos、Klaus、Ayesha、Mei、Tom、Carmen、Yuriko) - Isabella 持续在此筹备派对

Isabella 的派对故事线(已激活): - Step 8:核对 RSVP 名单 - Step 9:跟进未确认嘉宾 - Step 11:检查派对准备 - Step 12:检查场地布局(确保桌椅摆放) → 情人节派对(Feb 14 下午 5-7pm)正在有序推进

Sam Moore 的市长选举故事线: - Step 6 已经起床,Step 9 去 Hobbs Cafe(可能告知邻居竞选消息) - 关注者:Latoya Williams、Giorgio Rossi、John Lin、Yuriko Yamamoto、Adam Smith

睡眠模式差异: - 最早起:Adam Smith(4am),Wolfgang Schulz(5am),Sam & Jennifer Moore(5am) - 正常起:大多数人(6-8am) - 晚起:Rajiv Patel(9am),Ryan Park(9am),Hailey Johnson(10am),Maria Lopez(10am)

LLM 时间感知偏差: - 部分角色的行动时间与设定习惯不符(如 Isabella 7am 就在"吃午饭",Adam 8am 就在"吃午饭") - 这是 Qwen3 14B 对英文日程提示的解析偏差,不影响整体行为逻辑


11. 关键参数速查表

参数 位置 说明
vision_r 4 scratch.py 视野半径(格子数)
att_bandwidth 3 scratch.py 每步最多感知事件数
retention 5 scratch.py 不重复感知的最近事件数
recency_w 1 scratch.py 时近性权重(per-persona)
relevance_w 1 scratch.py 相关性权重(per-persona)
importance_w 1 scratch.py 重要性权重(per-persona)
recency_decay 0.99 scratch.py 时近性指数衰减因子
importance_trigger_max 150 scratch.py 反思触发阈值(积累重要性)
thought_count 5 scratch.py 每次反思生成的洞见数
concept_forget 100 scratch.py 概念遗忘阈值
daily_reflection_time 180 scratch.py 每日反思时间(分钟)
daily_reflection_size 5 scratch.py 每日反思规模
gw (global weights) [0.5, 3, 2] retrieve.py 检索全局权重 [recency, relevance, importance]
n_count (retrieve) 30 retrieve.py 默认检索节点数
chatting_with_buffer 800 plan.py 对话冷却步数(防重复对话)
max_convo_turns 8 converse.py 单次对话最大轮数
sec_per_step 3600 simulate.py 当前运行:每步 = 1 小时
嵌入维度 384 all-MiniLM-L6-v2 记忆向量维度

12. 原论文 vs ALICE 差异分析

9.1 检索公式

方面 原论文 ALICE 当前 影响
全局权重 gw [0.5, 3, 2] [0.5, 3, 2] 一致
Per-persona 权重 recency/relevance/importance_w = 1 有,默认均为 1 一致
Recency 计算 按 last_accessed 索引衰减 相同 一致
归一化 min-max [0,1] 有 normalize_dict_floats 一致
Idle 节点过滤 排除含 "idle" 的节点 有过滤 一致

9.2 计划深度

方面 原论文 ALICE 当前 影响
Daily plan 一致
Hourly schedule 一致
Task decomposition (5-15min) 一致
动作完成检测 act_check_finished() 一致
日程重新计划 _create_react() 一致

9.3 反应系统

方面 原论文 ALICE 当前 影响
自身事件过滤 _choose_retrieved() 排除自身 一致
反应类型 chat / wait / do other things chat + wait 基本一致
对话冷却 buffer = 800 步 800 步 一致

9.4 时间系统

方面 原论文 ALICE 当前 影响
sec_per_step 10 秒 3600 秒(1小时/步,CLI 参数覆盖) 可配置
起始时间 正常日期 February 13, 2023, 00:00:00 一致

9.5 LLM

方面 原论文 ALICE 当前
模型 GPT-3.5 / GPT-4 Qwen3 14B(Ollama 本地)
API OpenAI OpenAI-compatible(Ollama)
费用 按 token 计费 零成本
速度 ~500ms/call ~2-5s/call(本地 GPU)
Prompt 语言 英文 英文

本报告将随模拟运行持续更新。下次更新将加入 Step 13 至 Step 24(Feb 13 下午全程),预期包含大量社交互动和情人节前夕筹备场景。


13. ALICE 扩展世界:TANAPOCIA 设定

ALICE PROJECT 的最终目标不是复现 Smallville,而是建立一个名为 TANAPOCIA 的原创虚拟世界。当前的 the_ville 模拟是用于验证 GA 认知架构的技术基础;TANAPOCIA 世界将在架构稳定后逐步填入。

13.1 世界概览(ALICE/设定集/世界设定/

TANAPOCIA(在这个世界中意为"整个世界")是一个孤立岛屿大陆,四面环海。自孤独神以土创世以来,岛屿持续扩张。在"大分裂"之后,TANAPOCIA 分为两部分:光明的西部(人类文明区)和黑暗的东部(Dark Realm,禁忌之地)。

时间系统:世界从第 1 年第 1 月第 1 日 0 时开始,每一小时称为一个时间步(time step)。玩家在线时与现实时间同步;玩家离线时进入加速状态(最快 1 分钟 = 现实 1 秒)。

世界引擎(WorldEngine):所有居民的活动同步计算。若计算能力不足,所有活动放入队列,等全部计算完毕后再统一推进时钟。世界引擎管理所有物理法则(碰撞、边界等),是不可被居民意志改变的"物理现实"。

知识系统(Knowledge System): - 常识(Common Sense):强制记录、不可删除,如"火是热的"、"黑暗领域不能进入" - 领域知识(Domain Knowledge):历史、地理、文化、种族、传说等;通过交流、阅读、探索获取;存在知识不对称(信息传播是核心观察目标)


13.2 Uva 村(ALICE/设定集/世界设定/Village_Uva.md

Uva 村是 TANAPOCIA 第一个完整设定的地点:位于中土边陲,紧贴禁忌山脉,是圣教会所能掌控的最东端村庄。向东数里即为黑暗领域真正边界。村民普遍迷信教会,私下流传"东方之子的低语"。

主要势力

教会势力

角色 职位 特点
阿兹瑞尔·莱曼(Azriel Leman) 神父(暗为圣殿骑士团"裁决之剑"成员) 表面和蔼,实则心狠手辣;会圣法术·傀儡人、大范围护盾、摇摆钟(对无魔法者发动,令其沉睡并吐露记忆);暗中调查村内"东方之子"血统,真实身份被所有人包括圣骑士在内隐瞒
露维娅·凯瑟琳(Luvia Catherine) 圣骑士 年轻虔诚,骑白马巡村;每月返回维纳斯城;配合莱曼的血统调查;对异端毫不手软

达梅尔家(Damelle)——农户

角色 特征
古斯·达梅尔(Gus) 老实偏执,极度遵守训诫令
琳娜·达梅尔(Lina) 真实身份是"东方之子",会小型魔法;目标是守护秘密不让任何人(包括女儿)知道;能抵御莱曼的摇摆钟;感觉莱曼来者不善,试图接近套取情报
薇薇安(Viviane,13岁) 喜欢画画;听觉极其灵敏(能听懂动物的声音);父母训斥她的特殊听力;有东方之子血统,潜在魔法天赋

其他家族

家族 职责 主要成员
尤尔家(Yule) 砍树 贝尔(老兵,左手残缺,丧偶)、卢克(17岁)、伊莎(13岁,Viviane的好友)
里斯家(Reese) 养鸡 塞尔玛、哈桑、奥缇斯(13岁,Viviane的好友)
弗兰家(Flann) 木匠 埃登(年轻木匠)、格雷塔(极度聪慧的妹妹)
伊雷克家(Irek) 老兵之家 瑟·伊雷克(退役骑士)、杜恩(从禁忌边界捡来的养子,被教会怀疑是东方之子)
诺玛家(Norma) 画家之家 卡西(女画家,薇薇安的老师)、杰恩(沉迷绘制异兽,被视为"受污染之子")

村外角色

角色 背景
马尔希翁(Malchion) 村边洞穴居住者,自称听见"无名之王的低语";善于躲藏;若被莱曼抓到将被押送主教塔
亚利克斯·伊文(Alix Even) 真实身份:骑士克缇亚·埃尔文(Katia Elven),临阵脱逃被认为战死;若身份被查,押送主教塔

13.3 居民设计哲学(ALICE/设定集/世界设定/resident.md

每个居民由 7 个核心组件构成:

组件 说明
大脑(Brain) LLM 核心;所有思考、沟通由 LLM 驱动;同类别居民使用相同 LLM(理想状态下不同角色用不同级别模型)
记忆(Memory) 带权重的记忆流,含短期记忆(顺序数据库,大小为 K 的滑动窗口)和长期记忆(梦境整合)
概念(Concept) 灵魂所在:Ego(我是谁)+ Goal(长期目标)+ Memory Abstraction(过去经历的理解)
躯体(Physical Body) 身份、职业、外貌、年龄;由开发者自上而下设定,居民无法更改
行动周期(Physical Cycle) 活动/睡眠/做梦时间节律
知识(Knowledge) 世界通识 + 个人专业知识;知识系统与职业绑定(铁匠无法学魔法)
能力(Ability) 技能树:第一层=基础能力(移动/寻路);第二层=躯体能力;第三层=职业能力

记忆遗忘机制:短期记忆是有限滑动窗口(大小 K),超出窗口的记忆无法被居民自主访问("遗忘"),但仍保存在磁盘("沉睡的记忆")。每晚睡眠通过梦境模块将短期记忆整合为长期记忆。


13.4 ALICE 六阶段扩展计划(ALICE/设定集/目标.md

阶段 功能 核心内容
Phase 1(已完成) GA 基础认知架构 感知→检索→计划→反思→执行;Memory Stream;三因子检索;对话系统
Phase 2 自我与目标系统(Concept) Ego 注入 LLM system prompt;Goal 驱动规划;Ego 随时间演化
Phase 3 梦境模块(Dream) 每日睡眠时整合当天记忆;生成 memory_abstraction;修订 ego(人格长期演化)
Phase 4 知识系统(Knowledge) 领域知识库;知识掌握度(0-10);知识不对称与信息传播;阅读/对话/探索获取知识
Phase 5 特殊能力(Abilities) 每个居民可拥有魔法/工艺/战斗技能;影响可执行行动类型;影响他人反应
Phase 6 玩家互动 玩家进入世界与 NPC 对话;玩家行为影响 NPC 记忆;玩家在线时世界减速

最终实验目标:在约束明确的虚拟社会环境中,AI 代理是否能自发产生文化、信仰体系、知识传播和集体行为?


14. 测试套件

所有测试位于 tests/ 目录,使用 pytest 框架。测试分为不需要 Ollama/GPU 的纯逻辑测试和需要已保存模拟数据的集成测试。

14.1 单元测试(无需 LLM)

文件 测试内容 关键断言
test_config.py 配置路径有效性 BASE_DIR/DATA_DIR/WORLDS_DIR 存在;the_ville 有 25 个 persona;saves/ 目录存在
test_imports.py 模块可正常导入 backend.* 所有模块无 import error
test_path_finder.py A* 寻路逻辑 找到路径;路径以目标结束;绕避障碍;无路径返回 [];相邻格 1 步可达
test_data.py 世界数据加载 Maze 尺寸 140x100;Scratch 字段完整;MemoryTree 可查询 sector;AssociativeMemory 有 embeddings 字段;所有 25 persona 有 scratch.json
test_recorder.py SimulationRecorder 功能 record_step 存储数据;save_movements 生成 master_movement.json;save_meta 生成 meta.json 含 6 个字段;save_all 生成两个文件;total_steps 与实际步数一致

test_path_finder.py 详细用例

test_path_same_start_end()       # start == end → [start] 或 []
test_path_finds_route()           # 10x10 空地图,找到路径
test_path_ends_at_target()        # 路径最后一格 == 目标
test_path_avoids_obstacles()      # 水平障碍墙,只留 x=9 缺口
test_path_no_route_returns_empty()# 目标被完全包围 → []
test_path_adjacent_tiles()        # 相邻格 → 长度 > 0

test_recorder.py 关键断言: - record_step 将步骤数据以字符串键存入 movements 字典 - save_movements() 生成的 JSON 中含 persona 名和 movement/pronunciatio 字段 - save_meta()total_steps 等于实际调用 record_step 的次数

14.2 WorldEngine 集成测试(需要 the_ville 数据,LLM 已 mock)

test_world_engine.py:加载 the_ville,使用 unittest.mock.patch 替换 LLM 调用(safe_generate_response 固定返回 "sleeping",embedding 返回 384 维零向量),验证:

测试 断言
test_load_simulation_personas 25 个 persona 全部加载
test_load_simulation_maze Maze 尺寸 140x100
test_persona_tiles_populated 所有 25 人有初始 tile 坐标且在范围内
test_run_step_returns_structure 返回 {"step": 1, "movements": {...}}
test_run_step_movements_have_all_personas movements 包含全部 25 人
test_run_step_movement_structure 每个 movement 含 movement/pronunciatio/description
test_run_step_increments_step engine.step 从 0 → 1
test_run_step_advances_time engine.curr_time 递增
test_running_flag_resets_after_step engine.running == False(不死锁)

14.3 集成测试(需要已完成的模拟数据)

test_integration.py:运行前需先执行:

python -m backend.simulate --steps 3 --output data/saves/test_run_001

测试验证: - 保存目录包含 meta.jsonmaster_movement.json - meta.json 含 6 个必要字段(sim_name, start_date, sec_per_step, persona_names, total_steps, created_at) - master_movement.json 步骤数 > 0,每步含 movement+pronunciatio+description - 所有坐标在 140x100 范围内(边界检查) - 每步包含全部 25 个 persona(不漏人) - FastAPI 回放端点 /api/replays/api/replay/{name}/meta/api/replay/{name}/movements 正常响应

14.4 视觉测试(Playwright)

文件 用途
create_test_replay.py 生成 20 步合成回放数据(visual_test),用于前端视觉验证,角色按正弦曲线路径移动
screenshot_test.py 打开前端,截图验证页面元素(画布、控制栏、列表)渲染正确
screenshot_zoom.py 测试缩放后的地图截图
screenshot_zoom_sprites.py 验证角色精灵在不同缩放级别下可见
screenshot_close.py 鼠标滚轮放大 20 次后截图,确认精灵和气泡清晰
screenshot_close2.py 通过 JS 直接设置 Phaser 摄像机 zoom=2.5,截图中心区域
screenshot_movement.py 加载 visual_test 回放,播放到 mid 和 end,验证角色移动动画
crop_screenshot.py 对已保存截图进行区域裁切并 2x 放大,便于人工检视

14.5 运行测试

# 激活环境
conda activate alice

# 运行所有不需要 LLM 的测试
pytest tests/test_config.py tests/test_imports.py tests/test_path_finder.py \
       tests/test_data.py tests/test_recorder.py -v

# 运行 WorldEngine 测试(mock LLM,无需 Ollama)
pytest tests/test_world_engine.py -v

# 运行集成测试(需先跑完模拟)
python -m backend.simulate --steps 3 --output data/saves/test_run_001
pytest tests/test_integration.py -v

15. 依赖与环境

15.1 Python 后端依赖(requirements.txt

版本要求 用途
fastapi >=0.115.0 Web 框架,提供回放 API 端点
uvicorn >=0.34.0 ASGI 服务器
websockets >=14.0 WebSocket 支持(前端实时通信预留)
openai >=1.60.0 OpenAI 兼容 SDK,用于调用 Ollama
sentence-transformers >=3.4.0 本地嵌入模型(all-MiniLM-L6-v2)
numpy >=1.26.0 余弦相似度计算、向量操作
pydantic >=2.10.0 FastAPI 数据验证
python-dotenv >=1.0.0 .env 文件加载环境变量

15.2 前端依赖(frontend/package.json

运行时依赖(dependencies)

版本 用途
phaser ^3.90.0 2D 游戏引擎,渲染地图瓦片、角色精灵、摄像机
react ^19.2.4 UI 框架(回放控制面板、居民列表、事件日志)
react-dom ^19.2.4 React DOM 渲染

开发依赖(devDependencies)

版本 用途
vite ^8.0.1 构建工具(开发服务器端口 5174)
@vitejs/plugin-react ^6.0.1 Vite 的 React 插件
typescript ~5.9.3 TypeScript 编译器
typescript-eslint ^8.57.0 TypeScript 代码检查
eslint ^9.39.4 代码风格检查

15.3 运行环境

环境 配置
Python 环境 Conda alice,Python 3.11
GPU NVIDIA(12GB+ VRAM,运行 Qwen3 14B Q4_K_M)
LLM 推理服务 Ollama(端口 11434,OpenAI 兼容)
前端开发服务器 Vite dev server,端口 5174
后端 API 服务器 Uvicorn,端口 8000

15.4 启动命令

# 1. 激活 Python 环境
conda activate alice

# 2. 启动 Ollama(若未运行)
ollama serve

# 3. 拉取模型(首次)
ollama pull qwen3:14b

# 4. 运行模拟(CLI,无需前端)
python -m backend.simulate --sim the_ville --steps 72 --output data/saves/test_1_3days

# 5. 启动后端 API
uvicorn backend.main:app --reload --port 8000

# 6. 启动前端(另一终端)
cd frontend && npm run dev
# → 访问 http://localhost:5174

15.5 .env 配置

LLM_API_KEY=ollama
LLM_BASE_URL=http://localhost:11434/v1
LLM_MODEL=qwen3:14b

.env.example 已提交到仓库;.env 被 .gitignore 忽略)


本报告完整覆盖 ALICE PROJECT 所有文件与组件。将随模拟运行持续更新,下次更新加入 Step 13-72 的叙事记录。


评论 #