domi开发者文档
DOMI · DOCS

记忆分层与 Soul

本页回答四个问题:domi 怎么记住你?L0–L4 各是什么、各自活多久?Soul 怎么维护而不被 domi 乱改?记忆会出错吗? packages/memory(纯函数)+ packages/runtime/src/memory-service.ts(IO 与编排)+ packages/store/src/semantic.ts(投影)。 贯穿例子:给登录接口加限流——你纠正过 domi「不要动数据库表结构」,这条偏好最终会进 Soul。

先说结论

用到的词

词 意思
工作记忆 当前上下文窗口,本轮用完就丢。
情节记忆 可检索的历史事件片段。
语义记忆 抽取出的事实 / 偏好 / 实体。
Soul 从语义记忆蒸馏的稳定人格层。
投影 从事件算出来的表(semantic_items 等)。
ownedLines 文件里 domi 写过、且没被人改过的行。

1. 总体流程

记忆分层

Soul 怎么更新

2. 记忆分层模型 L0–L4

层 是什么 存活期
L0 工作记忆:当前上下文窗口 易失
L1 会话摘要:ctx.compact 结构化摘要 随会话
L2 情节记忆:可检索的历史事件片段(FTS + 向量) 跨会话
L3 语义记忆:抽取出的事实 / 偏好 / 实体 跨会话
L4 Soul:从 L3 蒸馏的稳定人格层 长期

3. 真相与投影的边界

4. Soul:人类可读、可 diff、可否决

soul.md 是人类可读的 Markdown:

5. 记忆检索

6. 出错了怎么办:限流做完了,domi 记了一条你不同意的偏好

  1. domi 提议改 Soul(比如记「用户要求限流时不动数据库」)。它以 SoulChange 呈现给你,没经过你同意不会写。
  2. 你否决某条。否决 = 删除,这条不写进 soul.md。下一轮不会重复提(来源事件已算过)。
  3. 你手动改了 soul.md,domi 正好要写。mtime 对不上 → CONFLICT,不覆盖。domi 重新读文件再决定。
  4. 记忆抽取错(把一次性的要求当成了长期偏好)。来源注释指回原始事件,你可以在审阅时删掉,或在文件里删行——domi 之后不会动它(不是 ownedLines)。
  5. 两个会话同时写 Soul。MemoryService 串行,写操作排队,不会互相覆盖。

一张表看全部情况

情况 domi 做什么 你要做什么
提议改 Soul 呈现 SoulChange,等审阅 逐条同意或否决
你否决一条 否决 = 删除,不写 不用管
你手动改了 soul.md mtime 冲突 → CONFLICT,不覆盖 重新触发更新即可
记忆抽错了 带 sourceRefs 可追溯 审阅时删掉
两个会话同时写 MemoryService 串行排队 不用管

7. 可靠性靠什么

  1. 真相在事件里。投影可以删、可以重建,记忆不会因表损坏而丢。
  2. Soul 是纯文本。人类可读、可 diff、可进 git——「会积累人格」的实现是透明的。
  3. 默认不动人的东西。ownedLines 判定 + mtime 冲突保护,双保险。
  4. 改动必经审阅。逐条可否决,没有「domi 自己写自己」的路径。
  5. 来源可追溯。每条记忆带 sourceRefs,错了能找到依据。

已知限制

代码在哪里

主题 位置
Soul 解析 / 渲染 / 应用 / 回退 packages/memory/src/soul.ts
记忆抽取(结构化输出) packages/memory/src/*(ExtractionSchema)
检索(语义 + FTS) packages/memory/src/search-tool.ts · store/src/semantic.ts
情节记忆 packages/memory/src/episodic.ts
记忆服务(IO / 串行 / soul 写回) packages/runtime/src/memory-service.ts
Soul 区定义与 SoulChange packages/protocol/src/event.ts

测试:packages/memory/test/(soul 解析 / 应用 / 回退 / 导出扫描、语义归一化);packages/store/test/(semantic 投影)。

相关