ALICE PROJECT — 综合报告
状态:持续更新中 | 模拟运行:test_1_3days(72步,正在进行)| 已完成步骤:12/72
本报告涵盖 ALICE PROJECT 的全部技术细节:论文原理、认知架构、世界地图、角色设定、系统实现、以及实际模拟记录。
目录
- 项目概述
- 理论基础:Generative Agents 论文
- 认知架构详解
- 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 反应与重新计划
- 世界地图:The Ville(Smallville)
- 25 个角色(Persona)详细档案
- 25 人初始人际关系网络
- ALICE PROJECT 系统实现
- LLM 与嵌入模型实现细节
- 空间记忆与 A* 寻路
- 模拟运行记录:test_1_3days
- 关键参数速查表
- 原论文 vs ALICE 差异分析
- ALICE 扩展世界:TANAPOCIA 设定
- 测试套件
- 依赖与环境
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 驱动的虚拟角色能展示可信的类人行为。三大创新模块:
- 记忆流(Memory Stream):用自然语言记录代理的全部经历,形成一个不断增长的经历数据库。与传统的状态变量不同,记忆流保留了经历的全部语义细节。
- 检索(Retrieval):基于时近性(recency)、重要性(importance)、相关性(relevance)三因子加权检索相关记忆。这一机制模拟了人类注意力的选择性——不是所有记忆都同等重要,最近的、最重要的、与当前情境最相关的记忆会优先浮现。
- 反思(Reflection):定期将底层记忆综合为更高层次的抽象洞见(higher-level insights)。例如,从多次观察到"Klaus 经常在图书馆"、"Klaus 在写研究论文"、"Klaus 讨论社会问题"等底层记忆中,反思出"Klaus 是一个对社会公正充满热情的勤奋研究者"这一高层概括。反思产生的节点本身也进入记忆流,可被后续检索和进一步反思引用,形成递归抽象。
此外,论文将这三个模块与计划(Planning)和反应(Reacting)系统相结合:
- 计划系统:代理每天生成日程计划,并将计划分解为逐小时、逐任务的细粒度行动序列
- 反应系统:当代理感知到新事件(如遇到另一个代理)时,可以选择发起对话、等待、或忽略,并据此动态调整当前计划
2.4 架构总览
论文提出的生成式代理架构可以用以下流程概括:
感知(Perceive)
│
▼
检索(Retrieve)──→ 记忆流(Memory Stream)
│ ▲
▼ │
计划/反应(Plan/React) 反思(Reflect)
│
▼
执行(Execute)──→ 环境变化 ──→ 被其他代理感知
信息流详解:
- 感知:代理观察视野内的环境变化(其他代理的行为、物体状态变化)
- 存储:感知到的事件被编码为自然语言描述,附加时间戳和重要性评分,存入记忆流
- 检索:根据当前情境,从记忆流中检索最相关的记忆子集
- 计划/反应:基于检索到的记忆和当前情境,LLM 生成行动计划或对事件的反应
- 反思:当累积的感知重要性超过阈值时,自动触发反思,生成高层次洞见
- 执行:将计划转化为环境中的具体行动(移动、交互、对话)
这一架构的关键设计原则是"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 一条指令——她想举办情人节派对
- 完全无干预:此后研究者不对任何代理发出任何指令
- 观察到的涌现行为链:
- Isabella 决定在 Hobbs Cafe 举办情人节派对(2月14日下午5-7点)
- Isabella 在咖啡馆工作时逐个邀请来店的顾客
- Maria Lopez(Isabella 的好友兼常客)得知消息后答应参加
- Maria 遇到 Klaus Mueller(她暗恋的对象)时邀请他一起参加
- Klaus 考虑后决定参加,并为此调整了当天的学习计划
- 最终 5 个代理自发协调时间出席派对
- 邀请信息通过社交网络自发扩散——有些代理是被 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()
<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()
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))
为何选择 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."""
关键细节:
- 障碍处理:碰撞网格中非零值为障碍(建筑物、家具等),0 为可行走
- 目标不可达时的回退:
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 距离最小的可走格作为新目标 - 启发式函数:Manhattan 距离(适合四方向移动)
- 四方向移动:上下左右,不含对角线
- 返回值:
- 包含 start 和 end 的完整路径
[(x,y), ...] - 无路径时返回
[]
- 包含 start 和 end 的完整路径
地图尺寸与坐标系
- 网格尺寸: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.json 和 master_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 的叙事记录。