Mem0 如何用 Temporal Reasoning 处理 yesterday、last week 等时间相关查询
【免费下载链接】embedchainThe Memory Layer for AI Agents - Drop-in memory infrastructure for AI agents and apps. Context that persists. Built for production.项目地址: https://gitcode.com/GitHub_Trending/em/embedchain
如果你用 Mem0 给 Agent 存了大量记忆,会遇到一个典型问题:用户问“我上周在哪开的会”时,检索只按语义相似度排序,而“昨天在巴黎开会”和“上周在东京开会”两条记忆在语义上几乎一样,排序无法区分。Mem0 Platform v3 的 Temporal Reasoning 就是解决这个问题的:它在检索时自动比较查询里的时间表达与记忆中的事件日期,对日期匹配的记忆加一个排序加分(temporal boost),不改写记忆本身。
前提条件:Temporal Reasoning 只在 Mem0 Platform v3 上自动运行,OSS SDK 不提供该功能。需要 Mem0 Platform 账户和 API key,Python 3.10+ 或 Node.js 18+。功能说明见 Temporal Reasoning 文档。
机制:时间表达如何参与排序
查询中可以直接使用yesterday、last week、tomorrow、currently、as of March 2025这类时间表达。Mem0 会把它们与存储记忆中提取出的日期和日期范围做比较,命中事件日期的记忆获得加分。
官方文档给的例子是:用户maya-demo存了三条记忆——
- “Yesterday I met Maya at the Orion conference in Paris.”
- “Last week I met Maya at the Orion conference in Tokyo.”
- “Last year I met Maya at the Orion conference in Lisbon.”
此时搜索Which city did I meet Maya in at the Orion conference last week?,Tokyo 那条记忆获得 temporal boost 并排在第一位(这是文档示例结果,实际排序取决于你的数据)。
检索返回的还是普通的记忆结果,只是用 temporal boost 重新排序,不返回额外的时间字段。
准备:安装 SDK 并初始化客户端
按 Quickstart 安装并设置 API key。Python 示例如下,your-api-key替换为你在 Platform 控制台获取的 key:
pip install mem0aifrom mem0 import MemoryClient client = MemoryClient(api_key="your-api-key")JavaScript 对应:
npm install mem0aiimport MemoryClient from 'mem0ai'; const client = new MemoryClient({ apiKey: 'your-api-key' });注意这里用的是 Platform 客户端MemoryClient。如果用的是 OSS 侧的Memory类并传入reference_date/referenceDate,会收到明确报错:The reference_date parameter is not supported by the OSS Memory SDK.,这可以从 OSS 侧的错误处理 中得到确认。
写入带时间信息的记忆
用标准的add写入对话,时间信息写在消息内容里即可:
memories = [ "Yesterday I met Maya at the Orion conference in Paris.", "Last week I met Maya at the Orion conference in Tokyo.", "Last year I met Maya at the Orion conference in Lisbon.", ] for text in memories: messages = [{"role": "user", "content": text}] client.add(messages, user_id="maya-demo")client.add的用法与 Quickstart 中的示例一致,user_id是实体作用域标识,搜索时要用同一个值过滤。
新记忆的日期通常几秒内就会影响检索结果,无需等待或手动触发。
可选:导入历史对话时用 timestamp 保留原始时间
如果你是批量导入过去的对话记录,created_at会是导入时间而不是对话发生时间。Memory Timestamps 功能 允许在添加时指定 Unix 时间戳(自 1970-01-01 UTC 起的秒数),覆盖默认时间:
from datetime import datetime, timedelta five_days_ago = datetime.now() - timedelta(days=5) unix_timestamp = int(five_days_ago.timestamp()) messages = [ {"role": "user", "content": "I'm travelling to SF"} ] client.add(messages, user_id="user1", timestamp=unix_timestamp)JavaScript 中参数名同为timestamp:
const messages = [ {"role": "user", "content": "I'm travelling to SF"} ]; client.add(messages, { userId: "user1", timestamp: unixTimestamp });对应关系总结(来自 Temporal Reasoning 文档):
| 操作 | Python | TypeScript | 用途 |
|---|---|---|---|
| 添加记忆 | timestamp | timestamp | 保留导入对话的原始时间 |
| 搜索记忆 | reference_date | referenceDate | 模拟在某个指定日期时间搜索 |
执行时间相关搜索
直接调用client.search,查询文本里带上时间表达,filters里传实体 ID:
results = client.search( "Which city did I meet Maya in at the Orion conference last week?", filters={"user_id": "maya-demo"}, )const results = await client.search( "Which city did I meet Maya in at the Orion conference last week?", { filters: { user_id: "maya-demo" } } );按 Search Memories API 的约束:实体 ID(user_id、agent_id、app_id、run_id)必须放在filters对象内,顶层传会被 400 拒绝;至少要传一个实体 ID。返回结果中每条记忆的score是语义、BM25、实体匹配多路信号融合后的[0, 1]值。
验证方式:检查返回的results列表顺序。时间匹配的记忆(上例是 Tokyo 那条)应排在第一位。文档明确说明返回的是“usual memory results, reordered using the temporal boost”——即字段结构与普通搜索一致,只有顺序变化。
用 reference_date 模拟历史时间点
Temporal Reasoning 的“当前时间”默认是搜索发起的时刻。如果需要复现或审计过去某个时间点会命中什么记忆,传reference_date,Mem0 会把它当作那次搜索的当前时间:
results = client.search( "What happened last week?", filters={"user_id": "user-123"}, reference_date="2025-03-21T00:00:00Z", )const results = await client.search("What happened last week?", { filters: { user_id: "user-123" }, referenceDate: "2025-03-21T00:00:00Z", });格式说明来自 SDK 类型定义(SearchMemoryOptions):reference_date接受YYYY-MM-DD或 Unix timestamp,上述带T00:00:00Z的写法是文档原样给出的示例。TypeScript 客户端把referenceDate序列化为 API 请求体中的reference_date,可参考 客户端测试 确认这一映射。
限制与边界
- 仅 Mem0 Platform v3 生效,OSS SDK 没有 Temporal Reasoning,传入时间参数会直接报错而不是静默忽略。
- 时间表达是查询文本的一部分,机制文档只列出了
yesterday、last week、tomorrow、currently、as of March 2025这几个例子,没有给出完整支持词表;如果你的表达不生效,先换成文档中列出的形式再验证。 - 该功能不返回独立的“时间匹配分数”,只能在结果顺序上体现;
score字段仍是融合后的综合分数。 - 新记忆的日期生效需要几秒,刚写入立即搜索可能还没体现时间加分。
需要进一步查看检索参数(top_k、threshold、rerank等默认值)时,参考 Search Memories API reference;涉及记忆导入时间保真的完整示例见 Memory Timestamps。
【免费下载链接】embedchainThe Memory Layer for AI Agents - Drop-in memory infrastructure for AI agents and apps. Context that persists. Built for production.项目地址: https://gitcode.com/GitHub_Trending/em/embedchain
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考