Memory OS of AI Agent

Paper: arXiv:2506.06326 Code: BAI-LAB/MemoryOS Code reference: main @ 1d717060 (2026-04-28)

1. Motivation(研究动机)

这篇论文要解决的不是“如何把更多历史塞进 prompt”,而是 AI agent 在长期交互中缺少一套可持续的记忆管理机制。固定 context window 会让早期对话被截断;简单 RAG 会把历史切成一堆片段;只做用户画像又容易丢失具体事件。MemoryOS 的出发点是:长期对话里的记忆需要像操作系统管理内存一样,有层级、有迁移、有淘汰、有检索路径,而不是无限追加日志。

更具体地说,长期 agent memory 同时面对三种压力。第一是时间压力:用户偏好、事实、计划和关系会跨天、跨 session 延续,默认 LLM 只看到当前窗口时很容易忘记或编造。第二是主题压力:同一个用户会在不同时间谈学习、工作、兴趣、健康、旅行等多个主题,如果只按时间顺序存储,检索时会把相关但不连续的内容打散。第三是容量压力:如果每个 turn 都原样保存,记忆库会快速膨胀;如果只保留摘要,又会损失回答问题时需要的证据细节。

作者把这些问题类比为操作系统中的内存层级与分页管理。OS 不是把所有数据平铺在一个区域,而是用 cache / memory / disk、page / segment、replacement policy 等机制,在速度、容量、局部性之间折中。MemoryOS 对应地把 agent memory 分成 short-term memory、mid-term memory 和 long-term personal memory,并设计 storage、updating、retrieval、generation 四个模块,让信息在不同层级间迁移。

核心动机可以压缩成一句话:agent 的“记忆能力”不只是检索命中率,而是一个持续运行的外部状态系统能否在长时间、多主题、个性化交互中保持可更新、可检索、可压缩、可解释。这个定义比一般的 memory bank 更强,因为它要求系统同时管理近期上下文、主题级历史和稳定人格/用户事实。

2. Idea(核心思想)

MemoryOS 的核心 insight 是把长期对话记忆拆成三层存储与两级迁移:近期对话先进入 STM;STM 满了以后按 FIFO 迁移到 MTM;MTM 再按主题 segment 和 dialogue page 组织;当某个 segment 的热度足够高时,再把其中稳定、重要的用户/助手信息抽取到 LPM。这样,系统既不会把所有历史都混在一个 flat list 中,也不会过早把临时话题写进永久画像。

Figure 1 解读:图中最重要的不是“多了一个 memory store”,而是 memory store 被拆成可迁移的层级。STM 负责当前连续对话,MTM 负责跨时间的主题段落,LPM 负责稳定 persona 与知识。更新模块决定何时从 STM 迁移到 MTM、何时从 MTM 抽取到 LPM;检索模块先找相关 segment,再找 segment 内 page,最后结合 LPM 与 STM 生成答案。

这种设计的好处在于,它把长期记忆中的三类信息分开处理:临时上下文需要快速进入和快速淘汰;主题历史需要保留具体问答页并支持语义检索;个人画像需要更稳定、更少噪声、更可控的更新。论文没有把“长期记忆”简单等同于向量数据库,而是把它建模为一个有生命周期的状态管理系统。

与 MemGPT 的相似点是都借用了 OS-style memory/paging 的隐喻;不同点是 MemoryOS 更强调主题 segment 与 persona memory 的分层更新。与 MemoryBank 的相似点是都关注长期用户偏好;不同点是 MemoryOS 不只做遗忘曲线,而是显式维护 STM→MTM→LPM 的数据流。与 A-Mem 的相似点是都试图组织记忆关系;不同点是 MemoryOS 避免把全部关系构造成重型图更新,而采用 segment/page 结构来保留可检索细节。

