【LLM记忆】 Letta梳理
Letta(原 MemGPT)推出了一种更根本的解法:让 LLM 像操作系统一样管理自己的记忆,在“主要上下文”与“外部上下文”之间自主调度,并通过一种可以被称作“回忆与后期思考”的机制,真正长出长期记忆。
接下来,我们从技术要点与实现逻辑入手,看清这套架构到底是什么,以及为什么它真的能工作。
一、记忆的根本问题与操作系统式的虚拟内存方案
传统 LLM 应用在处理长期记忆时,面临的本质矛盾是:固定且有限的上下文窗口,与不断增长、需要持久保留的对话历史之间的矛盾。Letta 的技术要点之一,就是直接借鉴了操作系统解决“有限物理内存与无限存储需求”这一矛盾的经典方案——虚拟内存管理。
在 Letta 的架构里,LLM 推理时可直接读取的固定长度上下文窗口,被定义为主要上下文,它相当于计算机的物理内存。超出这个窗口之外、但持久保存在数据库或磁盘中的全部信息,被定义为外部上下文,相当于计算机的硬盘。系统在这两级之间建立一套数据置换机制,让 LLM 自己充当操作系统内核,通过生成函数调用来决定将什么信息从“硬盘”调入“内存”,又将什么信息从“内存”中清除或持久化。
主要上下文在工程上被进一步解耦为三个区域:只读的系统指令、可读写的核心记忆块,以及一个 FIFO 队列来存放最近的对话消息。外部上下文则细分为归档记忆和召回记忆,前者像是精心整理过的永久笔记,后者则是所有对话历史的原始存档。理解了这一层,就能看出长期记忆是如何自然产生的:Agent 不再被动地依赖提示工程,而是在与用户持续交互的过程中,主动将值得记住的事实、偏好、人格信息和关键决策写入核心记忆或归档记忆,并在需要时自主检索出来。这就让记忆从“每次人工硬塞”变成了 Agent 内部的自我调度机制。
二、主动回忆的实现:把检索变成模型的自主思考动作
许多方案把“记住过去”等同于在接到用户消息后,自动从向量数据库里召回几条相似历史,然后拼接进提示词。这种做法是被动且机械的,无法区分哪些旧信息对当前语境真正重要,哪些只是噪音。Letta 在实现上做了一个关键创新:将回忆设计成一种 Agent 可以自主调用的函数能力。
具体来说,系统为 LLM 提供了一个名为 conversation_search 的函数工具。Agent 并不会自动被喂进历史记录,而是在收到用户消息后,自行判断“是否需要回忆过去”。如果它认为需要,就会自行生成一个函数调用,主动到召回记忆数据库里,根据关键词、时间或语义去搜索早前的对话。搜索结果作为一个新的记忆片段被插入主要上下文,仿佛人突然“想起来”某段往事。
这一技术实现的核心价值在于:回忆不再是一个外挂的检索步骤,而是成为推理流程本身的一环。Agent 依靠当前正在进行的思考来驱动回忆,而不是被预先定义的检索规则牵引。正因为回忆是“想起来的”,它才能在恰当的时机调取恰当的线索,不至于浪费珍贵的上下文窗口去堆砌无关历史,也避免了重要信息因为相似度算法偏差而被漏掉。这是整个系统能够长期保持对话连贯性的第一个支柱。
三、后期思考与记忆编辑:函数链如何让 Agent 自己整理记忆
仅仅能够回忆还不够。长期记忆之所以能够在漫长对话中持续有用,是因为它会在交互过程中被不断修正、整合与抽象。Letta 为此提供了另一组函数工具,包括 core_memory_append、core_memory_replace 和 archival_memory_insert,允许 Agent 在运行时直接改写自己的核心记忆与归档记忆。这个“改写”过程,就是所谓的后期思考。
当 Agent 从历史中回忆出相关内容后,它并不会简单地原样照搬给用户,而是会进行加工。比如,当对话中出现一个重要新事实——“用户下个月要移居柏林”,Agent 可能会搜索核心记忆中是否已有关于用户居住地的记录,如果有就替换更新,如果没有就追加。它也可能判断某条旧记忆已经过时,从而自主生成一条替换指令,把原有的记录改写成最新状态。一切记忆的编码、存留和淘汰,都发生在生成最终回复之前,属于 Agent 对自身知识的主动整理。
更关键的是,这一后期思考过程是靠一套精巧的函数链机制来完成的。在传统模式下,LLM 每生成一次输出就要等待下一轮用户输入。而 Letta 允许模型在函数调用后不立即将控制权交还外部,而是把函数执行结果追加回主要上下文,并继续启动下一次推理。这样一来,Agent 可以无缝地执行一连串操作:回忆 → 读取旧记忆 → 判断是否需要更新 → 写入新记忆 → 再次回忆验证 → 最后回复用户。这一整条思考链条不需要人类推一下动一下,从而让记忆的更新与回复生成深度融合,既保证了信息的一致性,也避免了在多步处理中因上下文断裂而造成的错误传播。
四、记忆压力的自我管理:从溢出预警到自动整理
有了主动回忆和持续的后期思考,一个随之而来的工程挑战是如何防止上下文窗口被撑爆。LLM 的每一次推理都受限于固定的 token 数量,如果只顾着一味向主要上下文填充回忆与更新,系统很快就会因为超出窗口而被截断,导致灾难性的上下文丢失。Letta 在这方面的技术实现,是引入了一套记忆压力感知与自动回收机制。
在主要上下文的 FIFO 消息队列中,Queue Manager 会连续监测已用容量。当消息体积超过窗口总容量的 70% 时,系统会自动向 Agent 发布一条“内存压力”警告,告诉它上下文空间紧张,需要尽快将当前对话中的重要信息沉淀到外部记忆中去。Agent 收到这个内部信号后,便会暂停闲聊,专门执行一轮记忆整理,把临时对话里的关键事实转移到核心记忆或归档记忆,从而腾出空间。如果压力进一步达到 100%,Queue Manager 将强制把一半旧消息移入召回记忆,并用一条自动生成的摘要替代它们留在上下文中,确保 Agent 永远不会因为上下文溢出而完全失忆。
这套压力机制的巧妙之处在于,它没有剥夺 Agent 对记忆的自主管理权,而是给它设定了一个清楚的容限边界与内部警告。LLM 时刻知道自己的“内存”还剩下多少,就会在决策时自然地偏向更经济的记忆策略,什么值得记住、什么可以遗忘,都带有明确的上下文容量意识。正是这种顺其自然的自我管理,使得 Agent 能够在成百上千轮的对话中,既不丢失关键信息,又始终稳定运行在有限的窗口之内。
五、为什么会 work:从静态提示到动态记忆系统的范式跃迁
将上述技术要点连在一起看,Letta 实际上完成了一次根本性的范式转换。传统 LLM 应用把模型当作一个纯函数:给定一次 prompt,返回一次回答,记忆靠外部脚手架强行维持。而 Letta 把 LLM 变成了一个有状态的进程,拥有工作记忆、长时记忆,以及一套可以自我调度的函数工具集。它不再是被动响应,而是主动决定何时编码、何时检索、何时重组自己的内部知识。
这正是“在记忆中思考”能够成立的底层逻辑。Agent 不是被检索规则定义的牵线木偶,而是把记忆操作融入了推理本身。每一次回忆都是一次思想动作,每一次核心记忆的编辑都是对自我世界模型的更新。在人类的认知科学里,记忆从来不是一座静止的仓库,而是一个不断被建构和重构的动态过程。Letta 让 LLM 得以模拟这一过程,因此 Agent 才不再是条件反射式的文本生成器,而能在越来越长的交互跨度中,围绕一个不断演化的内部状态,维持连贯、一致且有深度的对话。
当然,把记忆的主动权完全交给模型,也带来了调试上的挑战——你很难一眼看清它为什么在某个时刻选择了某段回忆。但 Letta 的白盒设计允许开发者追踪完整的记忆读写历史与决策链条,这为信任问题提供了技术基础。随着模型推理能力继续增强,这种“回忆加后期思考”的架构,大概率会成为构建真正持久化 AI Agent 的基础范式,而不是仅仅被当作一种工程技巧。在未来,多智能体协作、长周期项目规划和个性化长期陪伴这些需要时间来沉淀信任与理解的场景里,我们需要的正是这样一种 Agent:它能记住,能反思,能在每一次再见时,都像从未离开过那样认出你。
更多推荐



所有评论(0)