Skip to content

五层记忆:分身记得住,
又不把 A 客户的事说给 B ​

一句话结论:记忆不是"存得越多越好",是"分层对了才安全"。五层记忆把上下文、偏好、历史、行为模式、长任务结论切开,每层只管自己的边界——记住该记的,忘掉该忘的,才不会把上一家客户的事说给下一家。

先把一个最常见的误判说掉:很多人觉得"给 AI 加记忆"就是把聊天记录全塞进一个向量库,下次检索出来拼进提示词。这种做法前两周很香,第三周就开始串台——它分不清哪些事属于哪个项目、哪段话是临时的、哪段是永久的。

记忆要分层,是因为不同信息的生命周期和可见范围根本不一样。把一周的临时草稿和用户的长期偏好放一个筐里,检索时必定搅在一起。

五层分别管什么 ​

层作用域生命周期典型内容
L1 上下文(Context)当前会话会话结束即清当前轮对话、临时上下文
L2 偏好(Preference)跨会话持久习惯、偏好设置
L3 历史(History)跨会话持久,写入后异步向量化历史对话、决策记录
L4 行为模式(Pattern)跨会话持久,随使用提炼稳定工作模式、常用路径
L5 长任务结论(LongTask)跨会话、账户级持久,仅写终态任务名 + 终态 + 摘要 ≤500 字符的薄结论(不存过程、不做向量化)

L1–L4 这四层存储层不是四个独立数据库,是四条边界规则:什么能进、能留多久、谁看得见。L5 是另立的薄层长任务结论,不在这四条边界规则里,只写任务终态。一条信息该进哪层,取决于它的生命周期和可见范围,不是"统统存下来再说"。

向量检索不是一层记忆。 它是 L3 历史层的检索机制:对话写入 L3 后,后台异步生成 embedding 与 Topic / Entities / Actions 结构化字段,供语义检索和关键词检索使用。L1–L4 是四个持续沉淀的存储层,L5 是另立的薄层长任务结论——它不属于 L1–L4 的存储体系,也不承担向量检索,只是任务终态的一条结论。

最容易踩的两条线 ​

第一,跨会话隔离不能省。 一条记忆如果不标清它属于哪个用户、哪个会话,检索时就会"串台"。实现上要让 id 绑定到字符串标识(而不是裸数字),检索时按作用域过滤——L1 只属于当前会话,L2 / L3 / L4 不得把上一场对话的临时上下文带进来。这条线省了,迟早出"它怎么知道我昨天跟别的客户聊了什么"的事故。

第二,截断要按字符,不是字节。 中文是多字节编码,按字节硬截断会把一个汉字切在多字节中间,模型拿到的是非法 UTF-8 的残尾,轻则乱码,重则反复重读、反复写脚本,最后触发护栏收工。正确做法是按 rune(字符)截断,保证切出来的是完整字符。这条坑我们实打实踩过,根因在工具返回值,不在提示词。

向量层的两件实事 ​

L3 不是"把所有东西都嵌进去"。两点很关键:

  • 维度固定。 用的嵌入模型是 1024 维,写入和查询必须同维,否则语义空间对不上,检索出来的东西牛头不对马嘴。
  • 改完要重建索引。 全文检索(FTS5)的索引在内容变更后必须 rebuild,否则新写入的内容查不到——看起来像"记忆丢了",其实是索引没更新。

五层怎么协作 ​

一次"记住并召回"的全过程是这样的:新信息按生命周期落进对应层;用户提问时,L1 先看当前会话有没有,没有再让 L3 做语义 + 关键词检索,命中后按 L2 / L4 的作用域过滤掉不该看的,最后才拼进上下文。L5 长任务结论作为【长任务】段单独渲染,供智能体进化参考,不参与语义检索与跨会话召回。任何一层越权,都是串台或泄露的种子。

L4 行为模式只提供"你通常怎么做"的参考,不携带具体客户的原始内容——这是它和 L3 历史的分工。

一个判断原则 ​

加一层记忆前先问:这条信息的生命周期是多久?该谁看见?如果答不上来,就别急着存。

L5 长任务层(薄层)已随《Lyncore 设计蓝图》任务包落地:任务终态由 worker 写一条结论(任务名 + 终态 + 摘要 ≤500 字符),不存过程、不做向量化,供智能体进化参考。它与 L1–L4 是不同性质的两类——L1–L4 是持续沉淀的存储层,L5 是任务级的薄结论层,不是"第五个存储层",也不承担向量检索。

相关阅读:记忆系统 · 知识库