我认为这篇论文真正有价值的地方在于:它把 agent memory 从“检索增强模块”推进到了“运行时状态系统”。如果一个 agent 需要持续服务同一用户,记忆就不能只是工具调用结果;它必须有更新策略、容量策略、冷热策略、稳定性边界和失败恢复路径。MemoryOS 给出的是一个工程上容易实现、概念上也足够清晰的中间层。

3. Method(方法)

3.1 Overall framework:四个模块与三层存储

MemoryOS 包含四个核心模块:Memory Storage、Memory Updating、Memory Retrieval、Response Generation。Storage 定义记忆应该放在哪一层;Updating 定义记忆如何迁移与刷新;Retrieval 定义面对新 query 时如何取回相关内容;Generation 定义如何把三层记忆合成 prompt,让 LLM 生成上下文一致且个性化的回复。

三层存储分别是:

层级主要内容生命周期设计意图
STM(Short-Term Memory)当前和最近的 QA dialogue pages短;固定长度队列保证最近上下文连续,不做复杂结构化
MTM(Mid-Term Memory)按主题 segment 组织的历史 dialogue pages中;容量受限、热度淘汰保留可追溯的历史细节,支持主题级检索
LPM(Long-term Personal Memory)User profile、User KB、User traits、Agent profile/traits长;更稳定、更小容量保存可跨 session 复用的个性化事实与角色设定

这三层并不是同一份信息的三种视图,而是不同稳定程度的信息状态。STM 里保留的是还没有被充分归纳的最新交互;MTM 里保留的是已按主题分组的历史;LPM 里保留的是经过抽取后更接近“用户画像/助手画像”的长期状态。MemoryOS 的关键就是不要在用户刚说一句话时立刻把它永久写入 persona,也不要在检索时只依赖一个全局向量库。

3.2 Memory Storage:dialogue page、segment 与 persona memory

STM 的基本单元是 dialogue page。一个 page 至少包含用户问题、模型回答和时间戳,可写成: 为了保持连续上下文,论文还为 page 增加 chain metadata: meta_i^{chain} 由 LLM 生成,作用是判断新 page 是否延续上一段对话语义,并总结当前 chain 的信息。如果新 page 与前文连续,它被挂到现有 chain;如果不连续,就开启新的 chain。这一点很重要,因为长期对话不是严格按主题分块的:用户可能先问旅行,再聊预算,之后又回到旅行计划。chain metadata 给系统提供了一个比时间顺序更强、但又比全局图更轻的上下文链接。

MTM 采用 segmented paging。segment 表示一个主题,segment 内部存放多个 dialogue pages。一个新 page 是否并入某个 segment,不只看 embedding 相似度,也看 LLM 提取的关键词集合。论文给出的相似度思想是: 其中 分别是 page 与 segment summary 的 embedding, 是关键词集合。分数超过阈值时,page 被合并到对应 segment;否则创建新 segment。这个设计比纯向量检索更稳,因为长期对话中的主题相似经常同时依赖语义和显式关键词,例如“儿子的钢琴课”和“孩子周末练习安排”在 embedding 上相似,但关键词能帮助系统确认它们属于同一个家庭/教育主题。

LPM 面向长期稳定信息,分成 User Persona 与 Agent Persona。User Persona 包含静态 profile、动态 User KB、动态 User Traits;Agent Persona 包含助手角色/profile 与通过互动发展的 assistant traits。论文里 User Traits 参考 ALIGNX 的维度,覆盖基本需求与人格、AI alignment 维度、内容平台兴趣标签等。LPM 的容量被明确限制,避免画像无限膨胀。

3.3 Memory Updating:STM→MTM 与 MTM→LPM

STM 到 MTM 的迁移很直接:STM 是固定长度 queue,新 page append 到队尾;当队列达到容量,最老 page 按 FIFO 被弹出并交给 MTM。论文实验里 STM dialogue page queue 固定长度为 7。这个设计看似简单,但它明确区分了“最近上下文”和“历史主题”:近期内容先在 STM 中保留原始细节,只有当它不再是最新上下文时才进入主题化组织。

