介绍记忆存储服务的系统架构、数据模型、Scope 多租户、适用性评估和性能评测,帮助技术决策者判断产品是否匹配业务场景。
系统架构
记忆存储服务采用全托管 Serverless 架构,用户通过 API 与服务交互,底层资源由平台自动管理。数据流转过程如下:
-
调用
AddMemories接口,传入对话消息(messages)或纯文本(text)。 -
系统将原始消息保存为短期记忆。
-
系统从消息中提取可检索的长期记忆单元,并持久化存储到表格存储。
-
调用
SearchMemories接口时,服务结合语义检索和文本检索能力,并支持 Rerank 排序,返回相关长期记忆。
数据模型
记忆库的数据按以下实体组织。
|
实体 |
说明 |
|
MemoryStore |
记忆库,管理记忆数据的顶层容器 |
|
Memory |
长期记忆,从对话或文本中提取的可检索信息 |
|
Message |
短期记忆,写入的原始会话消息记录 |
MemoryStore
MemoryStore 是记忆库,管理记忆数据的顶层容器。先创建记忆库,再向记忆库写入消息、检索记忆或查询审计记录。
常见用法:
-
按应用创建独立记忆库。
-
按环境创建独立记忆库,例如开发、测试、生产。
-
按业务线创建独立记忆库。
记忆库名称只能包含字母、数字和下划线,最长 32 个字符。
Memory
Memory 是长期记忆。服务在写入对话消息或文本后,会提取可长期保存和检索的信息,并生成记忆单元。
一条长期记忆通常包含:
-
记忆 ID。
-
记忆文本。
-
Scope。
-
元数据。
-
创建时间。
-
版本和替换关系等管理信息。
长期记忆可通过 SearchMemories 检索,也可通过 ListMemories、GetMemory、UpdateMemory 和 DeleteMemory 管理。
Message
Message 是短期记忆,即写入记忆库的原始会话消息记录。AddMemories 写入时传入的 messages 会被保存为原始消息,可通过 ListMemoryStoreMessages 查询。
短期记忆接口要求填写完整 Scope,即 appId、tenantId、agentId 和 runId 均需提供,且不允许使用通配符。
记忆写入
记忆服务支持以下两种方式写入记忆:
-
对话消息写入:通过
AddMemories接口传入messages数组。服务保存原始消息为短期记忆,并从中提取长期记忆单元。 -
文本写入:通过
AddMemories接口传入text字段,直接提交纯文本内容。服务从文本中提取可检索的长期记忆。
写入时需指定 Scope 信息,其中 appId 必填,tenantId、agentId、runId 为空时自动补为 __default__。写入不允许使用通配符 *。
写入默认异步执行(sync=false):原始消息先落库并可立即作为短期记忆查询,长期记忆抽取在后台进行。可通过 AddMemories 返回的 requestId,调用 GetMemoryTask 跟踪抽取任务的状态与产出的记忆单元。记忆库还支持自定义抽取指令(extractInstructions),在创建或更新记忆库时设置,注入抽取提示词以引导该库的长期记忆抽取聚焦业务关键信息。
记忆检索
SearchMemories 支持使用自然语言检索长期记忆。服务结合语义检索和文本检索能力,并支持 Rerank 排序,默认启用 Rerank。
检索时 appId 和 tenantId 为必填字段,agentId 和 runId 可使用通配符 * 扩大检索范围。
检索结果同时返回融合得分 score 与归一化相似度 similarity。可通过 minSimilarity 过滤低相关结果。设置 includeEvidence=true,可在结果中附带命中记忆对应的原始消息片段(evidence),便于增强答题模型的可解释性。
元数据
长期记忆支持附加元数据(metadata)。元数据可用于存储业务自定义信息,例如记忆来源、标签和优先级等。元数据随记忆单元一起存储,检索结果中会返回对应的元数据字段。
请求审计
服务记录记忆库请求,可通过 ListMemoryStoreRequests 查询请求日志。审计记录包含操作类型、响应状态、延迟和失败原因等字段,适用于排查写入、检索和管理操作中的问题。
记忆整理(Dream)
记忆整理(Dream)是对记忆库中已有数据进行二次提炼的异步能力。服务在后台分析长期记忆与原始消息,产出可应用的整理动作。整理对象分为三类:
-
记忆整理(
memory):对长期记忆去重、改写、合并,并删除过时项,对应ADD、UPDATE、DELETE、MERGE、NOOP动作。 -
技能提取(
skill):从历史交互中提取可复用技能,对应EMIT_SKILL动作。 -
画像提取(
profile):沉淀结构化用户画像,对应EMIT_PROFILE动作。
整理支持两种模式:proposal 模式生成提案,由人工或程序确认后应用;safe_auto 模式在达到置信度阈值时自动应用。
异步任务与可观测性
记忆写入与记忆整理均为异步任务,服务提供配套的查询能力:
-
GetMemoryTask与ListMemoryTasks:查询记忆抽取任务的状态与产出。 -
GetMemoryDreamTask、ListMemoryDreamTasks与ListMemoryDreamActions:查询记忆整理任务与动作。 -
ListMemoryStoreScopes:列出记忆库中已存在的 Scope,便于发现某应用或租户下有哪些 Agent 和会话产生过记忆。 -
ListMemoryStoreRequests:请求审计日志查询。
Scope 多租户
Scope 用于表示记忆数据的归属和隔离边界。记忆服务使用 appId / tenantId / agentId / runId 四级 Scope。
|
字段 |
说明 |
|
|
应用标识,通常对应一个业务应用或产品 |
|
|
租户或用户标识 |
|
|
Agent 标识 |
|
|
会话、运行或任务标识 |
Scope 的层级为:
appId > tenantId > agentId > runId
核心规则:
-
写入时,
appId必填,其他字段为空时补为__default__。写入不允许使用通配符*。 -
检索长期记忆时,
appId和tenantId必填,agentId和runId可使用*实现跨 Agent 或跨会话检索。 -
查询短期记忆时,四个字段均为必填且不允许通配符。
检索示例:
-
agentId=""、runId="":检索该租户下所有 Agent、所有会话的记忆。 -
agentId="sales_assistant"、runId="*":检索该租户下指定 Agent 的所有会话记忆。
常见检索范围示例
|
检索范围 |
Scope 设置 |
适用场景 |
|
当前会话内 |
|
只希望使用当前会话历史 |
|
跨会话 |
|
同一 Agent 在多次会话中复用用户偏好 |
|
跨 Agent、跨会话 |
|
多个 Agent 共享用户记忆 |
Scope 与多记忆库的选择
MemoryStore 支持按应用、环境或业务线创建独立记忆库。当数据属于同一应用中的不同用户或 Agent 时,推荐使用 Scope 在同一记忆库内隔离,管理成本更低,且支持通配符跨 Scope 联合检索。当不同业务域需要完全独立的数据空间时,建议创建多个记忆库。
适用性评估
推荐使用的场景:
-
智能客服、销售助手、企业助手等对话型应用。
-
需要跨会话记住用户偏好、配置和历史选择的个人助理。
-
多 Agent 协作场景下的共享记忆管理。
-
需要保留原始会话记录并支持审计排查的 Agent 应用。
-
需要在大规模租户和大量记忆数据下保持稳定检索性能的生产系统。
需要评估的场景:
-
对记忆写入实时性要求极高的场景(记忆提取是异步过程,存在处理延迟)。
-
需要自定义记忆提取策略的场景(当前为系统自动提取)。
不推荐的场景:
-
纯结构化数据查询(建议使用表格存储宽表模型或关系型数据库)。
-
仅需简单的上下文窗口管理、不需要持久化记忆(可直接使用 LLM 的上下文窗口)。
性能评测结果
从检索准确率、检索延时和存储规模三个维度对表格存储记忆服务进行了评测,并与业界主流记忆方案 Mem0 进行了对比。
|
维度 |
表格存储记忆服务 |
行业对比 |
|
综合检索准确率 |
88.25% |
较 Mem0(64.20%)提升约 37.4% |
|
P50 检索延时 |
~155 ms |
同类方案通常 200-500 ms,降低约 75% |
|
已验证存储规模 |
亿级别条记忆,可水平扩展无上限 |
同类方案多为百万至千万级 |
|
Token 节省 |
95% |
较 Plan A(全量注入)节省约 95% |
上述数据用于展示服务能力边界,实际效果会受到数据规模、查询方式、网络环境、模型配置和业务数据分布影响。以下是各维度的详细评测。
检索准确率
评测基准:LoCoMo 数据集
LoCoMo 是当前记忆系统评测领域最具代表性的基准之一。与早期评测集只覆盖 3-5 轮短对话不同,LoCoMo 平均每条测试数据包含 300 轮对话、跨 35 个会话,贴近真实用户与 AI 助手长期交互的场景。
LoCoMo 原始定义了五类推理问答(单跳、多跳、时间推理、开放领域、对抗性问题),基于其中四类进行了评测。
|
评测维度 |
含义 |
日常对话中的典型场景 |
|
单跳推理 |
从单次会话中直接定位事实 |
"我上次说我喜欢喝什么来着?" |
|
多跳推理 |
综合多个会话中的信息得出答案 |
"根据我的饮食偏好和体检报告,推荐一份午餐" |
|
时间推理 |
理解时间线索和先后顺序 |
"我先说想换工作,后来又说留下了,现在的想法是?" |
|
开放领域 |
结合用户历史信息与外部常识推理 |
"我说过我对花生过敏,沙爹酱能吃吗?" |
评测结果:
|
记忆库方案 |
单跳推理 |
多跳推理 |
时间推理 |
开放领域 |
综合准确率 |
|
记忆存储服务 |
88.94% |
90.78% |
88.16% |
75.00% |
88.25% |
|
Mem0 |
68.97% |
61.70% |
58.26% |
50.00% |
64.20% |
在四类推理上表格存储记忆服务的准确率均高于 Mem0:单跳推理(直接检索单条事实)高出约 20 个百分点;多跳推理和时间推理场景差距更大,分别高出约 29 和 30 个百分点——当用户的问题需要 AI 把多次对话串联起来、理解时间先后做出判断时,表格存储记忆服务的检索质量明显更高。
口径说明:表格存储记忆服务的评测数据来自 LoCoMo 全量 10 段对话、4 类推理题共 1540 题;答题采用 Mem0 官方最新的 LoCoMo 答题 Prompt,答题模型与裁判模型均为 qwen-max,并采用 Mem0 提供的宽松裁判。Mem0 的对比数据来自其公开评测结果。
检索延时
测试条件为单记忆库 120 万租户、1 亿+ 条记忆数据的超大规模场景,且不开启Rerank的场景。
|
TopK |
平均延时 |
P50 延时 |
P95 延时 |
|
5 |
164 ms |
155 ms |
269 ms |
|
10 |
198 ms |
174 ms |
288 ms |
|
50 |
234 ms |
222 ms |
384 ms |
亿级数据量下 P50 延时稳定在 200 ms 左右,即使返回 Top50 结果,P95 也在 384 ms 以内。换个直观说法:即使一个百万日活 App 的所有用户记忆汇总到一个库里,每次对话中的记忆检索依然能在 200 毫秒内完成,用户几乎感知不到等待。如果开启Rerank,检索延时会增长200-300毫秒。
存储规模
单记忆库已验证支持 120 万租户、1 亿+ 条记忆的存储与检索。基于表格存储的分布式架构,系统支持水平扩展,无理论上限——无需按租户数量做分库分表的容量规划,业务增长时存储层自动跟上。
Token 成本
Plan A(每轮注入完整对话历史)vs Plan B(一次性抽取 + 每轮只注入检索到的记忆)。对话 Token 通过模型服务返回的 usage 字段精确统计;抽取 Token 使用生产环境的抽取 Prompt 复现计算,数据偏保守。
|
评测维度(基于 LoCoMo 4 段对话) |
Plan A |
Plan B |
|
单次对话 Token:单题平均对话 token |
24,985 |
823 |
|
记忆抽取 Token:一次性抽取 token(4 段) |
— |
320,667 |
|
全量对话含上下文 Token:按 4 段对话共 827 题外推的总消耗 |
20,662,543 |
1,001,153 |
|
纯对话节省 |
— |
96.7% |
|
含抽取总节省 |
— |
95.1% |