Lore

Dream

定时运行的记忆维护:合并重复、收紧触发条件,并留下可审查的日记。

Dream 是 Lore 的定时记忆维护。它每晚检查一遍记忆图谱,做少量谨慎的修正,并写下一篇可以审查、也可以回滚的日记。

一次运行做什么

一次运行先收集启动记忆(boot,即 Agent 在会话开始时加载的基线)、最近一天的召回与记忆活动、路径质量摘要、结构审计、记忆卫生审计,以及最近五条已完成的日记。随后,一个 Agent 使用记忆工具依次完成五个阶段:

  1. 诊断(diagnose)读取召回查询、卫生审计、结构审计和记忆树,也可以回放真实的召回查询,看当前记忆树会召回什么。不做任何修改。
  2. 计划(plan)按结构、合并、术语三组列出候选变更,以及被跳过的类目和原因。卫生审计发现可处理的问题时,计划必须给出对应候选,或说明为什么先不动。不做任何修改。
  3. 预检(preflight)用与普通记忆写入相同的校验,检查每一项拟议写入。
  4. 应用(apply)执行变更,结构治理优先。一次运行最多两项内容变更(新增、改正文、删除或结构性移动),以及十二项纯卫生操作(修剪术语、把节点移出非规范域)。每次运行最多拆分一个过长节点。
  5. 审计(audit)记录改了什么、为什么改。随后 Lore 写入一条日记,包含摘要和叙述。

Dream 整理的是记忆树,不是当天的提示词。Agent 在工作时已经带着完整上下文写记忆,因此 Dream 不再从当天的查询里抽取新记忆。

Dream 会查找以下问题:

  • 落在 project://、core://、preferences:// 之外的域、需要归位到规范域的记忆
  • 只有占位正文、需要从子节点提炼真实抽象的父节点
  • 超过 4000 字、需要压缩为“当前状态摘要 + 历史段落”的记忆
  • 明确的重复或近似重复记忆,合并前后回放受影响的查询
  • 关键词超过 30 个、需要删除重复、近义和泛化词的术语表
  • 被八个以上节点共用、更适合上移到共同父节点的关键词
  • 带日期尾缀的路径,以及错放在 core://projects 下的项目概念

Dream 读取的是过去一天的召回查询,不读取完整对话,也不会写入召回日志。回放是只读的。

Dream 自己应用变更。你写入时适用的优先级(priority)和触发条件检查,同样适用于 Dream 的写入。每项变更都会记录在节点历史中,并附带审阅标记列在日记条目里。

术语修剪

术语关键词是召回入口,不是标签。每个关键词都会单独生成嵌入并进入语义召回,关键词文本同时参与精确匹配、包含匹配和 BM25 文本匹配。关键词无限增长,会把这条记忆拉进与它无关的提示词里。所以 Dream 只做修剪:对关键词超过 30 个的节点,删除重复、近义词和泛化词。

标识符类关键词不同——hash、版本号、host:port 地址、路径、全大写 token,以及带数字的连字符 token。它们只在有人真的输入该标识符时命中,所以 Dream 保留它们,也从不新增。新增其他任何关键词,都需要回放证据证明真实查询确实无法召回该节点。

定时与设置

Dream 默认开启,每天 03:00 运行。它需要一个 LLM:自托管服务器需要 View LLM,Loremem 云服务需要运行时 LLM 配置。在自托管服务器上,没有 View LLM 时,运行会跳过 Agent 循环,因此不做任何修改。

设置默认值作用
dream.enabled开启按计划运行 Dream。关闭即可暂停定时运行。
dream.cron0 3 * * *用 5 段 cron 表达式(分 时 日 月 周)设置开始时间。
dream.auto_approve_changes关闭变更产生时自动标记为已通过。关闭时,每项变更都以待审核开始。
dream.exclude_session_patterns空正则表达式列表。召回查询文本命中任一正则的会话,不会进入 Dream 审阅的召回元数据。适合排除机器人和测试运行。

在自托管控制台中,这些设置位于 设置 → 做梦计划,标签分别为 定时做梦、做梦 Cron、自动通过 Dream 变更 和 Dream 排除会话。在 Loremem 云服务中,请使用 设置 → Dream。