MTM update 的核心是 topic analysis、session matching/merging、heat-based capacity control。被迁移的 pages 先由 LLM 生成多主题 summary 和 keywords;每个主题尝试匹配已有 segment;如果匹配分数超过阈值,就把 pages 插入该 segment 并更新 summary、keywords、last visit time、interaction length;否则创建新 segment。若 segment 数超过容量,则淘汰 heat 最低的 segment,并维护 page 之间的连接关系。

论文用 Heat 分数控制 MTM 到 LPM 的迁移: 其中 是该 segment 被检索次数, 是该 segment 内 dialogue pages 数量, 是最近访问的时间衰减项。实验中 Heat threshold 都设为 1。直觉是:一个主题如果经常被访问、交互足够多、最近仍然相关,就更可能包含稳定偏好或事实,值得进入 LPM;否则它只留在 MTM 作为可追溯历史。

MTM→LPM update 会抽取 User Traits、User KB 和 Agent Traits。论文还强调两点:第一,User KB 和 Agent Traits 使用固定容量队列,实验设为 100;第二,当 segment 被抽取到 LPM 后,相关 interaction 计数会被重置或降低,避免同一批 pages 反复触发画像更新。这相当于给长期记忆加入“防重复写入”的机制。

可以把更新流程写成伪代码:

def add_interaction(query, response, timestamp):
    page = build_dialogue_page(query, response, timestamp)
    page.meta_chain = llm_update_chain_metadata(page, previous_pages)
    STM.push(page)
 
    if STM.is_full():
        evicted_pages = STM.pop_fifo_batch()
        summaries = llm_multi_topic_summary(evicted_pages)
        for item in summaries:
            target = MTM.find_best_segment(item.summary, item.keywords)
            if target.score >= similarity_threshold:
                MTM.merge_pages(target.segment, item.pages)
            else:
                MTM.create_segment(item.summary, item.pages, item.keywords)
        MTM.evict_low_heat_if_needed()
 
    for segment in MTM.hot_segments(threshold=5):
        profile_update = llm_extract_persona(segment.unanalyzed_pages)
        LPM.update_user_profile(profile_update.profile)
        LPM.append_user_knowledge(profile_update.user_facts, capacity=100)
        LPM.append_agent_traits(profile_update.agent_traits, capacity=100)
        segment.mark_analyzed_and_reset_interaction()

这里最容易被误解的是 Heat。它不是传统 cache replacement 中单纯的访问频次,也不是只看 recency。MemoryOS 试图把“被问到过”“内容量足够”“近期仍有意义”三个信号合在一起,以决定某个 topic 是否已经从临时历史变成长期画像候选。

3.4 Memory Retrieval 与 Response Generation

检索阶段也是分层的。面对 query,系统先取 STM 中的近期上下文;再对 MTM 做两级检索:先按 query 与 segment summary 的相似度找 top-m segments,再在这些 segments 内检索 top-k dialogue pages;最后从 LPM 取 user profile、user knowledge、assistant traits 等 persona 信息。实验中 top-m 设为 5,top-k 在 GVD 和 LoCoMo 上分别设为 5 和 10。

MTM session-level retrieval 主要根据 query embedding 与 segment summary embedding 的相似度,并结合关键词 overlap。page-level retrieval 再从候选 segment 内找最相关的具体 pages。这样做的好处是先粗定位主题,再细找证据;避免全库逐页检索时被大量相似但无关的旧 page 干扰。

Response Generation 则把三层结果合成 prompt:STM 提供当前连续对话,MTM 提供历史事实与具体对话证据,LPM 提供稳定的用户/助手画像。最终答案由 LLM 生成。这个模块本身不是训练一个新模型,而是通过 memory organization 改善 prompt 中的信息质量。

检索与生成可写成伪代码:

