概念介绍

时间感知

记忆如何随时间更新、保留历史,并在检索时理解"现在"和"过去"。

我们将记忆视为会随时间演化的对象,而不是一段静态文本。用户的偏好、状态和事实可能变化;一次发生的事件也需要保留发生时间。拥有时间感知,MemOS 能知道什么时候应该使用当前最新认知,什么时候应该回溯历史版本。


1. 解决了什么问题

新旧信息冲突

  • 用户先说“我喜欢吃苹果”,后来又说“我不喜欢吃苹果了”。
  • MemOS 处理方式:自动识别前后变化,检索时只返回当前有效认知“不喜欢”。历史版本不会被删除,需要时仍可回溯。

问“现在”和“以前”应该得到不同答案

  • 用户之前住在北京,后来搬到上海。
  • MemOS 处理方式:理解问题中的时间线索,当用户问“我现在住在哪”,能够检索到上海;问“我以前住在哪”,能够检索到北京。

事件不应该被强行合并

  • 去年国庆去了西安,今年五一去了杭州。
  • MemOS 处理方式:保留每次事件的完整信息,不只是合并成“用户喜欢旅游”。问“我最近去哪旅游了”,能够优先召回去了杭州。

2. 处理流程

写入时:用 chat_time 锚定历史时间

实时对话通常不需要传时间,MemOS 会使用消息传入时间。如果你需要导入历史数据,建议传入 chat_time,让记忆锚定到事件真正发生的时间。

{
  "user_id": "memos_user_123",
  "messages": [
    { "role": "user", "content": "我喜欢吃辣。", "chat_time": "2025-09-12 08:00:00" },
    { "role": "user", "content": "我现在不太能吃重油重辣了,更喜欢清爽一点。", "chat_time": "2025-09-25 12:00:00" }
  ]
}

两类记忆的时间处理

MemOS 对记忆做不同的处理:

  • 可能会变化的状态,例如住在哪、喜欢什么、当前阶段目标,保留不同时间版本,便于检索时技能召回现在,又能召回历史。
  • 一次发生的事件,例如何时去了哪、做了什么,保留每次事件细节,便于检索时召回完整信息。

检索时:理解问题中的时间指向

  • 如果没有明确时间指向:正常检索,优先返回当前有效记忆。
  • 如果带有时间线索:理解时间指向,选择对应版本或事件。

如果你已经知道明确时间范围,也可以配合 记忆过滤器 使用 create_time 缩小候选记忆:

{
  "user_id": "memos_user_123",
  "query": "整理我 2025 年 12 月和阅读相关的记录",
  "filter": {
    "and": [
      { "create_time": { "gte": "2025-12-01" } }
    ]
  }
}

3. 示例体验

你可以尝试写入一组带有时间信息的事件:

{
  "user_id": "test_user",
  "messages": [
    { "role": "user", "content": "我住在北京。", "chat_time": "2025-01-10 10:00:00" },
    { "role": "user", "content": "我搬到上海了。", "chat_time": "2025-06-01 10:00:00" },
    { "role": "user", "content": "去年国庆我去西安旅游了。", "chat_time": "2025-10-08 10:00:00" },
    { "role": "user", "content": "今年五一我去杭州旅游了。", "chat_time": "2026-05-02 10:00:00" }
  ]
}
类型搜索 query期望结果
当前状态"我现在住在哪?"上海,使用当前最新状态
历史状态"我以前住在哪?"北京,回溯历史版本
截止当下"我去哪旅游过?"西安和杭州,杭州排前

4. 使用建议

  • 导入历史数据时传入准确的 chat_time,否则历史事件可能被误认为刚发生。
  • 对"当前状态"类信息,让用户新表达自然写入即可,系统会自动更新当前认知。

5. 下一步

Add Message

写入带时间的历史消息

Search Memory

检索和验证时间相关记忆