需要了解的几个细节:

  • 在自托管服务器上,cron 表达式按服务器所在时区执行。Docker Compose 读取 .env 中的 TZ,未设置时默认为 Asia/Shanghai,因此请把 TZ 设为你所在的时区。
  • 在自托管服务器上,Lore 每分钟检查一次计划。若服务器在计划时刻未运行,当天的运行就不会执行。无效的 cron 表达式永远不会运行。
  • Loremem 云服务按服务时钟执行计划。

手动运行

在调整 Lore,或导入一批记忆之后,可以手动运行 Dream。

  1. 打开 Dream,选择 立即运行。在 Loremem 云服务中,选择 运行。
  2. 等待运行结束。状态会从 运行中 变为 已完成 或 错误。
  3. 先阅读日记条目,再审阅变更。

自托管服务器在一次运行尚未结束时,不会启动第二次运行。

审阅变更

运行中的每项变更都带有一个审阅标记:

标记含义
待审核默认状态。Dream 已做出变更,你尚未审阅。
已通过你接受了这项变更。自动通过会替你设置此标记。
已忽略你看过这项变更,但没有认可。Loremem 云服务中,对应的按钮和标记都显示为“已知晓”。

在变更上选择 通过 或 忽略,即可设置它的标记。审阅标记只记录你的决定。通过或忽略一项变更并不会撤销它,记忆会保留该变更,直到你回滚或手动修改。

要修正某项变更,在自托管控制台中选择 编辑,打开节点后手动修改。在 Loremem 云服务中,请从 记忆 页面打开该节点。

判断一项变更

在通过之前,先用下表检查每项变更。遇到不满足检查项的变更,应当拒绝或重写。

检查项通过条件
范围变更只解决一个清楚的问题。混合多个主题的变更,应拆分或手动重写。
触发条件质量触发条件(disclosure)描述一个具体情境,并说明何时该出现这条记忆。不使用 OR 逻辑。
术语术语是人们在提示词中真正会输入的词:产品名、别名和错误名。
优先级重要性没有被抬高。0 和 1 只留给核心身份和关键事实。
没有编造事实内容只写源材料支持的内容。
可追溯你能说明变更为何有助于未来的召回,并且日记的审计列出了其依据。

这条记忆没有通过触发条件检查:它的触发条件同时提到了两种情境,因此其中任一情境出现时,它都可能被召回。

URI:        project://checkout_api/webhooks
Priority:   1
Disclosure: When changing refund webhooks or payment webhooks in checkout-api
Glossary:   refund webhook, payment webhook, idempotency key
Content:    Refund webhooks are idempotent by event.id. Tests must replay the same event twice and assert a single refund row.

应拆成两条记忆,分别对应退款 webhook 和支付 webhook。

撤销一次运行

回滚会撤销最近一次运行中的变更。

  • 只能回滚最近一次运行。更早的运行不能整体回滚。
  • 回滚会撤销该次运行中的每项变更,包括你已通过的变更,以及 Dream 删除或移动的术语关键词。
  • 受影响的每个节点都会恢复到运行前的状态。你在运行之后对这些节点做的任何编辑都会被覆盖,因此请先检查。
  • 在自托管控制台中,打开 Dream 页面中最近的一次运行,选择 回滚 并确认。在 Loremem 云服务中,打开最近的一次运行,选择 回滚。

如果只想撤销一项变更,请从节点的历史中回滚该节点:

  • 在自托管控制台中,打开节点的历史,对你要恢复的新增或修改事件选择 回滚,然后确认。只有新增和修改事件可以这样回滚。
  • 在 Loremem 云服务中,节点历史以差异形式显示每次变更。请编辑节点,恢复之前的文本。

安全使用 Dream

注意

Dream 可以新增、修改、移动和删除记忆。在批量通过变更或保持定时运行开启之前,请先备份。

  1. 开启定时运行之前,先验证备份,并在独立环境中测试恢复。参见 备份与恢复。
  2. 先手动运行几次 Dream,逐项审阅变更,再依赖定时计划。
  3. 导入大量记忆时,或嵌入与 LLM 端点不稳定时,暂停定时 Dream。
  4. 在你信任 Dream 的变更之前,保持自动通过关闭。
  5. 每次运行后,尝试两三个真实的召回查询,确认你关心的记忆仍能被召回。