def answer(query):
    recent_context = STM.get_all()
    candidate_segments = MTM.search_segments(query, top_m=5)
    retrieved_pages = []
    for segment in candidate_segments:
        retrieved_pages.extend(segment.search_pages(query, top_k=K))
 
    user_profile = LPM.get_user_profile()
    user_knowledge = LPM.search_user_knowledge(query)
    assistant_traits = LPM.search_assistant_traits(query)
 
    prompt = compose_prompt(
        query=query,
        recent_context=recent_context,
        historical_pages=retrieved_pages,
        user_profile=user_profile,
        user_knowledge=user_knowledge,
        assistant_traits=assistant_traits,
    )
    response = LLM(prompt)
    add_interaction(query, response, now())
    return response

这个设计的一个隐含假设是:长期记忆中的“证据”和“画像”要分开。MTM pages 更像可追溯证据,LPM profile 更像压缩后的先验。如果只用 LPM,回答会缺少细节证据;如果只用 MTM,回答会缺少长期偏好的稳定抽象。

4. Experiments(实验)

4.1 设置:数据集、指标、baseline 与实现细节

论文在 GVD 和 LoCoMo 上评估。GVD 是由 15 个虚拟用户与助手在 10 天内交互模拟出的多轮对话数据集,每天至少覆盖两个主题,适合评估较短但多主题的个性化记忆。LoCoMo 面向长期 conversational memory,平均每段对话约 300 turns、约 9K tokens,问题分为 Single-hop、Multi-hop、Temporal、Open-domain 四类,更能测试跨 session、跨时间、跨事实链的记忆能力。

GVD 使用三个指标:Memory Retrieval Accuracy(Acc.)、Response Correctness(Corr.)、Contextual Coherence(Cohe.)。Acc. 是二值指标,Corr. 和 Cohe. 采用 0 / 0.5 / 1 三档,并由 DeepSeek-R1 自动评估。LoCoMo 使用标准 F1 和 BLEU-1。

比较方法包括 TiM、MemoryBank、MemGPT、A-Mem / A-Mem*。TiM 存储 reasoning outcome 并用 LSH 检索;MemoryBank 用遗忘曲线和用户画像维护长期记忆;MemGPT 采用 main context 与 external context 的层级记忆;A-Mem 用图结构组织记忆。A-Mem* 是作者在相同实验环境下复现的结果,用于更公平比较。

实现细节里几个数字很关键:实验硬件为 8-H20 GPUs;STM dialogue page queue 长度为 7;MTM 最大 segment 长度设为 200;User KB 和 Agent Traits 最大容量均为 100;Heat threshold 为 5; 均为 1;MTM retrieval top-m=5;page retrieval top-k 在 GVD 为 5、LoCoMo 为 10;segment/page 插入相似度阈值使用 0.6;time constant 为 1e+7。

4.2 主结果:GVD 与 LoCoMo

GVD 上,MemoryOS 在两个 backbone 上都超过最强 baseline。GPT-4o-mini 下,A-Mem 为 90.4 Acc. / 86.5 Corr. / 91.4 Cohe.,MemoryOS 达到 93.3 / 91.2 / 92.3,对应提升 3.2%、5.4%、1.0%。Qwen2.5-7B 下,A-Mem 为 87.2 / 79.5 / 87.8,MemoryOS 为 91.8 / 82.3 / 90.5,对应提升 5.3%、3.5%、3.1%。

LoCoMo 上提升更明显。GPT-4o-mini 下,MemoryOS 在 Single Hop 上达到 35.27 F1 / 25.22 BLEU-1,在 Multi Hop 上达到 41.15 / 30.76,在 Temporal 上达到 20.02 / 16.52,在 Open Domain 上达到 48.62 / 42.99,F1 和 BLEU-1 的平均 rank 都是 1.0。相对基线,论文摘要报告 GPT-4o-mini 上平均 F1 提升 49.11%,BLEU-1 提升 46.18%。

