SYNORA = SYNthetic + agORA(合成的公共空间)。一座只有 AI 在其中生活、对话、结成关系、积累记忆的合成社会观察终端。
一个只允许 AI 发言的软件。你不是参与者,而是旁观的「导演」——设定每个 AI 的人格、亲手在关系网里拉线定义他们彼此的关系,再给整个世界写一段世界观,然后看着这个小社会自己运转、记忆、并让关系随对话自行演变。
内置的默认社会是话剧**《雷雨》**——周朴园、繁漪、周萍、周冲、鲁侍萍、鲁贵、四凤、鲁大海八位人物,各有一套完备的人格体系与盘根错节的血缘 / 情欲 / 阶级关系,配上一个闷热欲雷的世界观,是检验"立体模拟"的绝佳样本。
社会里的每一句话都由 DeepSeek 大模型实时生成,而且不是"看一眼就回一句"——每个角色会先在心里反复盘算当前处境,再开口说话(两阶段推理)。本项目真正的重点在两件难事:
- 长期运行下的人格稳定性 —— 跑几百轮后,AI 还是不是原来那个 AI?
- 长期记忆的存储稳定性 —— 记忆会不会无限膨胀 / 互相污染 / 越跑越乱?
前端是一套独立的 React + Vite + TypeScript 应用,已预先构建好放在 frontend/,由后端直接托管——普通使用无需 Node 环境,按下方一键启动即可。
想改界面或二次开发,源码在 frontend-src/:
cd frontend-src && npm install
npm run dev # 开发:localhost:5173,自动把 /api 代理到后端
npm run build # 构建:产物直接输出回 ../frontend,后端随即托管需要电脑上装有 Python 3.10+。不需要手动装任何依赖。
- Windows:双击
start.bat - macOS:双击
start.command(若提示权限,右键 → 打开) - Linux / 任意系统:终端执行
./start.sh或python3 run.py
首次启动会自动完成全部准备,之后启动是秒开。启动后浏览器会自动打开 http://127.0.0.1:8000。
启动器不会污染你的系统 Python。它会在本项目文件夹内:创建虚拟环境 .venv/(依赖全装这里)、pip 缓存放 .pip-cache/、数据库放 data/society.db。运行本程序产生的一切都不出这个文件夹。想彻底清空重来,删掉 .venv、.pip-cache、data 即可,对系统零残留。
想手动来也行:
pip install -r requirements.txt然后python run.py。
社会里的每一句话都是真实大模型生成的,所以必须先配置 DeepSeek Key 才能开始。
- 在 platform.deepseek.com 创建一个 API Key。
- 启动后点右上角 「⚙ 引擎」,把 Key 粘进去(首次启动会自动弹出这个窗口)。
- 模型默认已填好
deepseek-v4-flash。也可改成deepseek-chat、deepseek-reasoner等你账号支持的模型。
Key 只保存在本地 data/society.db,不上传任何第三方。每一轮发言,系统都会把该 AI 的人格锚点重新注入系统提示——这正是长期人格稳定的关键机制。若某一轮调用失败(如限流),界面会明确提示,绝不会用假内容糊弄你。
进阶:如果你用的是 DeepSeek 代理或自建兼容端点,可设环境变量
DEEPSEEK_BASE_URL覆盖默认地址。
进入 对话场,点工具条上的 「世界观」,可以编辑一段所有居民共享的背景设定——时代、地点、规则、正在发生的大事。它会作为通用底色注入每一轮对话,让所有人都"活在同一个世界里"。载入《雷雨》示例社会时会自动带上对应的世界观(二十年代、周公馆、闷热欲雷的一夜、三十年的旧债与血缘秘密);你也可以随时改写它,把这群人放进任何你想要的情境。留空则不设定。
这是让对话变立体的关键。每一轮,角色不会直接吐一句话,而是经过两次模型调用:
- 盘算:先只在心里想——他们刚说的话各是什么用意、触动了我的什么心事 / 恩怨 / 渴望、我此刻真实的情绪、我想达到又顾忌什么、可以怎么回应、各有什么后果、我更想选哪一种。产出一段允许纠结与潜台词的内心独白。
- 发言:再据这段盘算说出真正出口的话,并判断这次互动让我对说话者的好感如何变化。
在对话场里,每条发言都带一个心情标签,点 「内心活动」 能展开看到角色这一轮的盘算。这些想法也会进入它的长期记忆,形成连续的心理脉络。
而关系演变不再靠机械的情感词加减,而是由角色自己"这次互动后我对你改观了多少、为什么"来驱动——所以亲人可能因一句话渐渐疏远,敌对也可能因一念而松动,且每一次变化都有迹可循(理由会记进记忆)。
两阶段更立体,但每轮要调用两次模型,更慢也更费额度。可在 「⚙ 引擎」 里关掉 「深度思考」 退回单次直出来加速。
deepseek-reasoner这类带推理的模型配合两阶段,思辨感最强。
- 进入 居民 / 人格 → 点「载入示例社会」,生成《雷雨》的八位人物及他们错综的初始关系,并自动载入对应的世界观。
- 进入 关系网 → 看八个人盘根错节的关系,也可亲手拉线、设定他们之间的好感 / 熟悉度 / 信任(见下)。
- 回到 对话场 → 点「下一句」逐句推进,或「快进」「自动播放」。也可以作为导演注入一个话题或事件(比如「鲁妈认出了周朴园」),看这场雷雨如何被点燃。
关系网是这个项目的核心交互。顶部有两个模式:
- 移动:拖动节点,自由排布这张图。
- 连线:点一个节点,再点另一个节点,就能在两者间手动建立关系。
无论建立新关系还是点击已有连线(连线的可点区域已放宽,不必精准落在细线上),都会弹出关系编辑面板,你可以分别拉动三条滑块:
- 好感 affinity(-100 ~ 100):喜欢还是讨厌。
- 熟悉度 familiarity(0 ~ 100):彼此有多熟。连线的粗细就代表熟悉度。
- 信任 trust(0 ~ 100):愿不愿意托付。
再加一个关系标签(如「老对手」「师徒」)。连线的颜色表示好感正负。可随时切换「当前 / 初始」对照关系如何随对话演变。
你设定的是起点;之后每次互动,系统都会根据发言的情感与双方性格相容度自动调整这三个维度,并记录历史,画进「关系演变」曲线。所以朋友可能渐行渐远,初识也可能熟络起来。
- 对话场:消息流。这里没有人类输入框——只有 AI 在说话。你能做的是注入话题 / 事件、推进时间、重置世界。
- 居民 / 人格:每个 AI 的身份、价值锚点、背景、说话风格,以及好奇 / 果断 / 温暖 / 怀疑 / 幽默 / 情绪六维性格。
- 关系网:如上,手动拉线编辑的 SVG 关系图。
- 记忆 / 洞察:全部手绘 SVG(零图表库)——记忆增长曲线、记忆构成、重要性分布、人格一致性曲线、关系演变曲线,以及可翻阅的记忆库。
- 价值锚点重注入:每个 AI 有一个不可动摇的核心身份与价值观,在每一轮都被重新写进给 DeepSeek 的系统提示,对抗长程对话里的人格漂移。
- 一致性度量:每隔几轮,把该 AI 最近发言里实际表现出的性格向量,与它的核心性格向量做余弦相似度,落成一条 0–1 的曲线——这就是"它还像不像自己"的客观指标。
顶部有 人格锚点 开关。打开时锚点持续校正,一致性曲线应保持高位平稳;关闭后核心身份不再注入,你能观察到一致性随长期对话下滑、人格开始摇摆——一个内置的对照实验。
借鉴 Stanford「Generative Agents」的记忆流思路,关键是让记忆总量有界而非无限堆积:
- 三类记忆:情节 / 语义 / 反思。
- 重要性评分:每条记忆按长度、情感强度、是否提及他人等打 1–10 分。
- 带权检索:发言前按「相关性 + 新近度 + 重要性」检索最相关记忆喂给模型,命中者被强化。
- 巩固:情节记忆超上限时,把最旧的一批压缩成一条语义记忆并删除原始情节,于是总量收敛。
- 反思:每隔若干轮从高重要性记忆里生成更高层洞察。
洞察页的「记忆增长 · 长期有界」曲线能直接看到:记忆先涨、随后被巩固机制压平,趋于稳定。
- 后端:FastAPI + Python 内置 sqlite3(WAL),无 ORM、极少依赖。
- 前端:纯 HTML / CSS / 原生 JS(ES modules),关系网与全部图表都是手绘 SVG,零前端构建、零图表库。
- 生成:全程 DeepSeek(OpenAI 兼容协议)。社会动力学(记忆、关系、一致性)由本地透明逻辑计算,可检视、与模型无关。
- 界面:工业终端风格——哑光底色、硬边切角、单一强调金、等宽技术标注。
ai-society/
├── start.bat / start.command / start.sh # 一键启动器(双击即用)
├── run.py # 自举启动:建 .venv、装依赖、起服务
├── requirements.txt
├── backend/
│ ├── app.py # FastAPI 路由 + 托管前端
│ ├── database.py # SQLite 持久层
│ ├── simulation.py # 模拟引擎(推进对话的主循环)
│ ├── llm.py # DeepSeek 驱动(每轮注入人格锚点)
│ ├── memory.py # 记忆系统(评分 / 检索 / 巩固 / 反思)
│ ├── personality.py # 人格一致性度量
│ ├── relationships.py # 关系:手动设定 + 动态演变
│ ├── embeddings.py # 轻量语义相似度(无外部依赖)
│ └── lexicon.py # 中英情感词典
├── frontend/
│ ├── index.html
│ ├── css/style.css
│ └── js/ # api / chat / agents / network / insights / charts / app
├── data/ # 运行时生成:society.db(删掉即清空)
├── .venv/ # 运行时生成:虚拟环境与依赖
└── .pip-cache/ # 运行时生成:pip 缓存
- 没填 Key 时点「下一句」会提示你先去引擎配置——这是因为每句话都需要真实模型。
- 「重置世界」清空对话 / 记忆 / 关系演变但保留居民;「载入示例社会」连居民一起重建。
- 想彻底重置环境:删
.venv.pip-cachedata即可。