用 MemOS 管理跨会话偏好与临时指令
文章通过报告发送渠道的变化,说明 Agent 如何区分长期偏好、偏好更新与单次任务指令。MemOS 用于保存、检索、更新和删除偏好,避免一次性要求污染后续会话。
AI 深度解读
用户先把周报默认发送方式设为 email,后来改成 Slack,某次又临时要求「这份发邮件,我要转给客户」。助手这次该发邮件,下次仍该走 Slack。跨会话记忆真正难的,是把长期偏好、临时指令和历史记录分清楚。
MemOS 给出的方案,是把可检索、可修改的记忆放在模型外部,再由应用结合当前任务决定怎么执行。这篇值得读的地方,是它串起了写入、检索、纠错、异步处理和删除的完整流程;但原文没有实测数据,不能据此认定它已经解决了所有记忆冲突。
记住一句话,为什么还要判断它管多久
原文用三种表达划出了边界:
- 「Slack 可以吗?」是在讨论方案,不能直接当成偏好变更。
- 「以后都用 Slack」是在修改长期默认值。
- 「这份用 email」只约束当前报告,任务结束后不该覆盖默认值。
记忆系统需要保存信息,应用还需要判断信息的适用范围。
MemOS Cloud 可以从用户陈述和交互历史中提取事实、偏好,并在新信息写入时检查重复或冲突。不过,检索到偏好之后,当前请求与默认值谁优先,仍由应用规则决定。报告最终也是应用自己的 email 或 Slack 集成发送,记忆服务负责提供决策所需的信息。
这里有一个容易漏掉的区别:临时要求可以留在任务历史里,却不应该因此变成新的默认偏好。保存对话和更新偏好,是两件不同的事。
原文还区分了开源框架与托管服务。MemOS v2.0 开源架构把记忆处理拆成多个组件,由 handlers 协调;文中的周报流程使用的是 MemOS Cloud API。不能把开源架构中的组件直接当成 Cloud API 的部署说明。原文也没有展开组件清单或具体配置。
跨会话取回偏好,身份和上下文怎么传
写入从 Add Message API 开始。典型请求包含 user_id、conversation_id 和 messages 数组,每条消息带有 role、content。MemOS 从这些输入里提取记忆,而不是要求应用手动整理所有偏好记录。
新会话开始后,应用用同一个 user_id 调用 Search Memory API,围绕当前任务构造查询。例如,生成周报之前,先查用户当前的投递偏好,再把相关结果和本次请求一起交给模型。
搜索结合语义检索、关键词检索、排序和过滤,默认包含事实与偏好记忆。这样,应用可以直接寻找「周报现在发到哪里」,不必每次把旧对话全部塞进上下文。
标识的使用也有讲究:user_id 应跨会话保持稳定,不同会话使用各自的 conversation_id。搜索时带上 conversation_id,会提高该会话记忆的权重,同时仍允许检索用户的历史记忆。它是排序上的倾斜,不能理解成只搜索当前会话。
对于多用户应用,后端应从已认证账号确定用户 ID,并执行权限检查。即使系统提供用户与 agent 的记忆边界,也不能让前端随意提交一个 user_id 就决定读取谁的数据。
偏好变更则有三条路径:新增消息时处理冲突;已知记录时,用 Update Memory 和 memory_id 修改内容或标题;用户在对话中纠正时,提交 user_id、conversation_id、feedback_content,由服务结合会话寻找相关记忆。
原文没有给出完整请求代码、接口路径或响应结构,因此这些内容足以帮助理解流程,还不足以直接照抄接入。
修改后立刻使用、删除后不再出现,靠什么保证
MemOS Cloud 默认异步处理新增消息。初始处理阶段会让近期消息进入可检索范围,后续精炼继续在后台进行,应用可以拿返回的 task_id 调用 task-status API 跟踪完成状态。
这会带来一个实际问题:用户刚说完「以后走 Slack」,马上要求发送下一份报告,检索结果可能还没有完成更新。
原文建议把最新指令保留在当前上下文中,等待记忆处理继续进行。确实需要等写入完成的流程,也可以在添加消息时使用同步模式,但文中没有提供具体参数。
最新指令不能只依赖后台记忆及时更新。
时间也参与判断。MemOS Cloud 会保留变化信息的历史版本,并利用时间线索检索。「这周发哪里」需要当前偏好,「以前默认发哪里」需要旧版本。导入历史对话时,可以传入 chat_time,保留原始发生时间。至于多条矛盾信息如何确定优先级,原文没有讲清楚。
删除同样需要区分范围。Delete Memory 可以通过 memory_ids 删除指定记忆,也可以通过 user_id 清除当前项目中该用户的记忆。忘掉周报投递偏好,与清空用户全部记忆,是不同操作。
删除后还要再次搜索验证。如果应用保留了摘要或源对话,也应按用户要求处理相关记录,避免后续导入又把偏好提取回来。没有其他投递指令时,助手应该重新询问,而不是猜一个默认值。
我的判断
我认同它把可变偏好放在模型外部的选择。原文区分了三种记忆:外部保存、可检索更新的明文记忆(Plaintext memory),包括 KV caches 等运行状态的激活记忆(Activation memory),以及模型权重里的参数记忆(Parametric memory)。
周报投递偏好需要修改、追溯和删除,外部存储很合适。MemCube 把内容与元数据组织在一起,开源 KV-cache 模块则支持推理时复用缓存上下文;两者不能混为同一种偏好存储能力。
但对只有几个明确设置项的产品,数据库字段加业务规则通常更直接。让用户在设置页选择 email 或 Slack,比从自然语言里推断更容易检查。MemOS 更有吸引力的前提,是偏好散落在多轮对话里,种类也难以提前穷举。
原文没有给出提取准确率、检索延迟、成本或与普通数据库方案的对照。它提供的是架构说明和验证建议,不能当成效果评测。尤其是「讨论是否被误存为偏好」「一次性请求是否污染默认值」,都需要应用自己验证。
它的排查思路倒很实用:对照原始指令、处理状态、检索结果和最终传给模型的上下文。这样才能判断错误发生在提取、选择,还是应用阶段。
能拿来做什么
- 在前端设置页保留明确的偏好入口,并在 Node 后端统一处理当前任务覆盖默认值的规则。自然语言修改与页面修改应指向同一套有效偏好,避免两边各存一份。
- 做一组连续会话验收:先保存 email,再改成 Slack,临时要求一次 email,最后确认下一份仍走 Slack。同时分别检查检索结果和助手行为。
- 在 Node 编排层保留尚未完成持久化的最新指令,并跟踪
task_id。需要立即执行的任务,应拿到用户刚刚表达的要求。 - 把跨用户检索和删除后新会话检索纳入验收。删除功能还要检查摘要、源对话及后续导入路径,确认被删除的偏好不会重新生成。