Qwen2.5-3B 下也保持趋势:MemoryOS 在 Single Hop 上达到 23.26 / 15.39,在 Multi Hop 上 21.44 / 14.95,在 Temporal 上 10.18 / 8.18,在 Open Domain 上 26.23 / 22.39,同样获得 F1 和 BLEU-1 平均 rank 1.0。尤其 Open Domain 相对 A-Mem* 的提升达到 112.56% F1 和 110.83% BLEU-1,说明结构化记忆对小模型也有帮助。

作者的解释是:MemoryBank 只靠 decay 不能解决复杂语义组织;TiM 保存“thoughts”减少重复推理,但单阶段 hash retrieval 难以保留跨 topic 依赖;MemGPT 的 OS-style paging 强在外部 context,但 flat FIFO queue 容易在长对话中混合主题;A-Mem 的图结构语义更丰富,但 multi-step linking 带来额外成本和可能的噪声传播。MemoryOS 的优势来自三层存储、semantic+keyword retrieval,以及 persona-driven update 的组合。

4.3 Ablation、top-k、效率与案例分析

Ablation 去掉了 MTM、LPM、dialogue page chain 以及整个 MemoryOS。结论很清楚:去掉整个 MemoryOS 时性能大幅下降;在内部组件中,MTM 影响最大,其次是 LPM,Chain 影响相对最小。这说明 MemoryOS 的主要收益来自主题级历史组织与检索,而 persona memory 提供进一步个性化增益。Chain 虽然不是最大贡献项,但它对保持连续 dialogue page 的上下文仍有价值。

Top-k 分析显示,检索过少 page 会遗漏证据,检索过多 page 又会引入噪声并增加 token 成本。因此 top-k 不是越大越好,而是要根据任务和数据集调节。论文最终在 GVD 使用 top-k=5,在 LoCoMo 使用 top-k=10,这与 LoCoMo 的对话更长、问题更依赖跨段证据相匹配。

效率表也很有意思。LoCoMo 上,MemoryBank 每次响应 tokens 仅 432、Avg.Calls 3.0,但 Avg.F1 只有 6.84;MemGPT tokens 高达 16,977、Avg.Calls 4.3,Avg.F1 为 29.13;A-Mem* tokens 2,712、Avg.Calls 13.0,Avg.F1 为 26.55;MemoryOS tokens 为 3,874、Avg.Calls 4.9,Avg.F1 为 36.23。也就是说 MemoryOS 不是最低成本方法,但在性能和成本之间取得了更好的平衡:比 MemGPT 少得多的 tokens,比 A-Mem* 少得多的调用次数,同时 F1 更高。

Case study 展示了默认 LLM 与加入 MemoryOS 后的回答差异。默认 LLM 往往只能处理当前 query,容易忽略早期偏好或历史事实;MemoryOS 则能从 MTM/LPM 中回忆相关信息,让回答更符合长期对话状态。这个例子支持论文的核心主张:长期交互中,个性化不是靠单次 prompt 写出来的,而是靠持续维护的 memory state 支撑。

5. Source Code(代码搜索与实现映射)

代码搜索找到了论文摘要中给出的官方开源实现:BAI-LAB/MemoryOS。本笔记锚定 main@1d717060(2026-04-28)。仓库包含 memoryos-pypi/memoryos-mcp/memoryos-chromadb/memoryos-playground/eval/ 等目录;核心 Python 包在 memoryos-pypi/ 下,MCP 服务封装在 memoryos-mcp/ 下,评估相关脚本在 eval/ 下。

Code reference: main @ 1d717060 (2026-04-28)

