上下文窗口是 RAM,长期记忆是硬盘
把同一个问题问两遍,如果第一轮对话没有带上,LLM 的回答可能完全不同——因为它没有记忆。
2026 年,业内有一句话流传甚广:上下文窗口是 RAM,长期记忆是硬盘;两者互相不能替代。
本文讲清 Agent 记忆的原理与工程实现:短期记忆、长期记忆、分层架构、写入-检索-更新-遗忘的完整生命周期,以及 Claude Code、Codex、OpenClaw 与 mem0 / Letta / Zep / LangMem 等主流方案的实践与选型。
上下文窗口是 RAM,长期记忆是硬盘;两者互相不能替代。
一组公开实验数据(Chroma 复现的 Context Rot 实验)非常直观:同样一份长文档,只是改变 prompt 里信息的组织方式,准确率可以从 98% 掉到 64%。 塞进去 ≠ 想起来。「塞进上下文」和「从上下文检索出正确答案」是两件事,中间需要一层筛选——这层筛选,就是记忆系统。
而要理解 Agent 记忆怎么做,业界普遍从认知科学里找答案。
现代 Agent 记忆架构几乎都能追溯到 Atkinson 与 Shiffrin(1960 年代)提出的多重存储模型。人脑的记忆不是一块硬盘,而是分层的:
| 人类记忆 | 对应 Agent 实现 | 存储位置 |
|---|---|---|
| 感知记忆 | 工具/API 的原始返回值 | 临时变量,用完即弃 |
| 短期记忆(工作记忆) | LLM 上下文窗口 | 模型的 context window |
| 情景记忆 | 历史对话记录、交互日志 | 向量数据库 / 文件系统 |
| 语义记忆 | 知识图谱、事实库 | 外部知识库 |
| 程序记忆 | 工作流定义、操作规范 | 配置文件 / 指令文件 |
一句话:Agent 记忆的本质,是在有限的上下文窗口内,模拟人类记忆的分层结构和动态管理能力。
工程上的主流分层是三块:
短期记忆最简单也最脆弱——直接依赖 LLM 的上下文窗口。最朴素的做法(LangChain 的 ConversationBufferMemory):把每一次对话的原文全部塞进上下文。缺点是 token 消耗线性增长,对话一长必爆。围绕这个问题,工程上有四种经典变体:
| 变体 | 机制 | 效果 |
|---|---|---|
| ConversationBufferMemory | 原文全量入上下文 | 实现最简单,token 线性增长 |
| ConversationSummaryMemory | 用 LLM 逐步总结对话 | token 从线性变亚线性 |
| ConversationBufferWindowMemory | 只保留最近 k 轮(滑动窗口) | 控制窗口大小 |
| ConversationSummaryBufferMemory | 远处用总结、近期留原文 | 信息完整性与 token 预算的权衡 |
到具体实现层面,就是「设定上限 + 超限压缩」:
class WorkingMemory:
def __init__(self, max_tokens=128000):
self.messages = []
self.max_tokens = max_tokens
self.token_count = 0
def add_message(self, role, content):
tokens = count_tokens(content)
if self.token_count + tokens > self.max_tokens:
self.compact() # 超限触发压缩
self.messages.append({"role": role, "content": content})
self.token_count += tokens
def compact(self):
"""把较早的消息交给 LLM 做摘要"""
old = self.messages[:len(self.messages) // 2]
summary = llm.summarize(old)
self.messages = [{"role": "system",
"content": f"Earlier summary: {summary}"}] \
+ self.messages[len(self.messages) // 2:]
self.token_count = count_tokens(summary)
核心要点就两条:设定 token 上限(如 128K),接近上限触发压缩;压缩即摘要——让 LLM 总结较早的消息,替换原文,保留最近的细节。
短期记忆的根本局限:只能看到「当下」,回顾不了三天前、更早的决策。这就是长期记忆存在的理由。
长期记忆用于跨会话持久化,技术栈是「向量数据库 + 元数据库 + 时间索引」。
写入流程:文本 → embedding → 存入向量库(附带 user_id、timestamp、metadata);检索流程:query → embedding → 相似度 top-k 召回 → 注入上下文。
class LongTermMemory:
def store(self, content, metadata):
embedding = embedding_model.encode(content)
self.vector_db.upsert(collection="long_term_memory", points=[{
"id": generate_id(), "vector": embedding,
"payload": {"content": content, "user_id": self.user_id,
"timestamp": datetime.now(), "metadata": metadata}}])
def retrieve(self, query, top_k=10):
q = embedding_model.encode(query)
return self.vector_db.search(collection="long_term_memory",
query_vector=q, filter={"user_id": self.user_id}, limit=top_k)
但「全量向量检索」只是入门。2023 年斯坦福的 Generative Agents 提出了更有名的记忆流(Memory Stream)架构:所有观察按时间顺序存储,决策时用检索函数挑最相关的 Top-K 条注入上下文。检索得分由三个因子相乘得到:
| 因子 | 含义 | 实现方式 |
|---|---|---|
| 新近性(Recency) | 越近的记忆权重越高 | 指数衰减函数 |
| 重要性(Importance) | 事件有多重要 | LLM 打分 0-10 |
| 相关性(Relevance) | 与当前查询的语义相似度 | embedding 计算 |
再往后,工程界逐步收敛出两条被反复验证的结论:
| 指标 | 全量塞入 128K | 结构化事实抽取 | 提升 |
|---|---|---|---|
| 单跳 F1 | 27.1 | 38.72 | +42% |
| 多跳 F1 | 18.3 | 28.64 | +56% |
| 平均 token | 26k | 1.5k | -94% |
| P99 延迟 | 17s | 1.4s | -91% |
Agent 对世界的理解:概念、关系、属性。典型实现是知识图谱(如 Neo4j),以三元组 (主语, 谓语, 宾语) 存储,支持 SPARQL 查询与路径推理。
「我过去做过的具体事件」:时间、动作、结果。核心价值是从经验中学习。实现要点是给每条事件做重要性评分,并用 LLM 生成反思(Reflection)。Generative Agents 中的反思机制强调「综合抽象」:把「今天去了图书馆」「昨天也去了」「前天在咖啡店读论文」这类观察,归纳成「Klaus 是一个勤奋的学者,经常在安静环境中工作」这样的高层规律,再反馈回记忆流参与检索。
「我如何做某件事」:技能、工作流、操作规范。实现为技能库:LLM 先对任务分类,再返回对应技能定义,并统计成功/失败率,失败率高时触发技能优化。
生产级分层记忆的每次对话,其实是完整闭环:
1. 检索阶段:长期记忆检索(向量)+ 实体抽取(语义图谱) + 相似情节(情节库) + 技能匹配(程序库) 2. 拼装上下文,调用 LLM 生成响应 3. 写入阶段:短期追加消息 → 长期存储(异步) → 记录情节与反思 4. 定期:压缩短期、整合反思、执行遗忘策略
写哪些进长期记忆,是关键决策。社区里常见的重要性评分规则:个人偏好/事实 +0.3、用户明确要求记住 +0.5、与历史记忆冲突 +0.4、关联长期目标 +0.2;只有评分超过阈值(如 0.5)的消息才写入长期记忆。
| 维度 | Claude Code | Codex | OpenClaw |
|---|---|---|---|
| 记忆来源 | 用户编写 + AI 自动积累 | 自动生成 + 屏幕感知 | 用户编写 bootstrap 文件 |
| 持久化方式 | Markdown 文件 | Markdown 文件 | Markdown + JSONL session |
| 作用域模型 | 4 级层级 | 全局 + 按线程控制 | Agent 隔离 + 可选共享 |
| 自动化程度 | 高 | 高 | 低 |
Claude Code:双重记忆 + 分层作用域。CLAUDE.md 类似「入职手册」,四级作用域(组织策略 → 项目指令 → 用户偏好 → 本地指令),支持路径特定规则按需加载;Auto Memory 让 AI 在工作过程中自动判断什么值得记住,写入 memory 目录,索引文件每会话加载、详细笔记按需读取。哲学很清晰:规则由人控制,经验由 AI 积累。
Codex:记忆即 Markdown + 屏幕感知。Memories 系统后台自动提炼偏好、工作流、技术栈、陷阱,写入 Markdown;Chronicle(屏幕感知记忆) 定期截屏 → OCR → 生成记忆摘要。风险也明显:屏幕内容可能含恶意指令(提示注入攻击),截图目录敏感数据可能被其他程序访问。
OpenClaw:bootstrap 文件(AGENTS.md 操作指令 + SOUL.md 人格边界 + USER.md 用户画像 + TOOLS.md 工具约定)新会话注入;每个 agent 有完全隔离的 session store,通过 QMD 跨 agent 检索实现可配置共享——隔离与共享成了连续谱而不是二选一。
/memories 目录暴露给客户端直接管理,甚至支持从 ChatGPT / Gemini 跨模型导入记忆——记忆开始要求可迁移性;长期记忆的工程实现,业界大致走过三代架构:RAG(纯向量)→ 结构化事实(Fact + 双时态)→ 记忆图谱(Memory Graph,实体 + 边 + 情节)。三代不是互相取代,而是层层包住——图谱层仍会走向量召回兜底。
| 框架 | 核心架构 | 定位/优势 |
|---|---|---|
| mem0 | LLM 抽取 (subj, pred, obj, valid_from) 结构化事实,冲突消解后检索 | 快速替代 RAG;token -94%、延迟 -91%(论文公开数据);2026-05 宣布 Series A 2400 万美元 |
| Letta(前身 MemGPT) | 分层记忆:Core(最热)/ Archival(结构化)/ Recall(原始素材),LLM 主动换入换出 | 最接近「记忆操作系统」,OS 虚拟内存隐喻 |
| Zep / Graphiti | 双时态知识图谱(bi-temporal knowledge graph) | 多跳关系推理、时间旅行、可解释;DMR benchmark 94.8% |
| LangMem | Semantic / Episodic / Procedural 三分法,LangGraph 生态集成 | 重度使用 LangChain 生态的团队接入成本最低 |
选型口诀(社区共识):初创快速验证选 mem0,研究探索选 Letta,企业级多跳推理选 Zep,LangChain 生态选 LangMem,要官方记忆能力选 Anthropic Memory Tool。
讲实现时容易只盯着「向量库」和「检索算法」,但别忘了记忆系统里最重的一环是 LLM 调用——摘要要 LLM、反思要 LLM、重要性打分要 LLM、事实抽取要 LLM。一次对话里,记忆层可能比主回答多调用好几轮模型,链路越频繁,越吃模型接口的稳定性与成本。
对国内团队而言,把记忆系统的模型调用接到性价比更高的后端,是一条被验证过的路径:经向量云(火山方舟官方授权 Token 服务商)获取官方 API Key,走 Anthropic / OpenAI 双协议兼容接入火山方舟模型——记忆的摘要、反思、抽取、检索重排全部照常工作,Token 成本与接口稳定性同时得到保障。
获取 API Key:https://ark.tokenrize.cn/ · 注册即享专属 Token 折扣
一句话总结:短期记忆决定「当下多聪明」,长期记忆决定「越用越聪明」,而模型接入决定记忆系统「跑得多省、多稳」。
回看记忆系统的演进,核心转变是:从「把一切塞进上下文」到「在合适的时候想起合适的事情」。
长上下文不会杀死记忆系统,恰恰相反——上下文越长,越需要记忆系统来筛选、分层和调度。2026 年,模型厂商把记忆做成一等公民(Anthropic Memory Tool)、开源框架把记忆做成生产组件(mem0 / Letta / Zep / LangMem)、编程助手把记忆做成默认能力(Claude Code / Codex),方向惊人地一致:
Agent 记忆的最终目标,不是「记住一切」,而是在正确的时间,想起正确的事。
面向大模型应用落地的技术服务型企业,依托字节跳动火山方舟能力,为合作方提供低折扣模型 Token、可独立部署的运营支撑平台及全链路运营支持。
火山方舟官方 API 与官方 Key 直连 · 向量云 · 按量计费享 Token 折扣
A. 短期记忆(工作记忆)是当前会话的上下文窗口,承载即时推理,通常用「消息列表 + 滑动窗口 + LLM 摘要压缩」实现;长期记忆是跨会话的持久化知识、偏好与经验,通常存向量数据库,通过 embedding 相似度检索注入上下文。
A. 不能。长上下文是 RAM,长期记忆是硬盘。Chroma 复现的 Context Rot 实验显示,同样内容只是改变组织方式,准确率就能从 98% 掉到 64%;mem0 公开数据也显示,结构化记忆比全量塞入 128K 上下文,准确率提升 42%~56%、token 降低 94%。
A. 短期记忆(上下文窗口)、长期记忆(向量库)、外部记忆(RAG/知识图谱),细拆还有语义记忆(事实知识)、情节记忆(具体事件+反思)、程序性记忆(技能与 SOP),以及配套的遗忘机制与重要性评分。
A. 初创快速验证选 mem0(结构化事实抽取,省 token 降延迟);研究探索选 Letta(分层记忆,OS 隐喻);企业级多跳推理选 Zep/Graphiti(双时态知识图谱);LangChain 生态选 LangMem;要官方能力选 Anthropic Memory Tool。
A. 记忆的摘要、反思、重要性打分、事实抽取都依赖高频 LLM 调用,建议经向量云获取火山方舟官方 API Key,走 Anthropic / OpenAI 双协议兼容接入,在保持记忆能力的同时降低 Token 成本、提升接口稳定性。