架构与技术选型

更新时间:
复制 MD 格式

介绍记忆存储服务的系统架构、数据模型、Scope 多租户、适用性评估和性能评测,帮助技术决策者判断产品是否匹配业务场景。

系统架构

记忆存储服务采用全托管 Serverless 架构,用户通过 API 与服务交互,底层资源由平台自动管理。数据流转过程如下:

  1. 调用 AddMemories 接口,传入对话消息(messages)或纯文本(text)。

  2. 系统将原始消息保存为短期记忆。

  3. 系统从消息中提取可检索的长期记忆单元,并持久化存储到表格存储。

  4. 调用 SearchMemories 接口时,服务结合语义检索和文本检索能力,并支持 Rerank 排序,返回相关长期记忆。

数据模型

记忆库的数据按以下实体组织。

实体

说明

MemoryStore

记忆库,管理记忆数据的顶层容器

Memory

长期记忆,从对话或文本中提取的可检索信息

Message

短期记忆,写入的原始会话消息记录

MemoryStore

MemoryStore 是记忆库,管理记忆数据的顶层容器。先创建记忆库,再向记忆库写入消息、检索记忆或查询审计记录。

常见用法:

  • 按应用创建独立记忆库。

  • 按环境创建独立记忆库,例如开发、测试、生产。

  • 按业务线创建独立记忆库。

记忆库名称只能包含字母、数字和下划线,最长 32 个字符。

Memory

Memory 是长期记忆。服务在写入对话消息或文本后,会提取可长期保存和检索的信息,并生成记忆单元。

一条长期记忆通常包含:

  • 记忆 ID。

  • 记忆文本。

  • Scope。

  • 元数据。

  • 创建时间。

  • 版本和替换关系等管理信息。

长期记忆可通过 SearchMemories 检索,也可通过 ListMemoriesGetMemoryUpdateMemoryDeleteMemory 管理。

Message

Message 是短期记忆,即写入记忆库的原始会话消息记录。AddMemories 写入时传入的 messages 会被保存为原始消息,可通过 ListMemoryStoreMessages 查询。

短期记忆接口要求填写完整 Scope,即 appIdtenantIdagentIdrunId 均需提供,且不允许使用通配符。

记忆写入

记忆服务支持以下两种方式写入记忆:

  • 对话消息写入:通过 AddMemories 接口传入 messages 数组。服务保存原始消息为短期记忆,并从中提取长期记忆单元。

  • 文本写入:通过 AddMemories 接口传入 text 字段,直接提交纯文本内容。服务从文本中提取可检索的长期记忆。

写入时需指定 Scope 信息,其中 appId 必填,tenantIdagentIdrunId 为空时自动补为 __default__。写入不允许使用通配符 *

写入默认异步执行(sync=false):原始消息先落库并可立即作为短期记忆查询,长期记忆抽取在后台进行。可通过 AddMemories 返回的 requestId,调用 GetMemoryTask 跟踪抽取任务的状态与产出的记忆单元。记忆库还支持自定义抽取指令(extractInstructions),在创建或更新记忆库时设置,注入抽取提示词以引导该库的长期记忆抽取聚焦业务关键信息。

记忆检索

SearchMemories 支持使用自然语言检索长期记忆。服务结合语义检索和文本检索能力,并支持 Rerank 排序,默认启用 Rerank。

检索时 appIdtenantId 为必填字段,agentIdrunId 可使用通配符 * 扩大检索范围。

检索结果同时返回融合得分 score 与归一化相似度 similarity。可通过 minSimilarity 过滤低相关结果。设置 includeEvidence=true,可在结果中附带命中记忆对应的原始消息片段(evidence),便于增强答题模型的可解释性。

元数据

长期记忆支持附加元数据(metadata)。元数据可用于存储业务自定义信息,例如记忆来源、标签和优先级等。元数据随记忆单元一起存储,检索结果中会返回对应的元数据字段。

请求审计

服务记录记忆库请求,可通过 ListMemoryStoreRequests 查询请求日志。审计记录包含操作类型、响应状态、延迟和失败原因等字段,适用于排查写入、检索和管理操作中的问题。

记忆整理(Dream)

记忆整理(Dream)是对记忆库中已有数据进行二次提炼的异步能力。服务在后台分析长期记忆与原始消息,产出可应用的整理动作。整理对象分为三类:

  • 记忆整理(memory:对长期记忆去重、改写、合并,并删除过时项,对应 ADDUPDATEDELETEMERGENOOP 动作。

  • 技能提取(skill:从历史交互中提取可复用技能,对应 EMIT_SKILL 动作。

  • 画像提取(profile:沉淀结构化用户画像,对应 EMIT_PROFILE 动作。

整理支持两种模式:proposal 模式生成提案,由人工或程序确认后应用;safe_auto 模式在达到置信度阈值时自动应用。

异步任务与可观测性

记忆写入与记忆整理均为异步任务,服务提供配套的查询能力:

  • GetMemoryTaskListMemoryTasks:查询记忆抽取任务的状态与产出。

  • GetMemoryDreamTaskListMemoryDreamTasksListMemoryDreamActions:查询记忆整理任务与动作。

  • ListMemoryStoreScopes:列出记忆库中已存在的 Scope,便于发现某应用或租户下有哪些 Agent 和会话产生过记忆。

  • ListMemoryStoreRequests:请求审计日志查询。

Scope 多租户

Scope 用于表示记忆数据的归属和隔离边界。记忆服务使用 appId / tenantId / agentId / runId 四级 Scope。

字段

说明

appId

应用标识,通常对应一个业务应用或产品

tenantId

租户或用户标识

agentId

Agent 标识

runId

会话、运行或任务标识

Scope 的层级为:

appId > tenantId > agentId > runId

核心规则:

  • 写入时,appId 必填,其他字段为空时补为 __default__。写入不允许使用通配符 *

  • 检索长期记忆时,appIdtenantId 必填,agentIdrunId 可使用 * 实现跨 Agent 或跨会话检索。

  • 查询短期记忆时,四个字段均为必填且不允许通配符。

检索示例:

  • agentId=""runId="":检索该租户下所有 Agent、所有会话的记忆。

  • agentId="sales_assistant"runId="*":检索该租户下指定 Agent 的所有会话记忆。

常见检索范围示例

检索范围

Scope 设置

适用场景

当前会话内

appId + tenantId + agentId + runId 全部指定

只希望使用当前会话历史

跨会话

appId + tenantId + agentId + runId="*"

同一 Agent 在多次会话中复用用户偏好

跨 Agent、跨会话

appId + tenantId + agentId="" + runId=""

多个 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%