Paper ConceptSource FileKey Class/Function
MemoryOS top-level orchestrationmemoryos-pypi/memoryos.pyMemoryos.__init__, Memoryos.add_memory, Memoryos.get_response, Memoryos._trigger_profile_and_knowledge_update_if_needed
Short-term FIFO page queuememoryos-pypi/short_term.pyShortTermMemory.add_qa_pair, ShortTermMemory.is_full, ShortTermMemory.pop_oldest
Mid-term segmented memorymemoryos-pypi/mid_term.pyMidTermMemory.add_session, MidTermMemory.insert_pages_into_session, MidTermMemory.search_sessions, compute_segment_heat
Long-term persona / knowledge memorymemoryos-pypi/long_term.pyLongTermMemory.update_user_profile, add_user_knowledge, add_assistant_knowledge, search_user_knowledge, search_assistant_knowledge
STM→MTM migrationmemoryos-pypi/updater.pyUpdater.process_short_term_to_mid_term, gpt_generate_multi_summary, generate_page_meta_info
Parallel retrievalmemoryos-pypi/retriever.pyRetriever.retrieve_context, _retrieve_mid_term_context, _retrieve_user_knowledge, _retrieve_assistant_knowledge
LLM/embedding utilitiesmemoryos-pypi/utils.pyOpenAIClient, get_embedding, normalize_vector, gpt_user_profile_analysis, gpt_knowledge_extraction

代码实现和论文设计基本一致,但有几个工程化差异值得注意。第一,memoryos.pyMemoryos 是用户面对的主入口,初始化时创建 short-term、mid-term、user long-term、assistant long-term、Updater、Retriever。第二,代码默认 short_term_capacity=10mid_term_capacity=2000long_term_knowledge_capacity=100retrieval_queue_capacity=7mid_term_similarity_threshold=0.6H_PROFILE_UPDATE_THRESHOLD=5.0;论文实验设置中 STM queue 是 7、MTM segment 最大长度是 200。也就是说笔记里的实验数字来自论文实验设置,代码默认值则反映当前包的可配置默认。

ShortTermMemory 的实现非常直接:内部用 deque(maxlen=capacity) 保存 QA pair,add_qa_pair 添加新交互,is_full 判断是否达到容量,pop_oldest 弹出最旧 page。为了避免 deque 自动丢失信息,Memoryos.add_memory 会在加入新 page 前检查容量,必要时先调用 updater 把 STM 内容迁移到 MTM。

MidTermMemory 是最贴近论文 MTM 的部分。compute_segment_heat 根据 N_visitL_interaction 和 recency 计算 segment heat;insert_pages_into_session 会给 page 生成或复用 embedding,寻找最相近的 session,并在达到 similarity threshold 时合并,否则创建新 session;search_sessions 对 query 做 embedding,再根据 segment summary 和 page similarity 找候选。工程实现里还维护 heap,用于按 heat 做容量控制。

Updater.process_short_term_to_mid_term 对应 STM→MTM。它先为 evicted pages 生成 embedding 和 metadata,再调用 gpt_generate_multi_summary 做多主题摘要,然后把每个 summary item 插入 MTM。Memoryos._trigger_profile_and_knowledge_update_if_needed 则对应 MTM→LPM:它扫描 heat 超阈值的 segment,把未分析 pages 送给 LLM 做用户画像和知识抽取,更新 long-term memory,然后标记 pages 已分析并重算 heat。

Retriever.retrieve_context 对应检索模块。它并行执行三个检索任务:从 MTM 检索相关 pages,从 user long-term memory 检索用户知识,从 assistant long-term memory 检索助手知识。Memoryos.get_response 进一步把 retrieved pages、user profile、user knowledge、assistant knowledge、relationship/style hint 和 query 组合成 system/user prompt,调用 LLM 生成最终回复,并把新回复再次写回 memory。

基于代码的端到端伪代码如下:

memo = Memoryos(
    user_id=user_id,
    short_term_capacity=10,
    mid_term_capacity=2000,
    long_term_knowledge_capacity=100,
    mid_term_similarity_threshold=0.6,
    mid_term_heat_threshold=5.0,
)
 
def Memoryos.add_memory(user_input, agent_response, timestamp):
    if short_term_memory.is_full():
        updater.process_short_term_to_mid_term()
    short_term_memory.add_qa_pair(user_input, agent_response, timestamp)
    _trigger_profile_and_knowledge_update_if_needed()
 
