中文 | English
一款AI聊天服务 App —— 通讯录里住着会真正记得你的 AI 好友们。
你跟 AI 聊了一晚上,告诉它你的喜好、你的近况、你在烦什么。第二天再打开,它把你忘得一干二净,你又成了陌生人。市面上的 AI 聊天 App 大多如此——换个 session 就重置。
Nemos 想做的,是几个会跨时间记得你的 AI 角色:你说过的事、你的偏好、你最近的状态,它都记得;你改了口,它也会跟着更新。
聊天方式也不止打字:也可以发语音(自动转写),也可以语音通话 —— 连续的语音对话,就像对面是一个活生生的人。
让这件事真正成立的,是底层一套独立的记忆系统。—— Nemos
陪伴是外壳,记忆才是内核
目前内置 5 个角色,性格、声音各不同:
- 菲菲 🎨 朋友——25 岁自由插画师,温暖细腻的"理性浪漫主义者",养了只橘猫。先共情、再给空间,不催不说教。
- 阿哲 ☕ 朋友——30 岁产品顾问,理性、话短、问题导向,不灌鸡汤的"搭子";帮你停下内耗、把事做完。
- 月白 📋 个人助理——沉稳利落,帮你梳理任务、起草文字、联网查资料、识图读图、记 deadline 并到点提醒。
- 团子 🍡 不明生物——圆滚滚奶乎乎,天真热乎,靠"转圈圈 / 瘪成扁麻薯"表达情绪,无条件陪着你。
- 灵灵 🐾 灵宠——巴掌大的小毛球,几乎不说话,靠"咕噜~(蹭蹭你)"这样的拟声和小动作陪你。
这套记忆系统(Nemos)可独立抽出、单独使用,不被陪伴这层写死——陪伴只是它的第一个应用。它不是"把聊天记录丢进向量库"那么简单,而是一套有结构、会演变、可追溯的记忆引擎。下面这些机制,正是这款陪伴软件"像真的记得你"的原因。
① 分层记忆,不是一锅向量 记忆不平铺成一堆文本,而是分五层各司其职:
| 层 | 装什么 | 例子 |
|---|---|---|
| 情景 episodic | 发生过的具体事件 | "上周三你熬夜赶方案到三点" |
| 语义 semantic | 客观事实 | "你在做品牌设计" |
| 个人语义 personal_semantic | 关于"你这个人"的偏好与画像 | "你不喜欢花哨配色" |
| 程序 procedural | 做事的方式 / 习惯 | "你习惯早晨写作" |
| 原文 archival | 未经加工的原话 | 你说过的每句话备份 |
回答"你喜欢什么"和"上周三发生了什么",走的是不同的层——而不是把全部聊天记录一股脑丢给模型。
② 抽取 + 反思:从碎话里长出画像 你随口说的话先入原文层;后台异步把其中的事实抽出来、归到对应层(不阻塞回复——你发完消息立刻得到回应,记忆在后台沉淀)。聊得多了会触发"反思"(reflect):把一堆零散情景整合成更稳定的画像(如"倾向早晨高产"),并顺带维护下面这些机制。
③ 真相一份,跨角色一致 关于你的事实只存一处。每个角色只在自己"在场"的会话边界内看到该看到的:群里说的话在场成员都记得,只对一个人说的私事别人看不到,没在场的角色看不到群里的内容。
④ 按领域稀疏激活(MOE) 记忆按主题自动聚成"领域"(reflect 离线孵化),检索时先路由到相关领域、只把该领域的记忆调上来,无关领域降权——四级激活:共享层(恒在)→ 主领域升顶 → 邻接领域次之 → 再沿记忆间的关联边做一跳"跨域联想",把相关的跨领域记忆也带进来。这样规模变大后依然精准,而不是一检索就把整本记忆塞进 prompt。是软隔离:低置信时自动回退全局检索,绝不因路由失误漏掉东西。同类项目里少见。
⑤ 会纠错,不翻旧账(双时间 + 矛盾失效) 每条记忆都带"何时为真"的时间轴和信念状态。你一旦改口("我搬到上海了"),新事实会让旧事实失效而非物理删除——历史可回溯,但检索默认只给当前有效的。所以角色极少拿过时信息出丑,也不会把你纠正过的事又翻出来。
⑥ 防自污染 角色自己编出来的"近况",和"关于你的事实"在存储上物理隔离(不同命名空间、标记为非权威),永远不会回写进你的记忆库。模型说的话只用于角色自身前后一致,绝不冒充成关于你的真相。
⑦ 来源可信,防伪造 每条派生记忆都记账来源与改写链路;模型抽取出来的东西默认是"推断",不能伪装成"你亲口说的权威事实"。这道硬约束有测试守着——防止模型自己编的内容反噬成你的"画像"。
⑧ 会遗忘 久未用到的记忆按遗忘曲线自动降权,不会越堆越乱、也不会让三年前的旧习惯盖过当下。重要的、常被提起的,则留得久。
⑨ 你拥有、可审计 随时查看 AI 记住了哪些关于你的事;想重来可一键清空整个记忆库。数据落在本地 SQLite,归你掌控。(逐条编辑暂未支持。)
设计细节见
rfcs/:RFC-0004 遗忘与整合 / RFC-0005 领域路由 / RFC-0007 双时间失效 / RFC-0008 陪伴记忆拓扑。
我们为"记忆维护"专门构建了可复现基准 MnemoBench(信念更新 / 防自污染 / 遗忘三类任务;真值由生成器预先固定,LLM judge 只做集合判定、从不代写答案),用消融实验证明上面的关键机制各自对应一段可测量的提升(每任务 n=50):
| 机制 | 主指标(越低越好) | 关闭 → 开启 |
|---|---|---|
| ⑥ 防自污染(命名空间隔离) | 污染率 | 96.8% → 1.6%(约 60×) |
| ⑧ 遗忘衰减 | 琐事泄漏 | 100% → 16.4%(重要事实保留不损) |
| ⑤ 矛盾失效(语义检测) | 旧值泄漏 | 80.0% → 34.0% |
在标准基准 LongMemEval 的知识更新切片上,仅开关矛盾失效一项就带来 +10 个百分点的 QA 准确率。完整方法与数字见 bench/(评测框架与数据)与 paper/(arXiv 论文,中英双语)。
角色不写死:
- 网页里直接改——「⚙️ 设置 → 角色设置」改名字、性格、话量,即时生效并保存。角色的背景事实存在它自己的记忆库里,也会随交流自然演变(说了新的会更新,旧的矛盾会失效)。
- 代码里自定义——角色定义在
examples/companion/personas.ts,加角色、改人设、调模型都行。
cd sdk/typescript
npm install
npx tsx examples/companion/server.ts # 打开 http://localhost:8787无 key 也能开(离线兜底,可看界面与记忆拓扑)。要真实多人格对话,填一个智谱 key——在网页「⚙️ 设置」里直接填即可,运行时切换、不必重启;或用环境变量启动:
# PowerShell: $env:ZHIPU_API_KEY="<你的key>"; npx tsx examples/companion/server.ts
# bash: ZHIPU_API_KEY=<你的key> npx tsx examples/companion/server.ts记忆内核是一个嵌入式 TypeScript SDK,可单独用在你自己的(非商业)项目里,五行接入:
const mem = new Nemos({ storage, llm })
const user = mem.forUser(userId)
await user.ingest("用户说:我不喜欢深色主题")
const context = await user.getRelevantContext("帮我设计一个界面")
// → "用户偏好浅色主题;此前表达过对简洁风格的偏好…"| 文档 | 内容 |
|---|---|
sdk/typescript/README.md |
SDK 接入与 API |
docs/architecture-overview.md |
系统设计与五层记忆模型 |
rfcs/ |
重大设计决策 |
bench/README.md |
MnemoBench 记忆维护基准(可复现) |
paper/ |
arXiv 论文(方法 + 消融结果,中英双语) |
ROADMAP.md |
版本规划与进度 |
SDK 内置 Anthropic / OpenAI / 智谱三类 LLM provider,也可自定义接入;陪伴示例默认走智谱。
Nemos 采用 PolyForm Noncommercial License 1.0.0:可自由用于非商业用途、修改、分发、做自己的版本;商业用途需另行授权。(含"禁止商用"限制的许可证属 source-available,严格说不算 OSI 定义的 open source。)
Nemos,取自希腊语「记忆」(μνήμη, mnēmē)。