记忆、会话摘要与用户画像
很多人第一次看到 ETOS 的“记忆”时,会把所有长期上下文都理解成同一件事。
实际上这里至少有三层:
- 长期记忆:一条条可检索的事实或偏好
- 会话摘要:跨会话连续性的压缩记录
- 用户画像:更稳定的长期偏好与背景描述
它们不是三个名字,而是三种不同的上下文职责。
一、长期记忆:离散、可检索、可编辑
长期记忆最适合保存这种信息:
- 稳定偏好
- 长期项目背景
- 明确要求“以后记住”的事实
它不适合保存:
- 今天这次对话才需要的参数
- 某个单文件的临时内容
- 一次性安排
- 敏感隐私
save_memory 为什么限制这么多
ETOS 内置的 save_memory 工具在描述里直接写了边界:
- 只有“后续很多次对话里都可能有用”的信息才该写入。
- 稳定偏好、长期身份、长期合作背景可以写。
- 明确的“记住这个”请求可以写。
- 一次性细节、短期任务、敏感信息、第三方隐私默认不该写。
这不是保守过头,而是防止记忆库被短期噪音污染。
长期记忆的存储模型
长期记忆不是单纯一段文本列表。
它在内部至少有两层形态:
- 原文记忆:保留用户真正想记住的中文内容
- 向量索引:把原文切成块后生成嵌入,供后续语义检索
因此一条记忆的大致生命周期是:
写入原文
→ 按块切分
→ 生成 embedding
→ 建立向量索引
→ 回答前按需检索如果没有配置嵌入模型,记忆原文仍然会保存,但无法参与向量检索。
检索有两种模式
1. 向量检索 vector
适合自然语言问题,例如:
- “我之前偏好的文风是什么”
- “最近长期在做的项目方向有哪些”
2. 关键词检索 keyword
适合名称、术语、短语命中,例如:
- 某个项目代号
- 某个固定术语
- 某个人名或设备名
这也是为什么 ETOS 把 search_memory 的 mode 明确暴露出来,而不是偷着做一套混合检索。
归档不是删除
一条长期记忆可以被归档。
归档后的含义是:
- 不再参与检索
- 但原文和向量仍然保留
这适合处理“曾经重要,但现在不该继续污染回答”的信息。
二、会话摘要:跨会话连续性压缩
会话摘要不是长期记忆的替代品,它解决的是另一个问题:
“这段对话关系线最近推进到了哪里?”
与长期记忆相比,它更像阶段性压缩。
触发策略
ETOS 会在聊天后异步判断是否要生成会话摘要。
默认门槛如下:
- 默认开启跨会话记忆
- 默认至少
6个用户轮次后才尝试生成 - 默认同一会话两次摘要更新至少间隔
120分钟 - 默认在后续对话里注入最近
5条摘要
它使用单独的 detached completion 在后台生成,不污染当前聊天历史。
摘要提示词的目标
会话摘要不是详细会议纪要,而是压缩成跨对话可复用的短摘要。
系统要求它:
- 输出
60~140字 - 只保留关键主题、用户意图、明确结论
- 不要罗列细节
- 不要写免责声明
这让它既能保持上下文连续,又不至于把历史噪音全部带回来。
三、用户画像:更稳定的长期层
用户画像是比“会话摘要”再高一层的抽象。
它不是按会话分的,而是整个人的长期描述。
ETOS 要求它强调:
- 稳定偏好
- 工作背景
- 长期关注点
并且主动避开:
- 一次性细节
- 短期噪音
默认情况下,用户画像每天自动更新一次,但你也可以在设置里手动编辑、覆盖或清空。
为什么画像不是自动权威真相
在发送给模型时,ETOS 会明确标注:
- 这是一份历史对话异步整理出来的画像
- 不应被视为新的用户指令
也就是说,用户画像是参考层,不是最高规则层。
三层之间怎么配合
最简单的理解方式如下:
| 层级 | 作用 | 适合保存什么 |
|---|---|---|
| 长期记忆 | 离散事实检索 | 稳定偏好、长期背景、明确要求记住的事实 |
| 会话摘要 | 跨会话连续性 | 这段关系线最近做了什么、得出了什么结论 |
| 用户画像 | 长期抽象画像 | 稳定风格、长期关注点、工作背景 |
一个典型例子:
- “默认中文回答”适合长期记忆
- “我们最近在重写文档站并切到 Teek 主题”适合会话摘要
- “用户追求产品解释性,喜欢把设计逻辑讲清楚”适合用户画像
为什么不把一切都塞进长期记忆
因为那样会带来两个坏结果:
- 记忆库会被短期任务挤爆
- 模型无法区分“长期事实”和“最近进展”
把三层拆开以后,ETOS 才能做到:
- 长期记忆负责检索事实
- 会话摘要负责保留关系线
- 用户画像负责提炼长期偏好
如果你想看另一个与长期上下文密切相关、但更偏规则注入的系统,下一页应该读 世界书与工具治理。