def Memoryos.get_response(query):
    ctx = retriever.retrieve_context(query, user_id)
    prompt = build_prompt(
        query=query,
        pages=ctx["retrieved_pages"],
        user_profile=long_term.get_raw_user_profile(user_id),
        user_knowledge=ctx["retrieved_user_knowledge"],
        assistant_knowledge=ctx["retrieved_assistant_knowledge"],
    )
    response = client.chat_completion(prompt)
    add_memory(query, response, timestamp=now())
    return response

从工程角度看,MemoryOS 的实现不是一个训练框架,而是一个 runtime memory middleware。它依赖外部 LLM 做 summary、continuity check、profile analysis 和 final response;依赖 embedding model 做 segment/page 检索;用 JSON/FAISS/deque 等结构维护状态。因此它适合快速接入 agent 应用,但其质量高度依赖底层 LLM 抽取与摘要的稳定性。

6. Limitations(局限与风险)

论文自己的 limitation 主要在规模、评估和记忆安全三个方向。第一,MemoryOS 仍然需要多次 LLM 调用来做摘要、画像抽取和最终回答;虽然比 A-Mem* 调用更少、比 MemGPT token 更低,但在真实高频 agent 中仍需要缓存、异步更新或批处理。第二,GVD 和 LoCoMo 能覆盖长对话记忆,但还不能完全代表真实用户长期使用中的事实修正、隐私撤回、对抗输入和跨设备同步。第三,LPM 中的 user traits 和 user knowledge 如果抽取错误,可能比短期检索错误更持久,因为它们会影响后续很多轮回答。

方法上也有几个潜在弱点。Heat 公式是启发式的, 全设为 1 未必适合所有任务;topic segment 的质量依赖 LLM summary 和关键词抽取,一旦摘要漂移,后续检索会沿着错误主题继续合并;MTM→LPM 的阈值会造成稳定性与响应性的折中,阈值太低会把临时偏好写进 persona,阈值太高则会错过重要长期信息。

与更复杂的 memory graph 方法相比,segmented paging 的可解释性更好、工程成本更低,但它对跨 segment 的关系表达较弱。例如用户的职业、时间安排和兴趣可能分散在多个 segment 中,回答某些问题需要跨主题组合;MemoryOS 主要通过检索多个 segment/pages 来解决,而不是显式建模多跳关系。因此在复杂因果推理或强结构化用户模型场景里,可能需要把 MemoryOS 与图记忆或 schema memory 结合。

代码层面的 caveat 是:当前开源实现提供了 pip package、MCP wrapper 和 playground,但论文实验的完整复现配置与 benchmark pipeline 并不完全等同于一个一键复现实验包。笔记中的实验数字应以论文 LaTeX/PDF 为准;代码映射用于理解方法如何落地,而不是证明所有表格数字能直接用仓库默认参数复现。

7. Takeaways(读后启发)

MemoryOS 最适合被理解为 agent memory runtime 的一个 reference architecture:STM 处理最近上下文,MTM 处理主题级历史证据,LPM 处理长期 persona。这个分层足够简单,能落到代码;也足够有表达力,能覆盖长期对话中常见的“最近发生了什么”“以前在这个主题上说过什么”“这个用户长期偏好是什么”三类问题。

对实际系统设计的启发是,agent memory 不应该只问“用哪种向量数据库”。向量检索只是 retrieval 的一环,更重要的是写入策略、更新策略、容量策略、画像抽取策略和证据/画像分离。没有这些策略,长期 memory bank 很快会变成一个噪声不断累积的日志库。

如果要把 MemoryOS 用在生产 agent 中,我会优先补三件事:第一,给 LPM 更新加 provenance,让每条用户事实能追溯到原始 pages;第二,加 explicit delete / correction 机制,支持用户撤回或修正长期记忆;第三,把 Heat 和阈值变成可观测指标,记录每次迁移、淘汰和画像更新的原因。这样 MemoryOS 才能从论文里的 memory manager 进一步变成可审计、可调试、可控的长期个人化系统。

