
你先别骂模型“失忆”它的 Context 本来就不是 Long-term Memory。你正在做企业知识库 Agent 的验收。前五轮它表现很好能准确引用项目上线日期、负责人和审批规范。第六轮你随口问刚才提到的那条紧急变更审批规则后来被安全团队驳回了吗 Agent 停了一会儿回答说我之前的对话里没有这条信息。你翻回第三轮发现它明明引用过。项目同学第一反应是模型失忆了然后开始考虑上下文窗口不够要不要换更长窗口的模型要不要直接把 RAG 接上要不要用 MCP 把一堆工具串起来这些方向都贴着“Agent Memory”的边但又都没打在要害上。做企业级 Agent 的人迟早会在某个深夜面对同一个问题为什么模型看起来什么都懂却记不住自己说过的话真正的答案不是模型能力不行而是很多团队把 Context、RAG、MCP 当成了记忆本身。它们可以成为记忆的载体或通道但不是记忆系统。企业级 Agent Memory 真正要解决的是给信息建立分层的生命周期哪些是当轮对话的临时状态哪些要跨会话保留哪些必须经过校验、授权和审计之后才能写入长期存储。这篇文章想和你认真拆一遍Context 和 Long-term Memory 到底差在哪RAG 在记忆里承担什么角色MCP 为什么不能缺位以及真正落到生产环境时最容易在哪个环节翻车。1. 当 Agent 突然失忆先别急着骂模型1.1 一个让人血压升高的真实场景先还原一个我在团队里复盘过的案例。团队做了一个面向销售团队的客户助手希望它能在多轮对话里记住客户的行业、预算区间、决策链和上一轮沟通结论。Demo 阶段效果不错因为演示时问题比较连续模型窗口能装下整段对话。到了真实试用新的会话一开始Agent 就不认识客户了。销售同事说“还是之前那个客户”Agent 反问“请问您指的是哪个客户”。更麻烦的是如果某轮对话内容太长还会直接抛类似this models maximum context length is 1048576 tokens之类的报错或者提示context overflow。很多团队的第一反应是换一个上下文窗口更大的模型。这能缓解“单次塞不下”的问题但治标不治本。因为窗口再大也有尽头而且把大量历史消息堆进窗口并不会让模型更“懂”你只会让它从更多内容里找答案找错的风险反而更高。1.2 多数团队把“记住”理解窄了“记住”这个词在企业场景里其实包含三种完全不同的能力记住“这轮对话刚才说了什么”这是会话内的连续性由 Context 管理。记住“这个用户、这个项目在之前几个月里的偏好和决策”这是跨会话的长期记忆必须由存储系统管理。记住“Agent 有哪些工具、哪些数据源、哪些红线规则”这是系统能力和权限边界的记忆通常由配置、知识库和协议层管理。如果只用 Context 去承担这三种任务结果必然顾此失彼。你会在投入大量 token 之后发现用户偏好没记住工具权限写不进去历史决策又和最新规则互相打架。一个合格的 Agent Memory 架构不是让模型“记得更多”而是让不同类型的记忆各归其位。想做到这一点得先把 Context 和 Long-term Memory 的区别彻底掰开。2. 把概念拆开Context 是草稿纸Long-term Memory 才是档案室2.1 Context 解决的是“这一轮任务”不是“跨会话记忆”Context通俗说就是模型在生成回答时“手里能看到的全部内容”。它通常包括系统提示词、用户输入、历史消息、工具返回结果。模型每次生成回答都会把这些内容重新读取一遍。也就是说Context 是易失性的它在当前请求结束后就不存在了。可以把它理解成一张草稿纸。草稿纸上的内容只在当前这道题里有效。你换一张草稿纸上一张上的过程、草稿、备注就都不在了。模型不会因为你在上一轮输入过某些内容就在下一轮自动知道这些内容它必须每一轮都看到。很多人误以为“ChatGPT 记得我之前说过的话”其实是产品层把历史消息重新放进了下一次调用的 Context 里。这不是模型自带的能力而是工程上的“拼接”。如果拼接逻辑断了、超长了、或者没有把关键历史放进去Agent 就会显得失忆。所以Context 的正确使用方式是只放当前任务真正需要的内容。它不应该承担“所有历史都保存”的职责否则系统会变得越来越慢、越来越贵、也越来越容易出错。2.2 上下文窗口再大也替代不了长期记忆上下文窗口在快速变大从几万 token 到百万 token 都有。这会让人产生一种错觉既然窗口这么大是不是把所有历史都丢进去就行了不用额外做长期记忆你至少会遇到三个问题。第一是成本。每轮调用都要处理窗口里的所有 token历史越长费用和延迟增长得越明显。把几十万 token 的聊天记录反复塞给模型换来的是缓慢的响应和快速拉高的账单。第二是噪声。窗口越大和当前问题无关的内容也越多。模型需要从大量历史里找到少数关键信息注意力会被稀释。你会发现它开始关注一些不重要的细节甚至忽略用户最新给出的约束。第三是不可维护。记忆不是越多越好它需要更新。旧的客户表述、过期审批规则、已经被推翻的决策如果永远留在窗口里模型就永远分不清版本。长窗口可以避免“放不下”但不能解决“哪些该放、哪些该扔”的问题。这也是为什么社区里会出现大量关于 context overflow、上下文过长的讨论。模型给出了一个物理上限但工程上真正要守住的是“有效上下文”的上限而不是“全部历史”的上限。结论很朴素Context 解决的是单次任务的临场感Long-term Memory 解决的才是跨时间和跨会话的记忆连续性。两者是上下游关系不是替代关系。3. 企业级 Agent Memory 的分层架构别把所有信息塞进一个篮子3.1 四层记忆模型先建一张地图我在实践里倾向把 Agent Memory 分成四层。这四层各自有生命周期、存储介质和读写方式不能混着用。层级名称生命周期常见存储典型内容读写方式L0瞬时上下文当前请求内模型窗口系统提示词、当前用户输入、工具结果每次调用重新组装L1会话工作记忆单个会话内Redis、内存、Memcached会话状态、最近关键消息、临时变量API 参数传递或状态服务读取L2长期事实记忆跨会话按月或年向量库、结构化数据库、对象存储用户偏好、项目事实、历史决策、知识文档RAG 检索 结构化字段查询L3能力与规则记忆长期随系统更新配置文件、知识库、MCP 工具定义工具能力、审批规则、安全边界、行为偏好启动加载 / 动态发现L0 和 L1 解决的是“当前任务不丢上下文”。它们应该尽量轻量只保留当前步骤需要的信息。L2 才是很多人挂在嘴边的 Long-term Memory。它的价值在于会话结束后Agent 依然能回答“这位客户上个月提过什么需求”“这个项目为什么选择当前技术方案”。这些内容适合放进知识库或结构化记忆表而不是堆在对话记录里润色。L3 解决的是“Agent 知道它能做什么、不能做什么”。工具清单、调用权限、数据访问范围、输出红线这些属于系统级规则最好以配置形式存在由 MCP 这类协议层做统一暴露。3.2 为什么“全塞进上下文”在企业场景里走不通我们曾经在内部做过一次简单对比。同样是解决“客户在下一个会话里提到‘还是按上次说的办’”用两种方案实现方案 A 是每次对话都把该客户最近三个月的历史消息全部拼进 Context。效果看起来不错但每轮调用都需要处理大量历史文本延迟和成本都高而且历史消息里充满寒暄、临时讨论和未定事项模型经常分不清哪一条是最终结论。方案 B 是在对话过程中把已经确认的客户偏好和决策点提取出来写入 L2 长期记忆表下一轮开始前只检索最近使用过的、和当前问题相关的记忆片段再拼进 L0 Context。效果更稳定因为模型看到的是加工过的结论而不是原始流水账。企业级场景和 Demo 最大的区别正在于此你不能假设模型每次都面对一个干干净净的环境。真实生产里有多租户隔离、有权限控制、有数据过期、有审计需求。如果所有记忆都堆在对话历史和上下文里你会发现“记不住”只是表面症状真正的病根是没有任何一层存储系统在帮你管理信息。四层模型的本质是把记忆从“模型的一种不可控行为”变成“系统的一种可管理资源”。4. 用 RAG 把长期记忆变成可检索、可回写、可更新的系统4.1 长期记忆不能只做只读知识库要设计写入链路很多人一谈 RAG想到的就是“把文档切片、向量化、做相似度检索”。这个理解本身没错但如果把 RAG 用在 Agent Memory 里只做只读是不够的。原因很简单知识库是静态的记忆是动态的。你的项目文档可能三个月更新一次但一次对话里用户反馈的偏好、一个临时决策、一条最新审批状态可能几分钟后就要被后续会话引用。如果你不做写入链路这些信息永远只活在当轮 Context 里会话一结束就消失。我给长期记忆设计了这样一条最小写入链路从对话、工具执行结果或业务事件中提取候选记忆。用规则判断或让模型判断这条信息是否值得持久化它是不是一个稳定事实是否得到了用户确认是否涉及不该写入的敏感内容清洗记忆补全主体、时间、来源把口语化内容改写成便于检索的陈述句。权限校验当前用户是否有权限写入这条记忆数据是否属于当前租户写入存储文本向量化后进向量库结构化字段进数据库原始来源留一份引用地址。维护元数据写入时间、来源消息 ID、重要程度、过期时间。这里最容易被忽略的是第二步。很多团队把“写入”做成“全量记录”把用户随口说的一句“可能用 A 方案也行”也当成长期事实写进去。结果下次 Agent 就会把猜测当结论。判断力是长期记忆质量的核心不能省。4.2 读取链路query 改写、双路召回、重排有了长期记忆读取时也不能简单做一次 top-k 向量检索就完事。真实对话里用户很少会用规范语言提问。他们可能会说“上次聊的那个方案后来怎么定了”“还有印象吗”。如果直接把这句话拿去向量检索召回效果通常很差。所以先要做 query 改写把含指代、省略的问题改写成独立可检索的语句。然后在召回阶段我会建议做双路召回一路走向量库用语义相似度找到相关片段。一路走结构化查询用用户 ID、租户 ID、日期、状态、类型等字段做条件过滤。两路结果合并后还要重排。重排阶段可以消除两个问题一是排在前面但跟当前问题关系不大的片段二是新旧版本记忆互相矛盾时需要按时间戳、来源权威性来裁决。整个过程很像人回忆一件事你不是把人生所有片段都翻一遍而是先确定“大概哪段时间、和谁、发生在哪个项目”再去翻对应记录。RAG 做长期记忆读取本质上就是这个过程的外化。4.3 一个简化的记忆读写流程示例下面是一个偏伪代码的示例用于理解主流程。真实落地时需要根据你的数据库和框架做适配。# 记忆写入链路伪代码 def persist_memory(message, user_id, tenant_id): candidate extract_memory_candidate(message) if not should_persist(candidate): # 临时信息、未确认的猜测、敏感内容不写入 return None cleaned clean_memory(candidate) if not check_permission(user_id, tenant_id, cleaned): return None embedding embed_text(cleaned[content]) vector_db.insert( vectorembedding, metadata{ tenant_id: tenant_id, user_id: user_id, source_message: message[message_id], timestamp: message[timestamp], expired_at: cleaned.get(expired_at, None) } )# 记忆读取链路伪代码 def recall_memory(query, user_id, tenant_id): rewritten rewrite_query(query) # 指代消解、补全 vector_hits vector_db.search( embed(rewritten), filters{tenant_id: tenant_id, user_id: user_id}, top_k20 ) structured_hits sql_db.query( SELECT * FROM memory WHERE tenant_id? AND user_id? AND expired_at IS NULL, tenant_id, user_id ) fused merge_and_rerank(vector_hits, structured_hits) return build_memory_block(fused)这段流程看起来代码量不大但真正上线之后你会发现难点全在should_persist和merge_and_rerank这两个函数里。前者决定了长期记忆会不会被垃圾信息污染后者决定了模型能不能拿到真正有用的记忆。5. MCP 不是记忆本身而是“受控接口”5.1 MCP 在记忆架构里的三个关键价值MCP 是一个让模型和外部工具、数据源之间进行标准化交互的协议。对记忆系统来说它像是一套统一接口Agent 不需要关心底层是向量库、MySQL、REST API 还是内部文档系统只需要调用标准化的工具。在 Agent Memory 架构里MCP 的关键价值有三点。第一统一记忆读写入口。可以用一个 MCP server 暴露memory.search、memory.save、memory.delete这类工具。Agent 只知道“我有能力读取和写入记忆”不需要知道具体存储细节。这对模型是减负对系统是解耦。第二权限和审计前置。当记忆读写变成工具调用时你就可以在工具层做统一鉴权。谁有权限查询某个租户的长期记忆谁有权限写入一条用户偏好每次查询是否留下日志这些问题不再散落在业务代码里而是在 MCP 层集中处理。第三工具能力可扩展。你想让 Agent 额外读取 CRM、工单系统或数据库里的信息不需要修改主对话流程只需要新增或调整 MCP server。这种扩展方式对长期维护比较友好。5.2 别为了 MCP 而 MCP适用边界要清楚MCP 这段时间非常热但越热越要冷静。它不是银弹。如果你只是本地内存里保存会话状态完全没必要引入 MCP 和网络请求如果记忆存储在同一个服务内部直接函数调用可能更高效。为了“架构先进”而把内部函数调用强行改成 MCP带来的网络延迟和运维复杂度是实实在在的。我建议这样判断当记忆读写需要跨服务、跨团队、或者需要严格控制权限和审计时才适合用 MCP 暴露成外部工具。它更适合在企业内部充当“记忆和外部数据系统的受控网关”而不是所有场景的标配。另外MCP 是接口规范不是存储。接上 MCP server 不代表 Agent 就有了长期记忆。记忆本身还存储在向量库、数据库和文件系统里。MCP 只是让模型能稳定、安全地操作这些存储。6. 真正企业级的难点记忆如何更新、遗忘和合规6.1 只增不删的记忆系统用半年就会退化长期记忆和数据库一样不能只做 insert不做 update 和 delete。原因有两个一是检索精度会下降。当你存了一万条历史记忆模型检索时很难每次都精准命中当前最相关的一条旧信息会持续制造噪声。二是信息冲突。用户一个月前说“偏好用 A 供应商”上周改成了“换到 B 供应商”。如果系统没有更新机制模型可能把两个偏好都呈现给用户甚至引用过期的 A 方案。解决思路是版本化和状态标记而不是物理覆盖。当新记忆和旧记忆冲突时把旧记忆标记为superseded并保留指向新记忆的来源链接。这样检索时不会把过期内容当成当前事实但审计时依然能看到完整变更历史。你还可以给记忆设计一个重要性评分。高频命中的记忆权重更高长时间未命中的记忆定期降权。降到冷阈值以下后可以归档到冷存储减少在线检索的干扰。这个机制听起来很吸引人但在企业落地时要注意不是所有记忆都适合自动淘汰。如果一条记忆涉及合同、合规或安全事项即使长期没被命中也不能轻易清除。必须靠记忆分级来处理。一个更稳妥的分级方式是业务型记忆按热度和重要度做衰减合规型记忆走独立保留期到期由人工或任务确认后再处理。6.2 隐私、隔离和可解释性比“记得全”更重要在企业场景里长期记忆是资产也是风险。你可以在记忆里存放用户偏好但最好不要把用户明文密码、银行卡号、敏感身份信息写进长期记忆。这不仅是技术判断更是数据合规的基本要求。如果确实需要记录必须加密存储、限制访问权限、并且记录访问日志。多租户场景下记忆隔离尤其重要。租户 A 的记忆不应该被租户 B 的 Agent 检索到。隔离可以分两种程度简单做法是在元数据里加tenant_id过滤更稳妥的做法是按租户独立索引或独立数据库。过滤方式实现快但容易出现“忘记过滤”之类的低级错误独立实例更安全但成本更高。你可以先按数据敏感程度选。最后是可解释性。每一条长期记忆最好都带上来源、时间戳、写入方。这样当模型基于某条记忆回答时系统能说清楚“它为什么知道”。否则 Agent 一旦一本正经地给出错误结论团队连追溯的入口都没有这在企业环境里几乎不可接受。7. 从 Demo 到生产落地路径、排查链路与适用边界7.1 四步落地路径不要贪多如果你现在正处于“想给 Agent 加上记忆”的起步阶段我建议不要一上来就做完整平台。更稳的顺序是先跑通单点再延伸到整张链路。第一步把单会话内的状态管理做好。先保证 Agent 在同一个会话内不会丢失“刚刚聊过什么”。这一步如果做不好后面所有记忆增强都是沙子上的塔。第二步引入只读 RAG把项目文档、公司手册、历史问题记录变成可检索知识。这个阶段先不做写回只验证“模型能不能在里面找到需要的信息”。第三步增加记忆写入链路。等只读 RAG 验证通过后再支持把对话中确认过的用户偏好、决策、结论沉淀到长期记忆。第四步接入 MCP 或类似的工具协议层对记忆读写做权限、日志和审计。这是企业落地的关键一步也是和单纯个人开发者的最大区别。每一步都要小规模验证不要一次性全部铺开。7.2 “失忆”问题按这个顺序排查如果 Agent 在生产环境出现“明明之前知道现在却忘了”或者“引用了一条过期信息”我一般按这个顺序排查先看现象是当前会话内丢上下文还是跨会话完全失忆两者的排查方向完全不同。再看 Context 拼接模型真正收到了哪些内容系统提示词是否把工作记忆放进去历史消息是否被截断有没有把长期记忆注入再看检索链路query 改写是否合理向量检索有没有把租户、用户 ID 作为过滤条件重排有没有把正确结果刷掉再看写入链路候选记忆是否被错误地过滤掉有没有写入成功写入时元数据是否完整重要性和过期时间是否正确再看权限和日志是否因为权限校验失败导致没有返回记忆还是因为某条记忆来源不可信被系统的审计逻辑过滤了这个顺序遵循一个基本原则先确定问题是出在“输入没进去”“内存没找到”还是“权限没放行”。不要一上来就改 prompt、换模型。7.3 哪些场景暂时不需要这套复杂架构不是所有 Agent 都需要完整长期记忆这个结论要说得足够直白。如果是简单的单轮问答工具、一次性文档摘要、或者内部工具调用场景用户不太会在意“你还记不记得上一个问题”那 Context 加少量结构化存储就够了。强行引入 L2 长期记忆和 MCP 网关只会增加系统复杂度和排查难题。需要这套架构的信号一般有三个用户会在不同会话里提起同一个客户、项目或需求。Agent 需要在回答时引用历史决策或用户偏好。团队有审计、权限和数据合规方面的强制要求。如果你遇到的是这三个问题那大概率需要的不是一个更长的 Context而是一套真正有写入、有检索、有更新、有遗忘的长期记忆系统。回到开头那个验收场景。当你再次遇到 Agent“失忆”先别急着换模型。先打开调用日志看看它这一轮到底拿到的是哪些内容。很多时候你会发现它不是没有能力记住而是你的系统根本没有把记忆送到它面前。企业级 Agent Memory 的落点从来不是把上下文窗口撑大而是围绕 Context 建立一套分层、可控、可追溯的长期记忆体系。Context 决定这次任务能走多远RAG 决定 Agent 能查到多准MCP 决定外部能力和权限能不能被统一管理。把这三者组合起来不贪大、不堆料先从最小链路跑通再一层层补上权限和更新策略才是一条真正能长期走下去的路。