8. Implementation Checklist(落地检查清单)

如果把 MemoryOS 改造成真实 agent 中间件,我会把实现拆成以下检查点,而不是一次性追求完整论文复现。

  1. STM 检查:

    • 每个用户/助手交互都必须形成一个不可变 dialogue page。
    • page 至少保存 user input、assistant response、timestamp、session id。
    • 如果支持 tool calls,还应保存工具调用摘要和关键返回值。
    • STM 容量达到上限时,不允许静默丢弃旧 page。
    • 旧 page 必须先进入 MTM update pipeline,再从 STM 删除。
    • STM 的主要价值是近因上下文,不应该承担长期画像功能。
  2. MTM 检查:

    • segment 应该有 summary、keywords、page ids、heat、last visit time。
    • 新 page 插入前要先做主题摘要,而不是只按时间批量合并。
    • 合并阈值需要可配置,并在日志中记录 best score。
    • 如果没有 segment 达到阈值,应创建新 segment。
    • segment 超容量时,应按 heat 或其他策略淘汰,而不是随机删除。
    • 被淘汰 segment 的 page provenance 要么归档,要么明确记录无法追溯。
  3. LPM 检查:

    • User Profile 应只保存稳定、长期、可复用的信息。
    • User KB 应保存可验证事实,并尽量带来源 page ids。
    • User Traits 不应从单轮情绪或偶然表达中直接得出。
    • Agent Traits 应区分系统设定与互动中形成的临时偏好。
    • LPM 更新要有去重、冲突检测和容量上限。
    • 用户修正事实时,旧条目需要标记 superseded,而不是并存。
  4. Retrieval 检查:

    • 检索应先做 segment-level filtering,再做 page-level retrieval。
    • top-m 和 top-k 应根据任务长度调参,而不是默认越大越好。
    • prompt 中要区分 recent context、historical evidence 和 persona prior。
    • 生成前应保留检索到的证据列表,便于失败分析。
    • 如果 LPM 和 MTM 冲突,系统应优先提示冲突或回查来源。
    • 不应让 persona prior 覆盖明确的最新用户指令。
  5. Observability 检查:

    • 每次 STM→MTM 迁移应记录迁移 pages 数、summary 和 keywords。
    • 每次 MTM merge 应记录 target segment、similarity score 和阈值。
    • 每次 Heat 更新应记录 N_visitL_interactionR_recency
    • 每次 MTM→LPM 更新应记录抽取结果和来源 segment。
    • 每次最终回答应记录使用了哪些 STM/MTM/LPM 内容。
    • 这些日志比单独看最终回答更能定位 memory 系统失败原因。
  6. Safety 检查:

    • 对敏感信息应支持“不写入长期记忆”的策略。
    • 对用户明确要求遗忘的信息,应从 LPM 和相关索引中删除或封存。
    • 对自动抽取的 traits,应避免生成过度推断的心理/身份标签。
    • 对共享设备或多用户场景,应严格隔离 user_id 与 storage path。
    • 对外部工具返回的信息,应区分用户事实和环境事实。
    • 对长时间未访问的 memory,应设计衰减、归档或再确认机制。
  7. Evaluation 检查:

    • 不能只评估最终 QA 正确率,还要评估记忆写入质量。
    • 需要构造事实更新、事实撤回、偏好变化、多主题切换等 case。
    • 需要比较无记忆、flat RAG、MemoryOS 三种模式。
    • 需要统计每轮 token、LLM calls、检索命中率和画像更新频率。
    • 需要人工抽查 LPM 中的 traits 是否过度推断。
    • 需要记录失败类型:未写入、写错、检索不到、检索到但未使用、画像误导。
    • 需要把这些失败类型回连到具体模块,避免只调 prompt 而忽略状态管理问题。
    • 需要周期性重放同一用户轨迹,确认更新策略没有随版本迭代发生回归。