尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

AI Agent记忆系统分层架构:从Context到长期记忆的工程实践

AI Agent记忆系统分层架构:从Context到长期记忆的工程实践 当你把一个 AI Agent 从 Demo 推向生产环境时第一个撞上的墙往往不是模型能力不够而是“记忆”无处安放。这个现象在最近几个月变得尤其明显。你在各种技术社区里会频繁看到类似的报错api error: 400 this models maximum context length is 1048576 tokens.或者codex ran out of room in the models context window. start a new thread or c...再或者context is too large and auto-compaction could not recover this turn.这些报错背后指向的是同一个问题Agent 的上下文窗口是有限的但真实业务场景中的信息量是无限的。当你试图让 Agent 完成一个跨多轮、跨会话、甚至跨团队协作的长期任务时把一切都塞进 Context 的做法必然失效。本文想讨论的不是“怎么把 Context 调大”而是更本质的问题Agent 的记忆系统应该如何分层架构如何工程化治理以及 LangChain、LangGraph、DeepAgent 这类框架在这个问题上的解题思路分别是什么。如果你正在做 AI Agent 的企业级落地或者刚接触 Agent 开发不久但想避开记忆设计上的大坑这篇文章值得读完。1. 这篇文章真正要解决的问题先说一个明确的判断Agent 的生产力瓶颈已经从“模型推理能力”转移到了“记忆管理能力”。为什么这么说因为单轮对话的模型能力已经足够强但在真实业务里Agent 很少只回答一个问题。它可能需要连续处理一个工单的多个环节从信息收集、方案制定到执行确认。在多次会话之间记住用户的偏好和历史决策。在企业知识库之上完成跨文档的推理而不是每次都重新检索一遍。在长流程执行中不被中间步骤产生的海量中间结果撑爆上下文。这些场景有一个共同点Agent 需要区分“这次任务中要用的信息”和“以后还可能再用到的信息”。前者是工作记忆后者是长期记忆。如果不对这两种信息做架构上的区分直接把所有内容塞进 Context那么上面那些报错就是必然结果。这篇文章会围绕以下三条主线展开第一讲清楚 Context、短期记忆和长期记忆的本质区别帮你建立 Agent 记忆分层的整体认知。第二结合 LangChain、LangGraph 和 DeepAgent 这三个框架分别说明它们在记忆管理上的实现思路和工程边界。LangChain 覆盖面广、上手快LangGraph 以图状态机为核心适合企业级复杂流程DeepAgent 则代表着更面向长期记忆的产品化探索。第三给出一个可以落地的工程治理框架记忆内容如何存储、如何检索、如何压缩、如何做权限控制、如何在出问题时追溯。这些才是企业级项目里真正决定成败的细节。读完这篇文章你会知道一个可供生产参考的 Agent 记忆系统应该长什么样也会理解为什么“给模型加记忆”这件事本质上是一个系统工程问题而不是简单的 API 调用或数据库存储。2. Agent 记忆的核心概念Context、工作记忆与长期记忆很多开发者对 Agent 记忆的理解是从“让多轮对话不丢失上下文”开始的。这个理解没错但远远不够。2.1 Context模型的“工作台”不是“仓库”Context上下文窗口是模型一次推理时能看到的全部信息。你可以把它想象成一张工作台桌面上能摆多少文件决定了这次任务能不能顺利处理。在这张工作台上至少有以下几类内容系统指令System Prompt定义 Agent 的角色和行为边界。用户输入包括当前问题和历史对话。工具调用结果比如检索到的文档片段、API 返回的数据、代码执行结果。中间推理过程包括 Agent 的思考步骤和规划结果。问题在于这张工作台的总面积是有限的。无论是 128K、200K 还是最近常见的 1M tokens一旦超出限制模型就无法继续工作。更重要的是Context 越大模型的注意力越容易被稀释。你可能有过这种体验让模型处理一个 100K tokens 的长文档时它经常“忘记”文档开头的关键信息。这不是模型变笨了而是注意力机制在超长上下文下的固有局限。所以Context 的正确使用方式是“精炼、按需、可回收”而不是“全部塞进去”。它适合存放当前任务必需的信息不适合作为长期存储。2.2 短期记忆一次任务过程中的“便签纸”短期记忆也叫工作记忆或会话记忆指的是 Agent 在一次任务执行过程中需要保留的状态信息。举个具体例子。一个客服 Agent 在处理用户退款请求时需要记住这些信息用户当前会话中已经提供的信息比如订单号、退款原因。当前处理到哪一步了是否已经向用户确认过。从订单系统查到的订单状态和金额。内部流程的规则约束比如哪些商品不支持无理由退款。短期记忆的特点是生命周期短、更新频繁、与当前任务强相关。任务结束后这些信息大部分不再有保存价值。在实现层面短期记忆最简单的形式就是“把历史消息拼进 Prompt”但更成熟的方案是用状态对象State来管理。LangGraph 的核心设计思路就是用一组结构化的 State 字段来承载短期记忆而不是单纯依赖对话历史的拼接。2.3 长期记忆Agent 的“知识库”和“人格底座”长期记忆解决的是“Agent 如何记住跨会话的信息”这个问题。想象一个场景用户每周都和同一个理财 Agent 沟通第五次交流时Agent 应该记得用户之前提到过的风险偏好、家庭情况、之前推荐的产品的接受程度。这些信息不能放在 Context 里——它们会占用大量空间而且大部分时间用不上。它们应该被结构化地存储起来在需要时被检索调用。长期记忆又可以细分为两类事实性记忆用户是谁、偏好是什么、历史决策有哪些。这类信息适合用结构化数据库或键值存储保存。经验性记忆Agent 从过往任务中学到的处理模式比如“这类工单通常需要先走财务审核”。这类信息带有一定的主观性和归纳性适合用语义向量库保存通过相似度检索召回。长期记忆的工程难度比短期记忆高一个数量级。它涉及存储选型、数据更新策略、检索质量、权限隔离、隐私合规等问题。这也是为什么很多 Agent 框架在早期版本里并不支持长期记忆——它不是一个“加个数据库”就能解决的问题。2.4 三类记忆的边界与关系用一个表格来总结三者差异维度Context 上下文短期记忆长期记忆生命周期单次推理单次任务/会话跨会话、长期存储位置模型输入状态对象/会话存储数据库/向量库/文件数据量级受模型上下文限制受任务复杂度限制理论上可无限增长更新频率每次推理都变化任务过程中频繁变化低频写入、高频读取核心目标提供当前推理所需信息维持任务执行的一致性沉淀知识、个性化、持续学习这里想强调一个容易被忽略的点三者之间不是相互替代关系而是分层协作关系。一个健康的 Agent 记忆系统应该是长期记忆按需检索检索结果和实时状态写入短期记忆短期记忆中的关键信息在每次推理时被压缩进 Context。如果你在设计 Agent 时发现 Context 总是不够用大概率不是模型窗口太小而是记忆分层没做好。3. 为什么 Agent 记忆是“工程问题”而非“模型问题”很多团队在遇到 Context 超限时第一反应是换一个上下文更长的模型。这是可以理解的但往往治标不治本。3.1 模型窗口扩展的局限性从材料中也能看到现在主流模型已经支撑到百万级 token 的上下文窗口。这确实能缓解一部分压力但它没有解决三个根本问题第一成本问题。长上下文的每次推理都意味着更高的 token 消耗和更长的响应延迟。如果把所有信息都塞进 Context等于用昂贵的 API 调用代替了本该由存储和检索完成的低成本工作。第二注意力衰减问题。模型在处理超长上下文时对中间位置信息的关注度会降低。信息越多模型越容易被最新内容带偏忽略前面的关键约束。这对企业级应用来说是致命的。第三状态一致性问题。如果 Agent 的所有状态都“隐式地”存在于上下文文本中那么一旦上下文被截断或压缩状态就会丢失。而且你无法用程序化的方式判断当前 Agent“到底知道什么、不知道什么”。这在需要审计和追溯的企业场景里是不可接受的。3.2 企业级记忆系统的真实需求企业级 Agent 与个人玩具级 Agent 最大的区别在于对“可控性”和“可观测性”的要求。在企业环境里Agent 的记忆不是一个黑盒。你需要回答这些问题这个 Agent 记住用户的哪些信息了存在哪里这些信息的更新和删除策略是什么敏感数据是否做了权限隔离当 Agent 做出错误决策时能否追溯到是哪个历史信息导致的当记忆数据出问题时能否一键回滚或清理这些问题都没有办法通过“调大模型窗口”来解决。它们需要的是架构设计记忆存储用什么中间件、记忆写入和读取的接口如何抽象、记忆更新的触发时机如何控制、记忆内容的权限模型如何设计。3.3 从提示词工程到记忆工程的转变过去两年提示词工程Prompt Engineering是非常热门的话题。但你会发现当 Agent 从“回答问题”走向“执行任务”时提示词能覆盖的范围越来越有限。原因很简单提示词是静态的任务是动态的。记忆工程解决的问题就是“如何根据当前任务动态地组装出最合适的提示词”。它需要判断当前任务需要哪些历史信息哪些可以丢弃信息应该以原文形式给模型还是先做摘要压缩不同来源的信息发生冲突时以哪个为准信息检索不到时是如实告知还是用默认值兜底这些判断逻辑本身就是一套复杂的工程系统。框架能帮你把基础设施搭好但具体的记忆策略仍然需要业务团队根据场景来设计。4. 记忆系统的分层架构设计与工程治理框架在进入具体框架之前先把“目标架构”画出来。这样你在看后面的代码时才知道每一个组件在整体中承担什么职责。4.1 分层架构的五层设计一个适合企业生产的 Agent 记忆系统建议拆成五层第一层交互接入层。负责接收用户输入、输出 Agent 回复。这一层不做记忆处理只做格式转换和链路透传。第二层短期状态层。维护当前任务的状态机。记录任务进行到哪一步、已经收集了哪些关键字段、有哪些待办事项。在 LangGraph 里这一层就是 State 对象在传统开发里这一层可能是一张任务表。第三层上下文编排层。负责在每次推理前从短期状态和历史记忆中筛选出当前最优的上下文内容组装成 Prompt。这是记忆系统中最核心、最需要“工程手感”的一层。做得好的上下文编排能用极少的 token 达到极好的效果。第四层长期存储层。负责持久化跨会话的信息。根据数据形态选择不同存储结构化数据用 Postgres/MySQL非结构化文本用 Redis 或文件存储语义搜索用向量数据库。第五层治理与审计层。负责记忆内容的权限控制、生命周期管理、质量监控和审计日志。这一层在 Demo 里可以省略但在企业环境中是合规底线。4.2 记忆的四个关键操作无论用哪个框架记忆系统本质上都在处理四个操作写入Write什么信息值得记住不是所有对话内容都需要持久化。需要设计一套“记忆提取”机制从对话中提炼出有长期价值的信息。检索Retrieve面对一个新的用户请求如何从大量历史记忆中找到相关的部分这需要索引和检索策略可能是关键词匹配、向量相似度也可能是规则触发的定向查询。更新Update记忆不是一成不变的。用户的偏好会变业务规则会变Agent 对某一事实的理解也在变。更新策略要解决“新旧信息冲突时怎么办”的问题。遗忘Forget这一点最容易被忽略但在企业合规中极其重要。用户有权要求删除自己的数据过期的业务信息也不应该永远占用存储。遗忘机制包括定期清理、按规则自动过期、以及用户主动触发的数据删除。这四个操作中“遗忘”是当前大多数 Agent 框架做得最薄弱的部分。不少团队在搭建记忆系统时只考虑了怎么存、怎么取没有考虑怎么删。这在个人工具里问题不大但在企业系统里很可能会在合规审查时被一票否决。4.3 上下文压缩工程治理的关键手段即使你已经做好了分层Context 依然有可能在一次复杂任务中被大量中间结果占满。这时候就需要“上下文压缩”来做兜底。常见的压缩策略包括摘要式压缩把冗长的历史对话用大模型生成一段摘要保留关键信息丢弃细节。裁剪式压缩只保留最近 N 轮对话更早的内容直接丢弃或转存到长期记忆。关键信息提取从历史对话中提取结构化字段比如订单号、时间、金额保存为 JSON 状态。选择哪种策略取决于你对“信息保真度”的要求。有些任务比如法律咨询细节就是生命摘要压缩不可接受有些任务比如闲聊式的信息收集细节无关紧要摘要就够用。这里要特别注意上下文压缩不是越多越好。过度压缩会丢失关键信息导致 Agent 行为和早期不一致。一个稳妥的做法是先保存完整的历史到存储层然后在每次推理时根据任务需要决定放多少进 Context。换句话说压缩的目的是“减少 Context 占用”而不是“删除历史记录”。5. LangChain 的 Agent 记忆能力与工程边界LangChain 是最早一批把 Agent 记忆做成标准化模块的框架之一。对于刚接触 Agent 开发的读者LangChain 是一个不错的起点。5.1 LangChain 记忆模块的核心思路LangChain 把记忆抽象为两个接口ChatMessageHistory负责消息的存储和读取BaseMemory负责在每次调用前把记忆内容注入到 Prompt 中。它提供多种内置记忆类型记忆类型工作原理适用场景ConversationBufferMemory保存全部历史消息直接拼入 Prompt短对话、对信息保真度要求高ConversationBufferWindowMemory只保留最近 K 轮消息普通多轮对话ConversationSummaryMemory用摘要替代完整历史长对话、信息密度低ConversationSummaryBufferMemory结合摘要和窗口兼顾细节与长度大多数业务场景VectorStoreRetrieverMemory从向量库中检索相关历史需要跨会话召回用户偏好5.2 LangChain 记忆实现示例下面是一个使用ConversationSummaryBufferMemory的示例组合了摘要和窗口两种策略。它会在对话较短时保留完整消息在对话超过max_token_limit后自动把更早的消息改为摘要。# 文件路径examples/langchain_memory_demo.py from langchain.memory import ConversationSummaryBufferMemory from langchain_openai import ChatOpenAI llm ChatOpenAI(modelgpt-4o-mini, temperature0) memory ConversationSummaryBufferMemory( llmllm, max_token_limit500, return_messagesTrue, memory_keychat_history, ) # 模拟多轮对话 memory.save_context({input: 你好我叫小林是一名后端工程师。}, {output: 你好小林很高兴认识你}) memory.save_context({input: 我在负责一个工单系统的重构项目。}, {output: 了解工单系统重构通常要关注状态流转和数据一致性。}) memory.save_context({input: 目前最大的痛点是历史工单的检索效率太低。}, {output: 这个问题可以考虑引入全文索引或向量检索。}) # 打印记忆内容观察摘要和原消息的混用 messages memory.load_memory_variables({})[chat_history] for msg in messages: print(f{msg.type}: {msg.content})运行这段代码你会发现最终记忆里既有完整的最近消息也有被压缩后的历史摘要。LangChain 会调用你配置的大模型来生成摘要所以max_token_limit的值决定了触发摘要的门槛。5.3 LangChain 在企业级场景中的边界LangChain 记忆模块的定位是“开箱即用的组件”但它有几个问题值得注意第一记忆内容与业务逻辑耦合较浅。LangChain 的记忆本质上是“把历史文本塞进 Prompt”它不理解你的业务状态。如果你的 Agent 需要精确管理任务状态比如“当前流程卡在财务审批环节”LangChain 的通用记忆就不能直接满足。第二存储层抽象较薄。LangChain 的ChatMessageHistory可以对接 Redis、SQLite 等但它没有给出一套完整的“记忆分层、权限隔离、生命周期管理”方案。这些需要你自己做。第三复杂的流程控制能力不足。当 Agent 的逻辑从简单的“聊天 工具调用”变成复杂的多分支、多角色协作时LangChain 的链式抽象会变得难以维护。这并不意味着 LangChain 不好用。恰恰相反对于 MVP 验证或者中小型项目LangChain 用极低的成本帮你解决了“让 Agent 有记忆”这个基础问题。只是到了企业级复杂度你需要更结构化的方案——这就是 LangGraph 出现的背景。6. LangGraph用状态机架构治理 Agent 记忆与流程LangGraph 是 LangChain 团队推出的新一代 Agent 编排框架。它和 LangChain 的核心区别在于LangChain 是“链”LangGraph 是“图”。这个差异对记忆管理有深远影响。6.1 为什么状态图比链更适合 Agent 记忆在 LangChain 模式里一个 Agent 的执行流程是预先写好的线性链接收输入 - 调用工具 - 返回输出。如果要处理分支你需要写大量 if-else 逻辑。在 LangGraph 模式里Agent 的执行流程被建模为一张图节点是计算单元可以是 Prompt 调用、工具执行、条件判断边是节点之间的连接关系。每次执行Agent 根据当前状态决定走哪条边、进入哪个节点。这个设计对记忆系统最大的好处是状态成为显式的一等公民。在 LangGraph 中你可以定义一个 State 对象它的字段就是 Agent 需要维护的全部短期记忆。每当 Agent 执行完一个节点State 中的某些字段会被更新。这种显式状态管理让“Agent 现在知道什么、不知道什么”变得高度可观测、可测试、可回滚。6.2 LangGraph 状态记忆与持久化示例下面是一个基于 LangGraph 的多步任务示例。它模拟了一个“信息收集 - 审批 - 执行”的流程用 State 承载任务状态。# 文件路径examples/langgraph_state_demo.py from typing import TypedDict, Annotated, Literal from langgraph.graph import StateGraph, END from langgraph.checkpoint.memory import MemorySaver class AgentState(TypedDict): user_name: str request_type: str need_approval: bool approved: bool messages: list def collect_info(state: AgentState): 模拟信息收集节点。实际项目中这里会对接表单或意图识别模型。 print(f[collect_info] 收到请求: {state[request_type]}) return { need_approval: state[request_type] in {退款, 权限申请}, messages: state[messages] [信息收集完成], } def decide_approval(state: AgentState) - Literal[approve, direct_execute]: 条件路由根据是否需要审批决定下一步走哪个节点。 print(f[decide_approval] need_approval {state[need_approval]}) return approve if state[need_approval] else direct_execute def approve(state: AgentState): 模拟审批节点。 print(f[approve] 用户 {state[user_name]} 的审批通过) return {approved: True, messages: state[messages] [审批通过]} def execute(state: AgentState): 模拟最终执行节点。 print(f[execute] 执行 {state[request_type]}审批状态: {state.get(approved, False)}) return {messages: state[messages] [执行完成]} # 构建状态图 builder StateGraph(AgentState) builder.add_node(collect_info, collect_info) builder.add_node(approve, approve) builder.add_node(execute, execute) builder.set_entry_point(collect_info) builder.add_conditional_edges(collect_info, decide_approval, { approve: approve, direct_execute: execute, }) builder.add_edge(approve, execute) builder.add_edge(execute, END) # 使用 MemorySaver 开启状态持久化 checkpointer MemorySaver() graph builder.compile(checkpointercheckpointer) # 模拟一次完整任务 result graph.invoke( { user_name: 小林, request_type: 权限申请, need_approval: False, approved: False, messages: [], }, config{configurable: {thread_id: task-001}}, ) print(最终状态:, result)这段代码里有几个关键设计条件路由对应decide_approval函数它根据 State 中的need_approval字段决定流程走向。这就是 LangGraph 入门教程中常说的conditional_edge的核心用法。状态持久化通过MemorySaver实现thread_id用于区分不同任务。当你想恢复某个未完成的任务时用同一个thread_id再次调用graph.invoke即可。显式状态字段让记忆变得可编程。你不需要从大段对话文本里“猜”当前状态直接读取state[approved]就知道审批结果。6.3 LangGraph 子图与模块化记忆企业级 Agent 系统通常由多个子任务组成。比如一个“订单售后 Agent”可能有退款子图、物流查询子图、人工升级子图。如果全部画在一张图里节点过多状态字段也会互相污染。LangGraph 支持把子图嵌入到父图中。子图可以有自己的内部状态同时在父图层面共享必要的上下文。这种模块化设计对记忆的隔离性很有帮助退款子图的内部状态不会干扰物流查询子图。从工程治理角度看这比单个大图更容易测试和维护。每个子图都可以单独验证输入特定的 State检查输出是否符合预期。6.4 LangGraph 与 LangChain 的选择建议对比维度LangChainLangGraph抽象模型链式调用有向状态图状态管理隐式靠 Prompt 和历史消息显式State 对象流程控制线性为主分支需要额外逻辑原生支持条件路由、循环、并行可观测性一般较强每个节点可以记录状态变化学习曲线较平缓稍高需要理解图模型企业级适合度适合 MVP 和简单工具适合复杂业务流和长流程任务现在网上关于“LangGraph 和 LangChain 的区别”讨论很多有些人认为 LangGraph 会取代 LangChain。更稳妥的判断是LangChain 提供组件库LangGraph 提供编排引擎两者在 LangChain 生态内是互补关系。LangGraph 适合处理有明确流程和状态流转的业务LangChain 适合快速组合模型和工具。回到记忆这个话题如果你只是做“带点历史记忆的聊天机器人”LangChain 就够了如果你要做“执行真实业务任务的 Agent”必须用显式状态管理的方案否则后期一定会被状态混乱拖垮。从工程治理角度看LangGraph 提供的图结构和持久化机制正是企业级 Agent 记忆系统需要的底座。7. DeepAgent长期记忆与产品化探索在 LangChain 和 LangGraph 之外DeepAgent 是最近被频繁讨论的 Agent 框架方向。虽然不同团队对“DeepAgent”的定义不完全一致但这个名字代表了一个共识Agent 不能只依赖外部框架的记忆组件它需要一种更内化、更持久的记忆机制。7.1 DeepAgent 的产品定位从行业讨论来看DeepAgent 方向的框架通常瞄准两个目标第一深度智能体。强调 Agent 不只是一个“调用大模型的壳”而是具备感知、规划、记忆、工具调用、自我反思的完整智能体。这意味着记忆不是附属功能而是核心架构的一部分。第二持续学习。DeepAgent 框架普遍重视“从过往交互中学习”。比如用户纠正了 Agent 的错误后Agent 能否把这次纠正转化为长期记忆下次不再犯同样的错这已经不是简单的“历史消息回放”而是涉及到经验性记忆的沉淀。7.2 DeepAgent 在记忆系统上的启发虽然没有统一的官方文档可以直接引用但从相关讨论中可以提炼出几个有价值的产品设计方向记忆按主题分组同一个用户的金融偏好、技术背景、沟通风格分别存储检索时按主题精准召回。记忆有置信度Agent 对于“用户是后端工程师”这个信息的置信度会比“用户可能喜欢 Python”更高。置信度低的记忆不应该在决策中占据太高的权重。记忆可被用户编辑用户可以查看 Agent 记住了自己什么可以修改或删除。这一点在企业级应用里几乎是刚需。记忆与工具解耦记忆引擎是整个 Agent 运行时的共享底座而不是绑定在某个具体的模型或工具链上。这些理念虽然看起来“很简单”却在工程实现上有不小的难度。比如“置信度”怎么量化编辑记忆后Agent 的行为一致性如何保证这些问题都需要长期的架构打磨。7.3 如何从架构视角看待 DeepAgent对于实际做项目的读者我的建议是不要太早绑定某一个具体框架而是先用框架验证场景再把验证通过的场景沉淀为通用的记忆抽象层。你可以把 LangGraph 当作流程编排底座把 LangChain 当作组件库把 DeepAgent 理念中关于长期记忆的部分作为你设计存储模型时的参考。更关键的是自己设计一套面向业务的记忆接口# 文件路径examples/memory_abstraction.py from abc import ABC, abstractmethod class MemoryProvider(ABC): 长期记忆的统一访问接口 abstractmethod def save_fact(self, user_id: str, key: str, value: str, confidence: float 1.0): 保存一条结构化事实 pass abstractmethod def get_fact(self, user_id: str, key: str) - dict | None: 读取一条结构化事实 pass abstractmethod def search_semantic(self, user_id: str, query: str, top_k: int 5) - list[dict]: 基于语义相似度召回相关历史记忆 pass abstractmethod def delete_fact(self, user_id: str, key: str): 删除一条事实满足用户删除权 pass这只是一个最小的接口抽象。好处是你的业务逻辑只依赖这个接口不依赖底层是 Redis、向量库还是内存。将来要换框架或升级存储只需要实现新的MemoryProvider。这个思路比“用哪个框架”本身更重要框架会迭代接口是资产。8. 常见问题与排查思路在实际的 Agent 记忆系统开发中下面几个问题是出现频率最高的。把它们整理成一张排查表建议收藏备用。问题现象可能原因排查方式解决方案请求报错maximum context length exceeded会话历史太长没有进行压缩或裁剪打印当前 Prompt 的 token 数量检查是否超过模型限制启用摘要压缩把历史消息转存到长期记忆只保留最近 N 轮必要消息消息处理报错context is too large and auto-compaction could not recover上下文超出过多自动压缩后的摘要仍然超过窗口限制检查压缩逻辑的 token 估算是否准确检查摘要是否保留了过多细节降低摘要生成的max_token_limit在压缩前先把原文完整持久化考虑把超长文档改为向量检索Agent 处理长任务时“忘记”前文状态管理不完善上下文被截断或覆盖查看状态对象的完整快照检查状态更新函数是否有误使用 LangGraph 的 State 对象显式维护关键字段增加关键信息写入日志多用户使用同一实例时记忆串线没有按用户/会话维度隔离记忆存储检查记忆存取时是否传入了user_id或thread_id所有记忆操作必须带上业务标识在持久化层增加租户过滤条件记忆检索结果与当前问题无关相似度检索策略太粗糙没有结合业务规则过滤查看召回记录的评分和原始内容增加关键词前置过滤使用混合检索关键词 向量为不同记忆类型建立独立索引历史记忆被错误更新新旧信息冲突处理逻辑缺失确认更新逻辑是“直接覆盖”还是“读取后合并”设计版本化记忆结构写入前检查是否已有旧值高置信度旧值不应被低置信度新值覆盖用户要求删除数据但无法定位记忆对象与用户身份未做映射检查存储中是否存在按用户维度的索引建立用户 ID 到所有记忆对象的映射表实现递归删除能力多个 Agent 流程共享状态导致干扰子图之间状态未做隔离检查 State 中是否有子图专属字段混入父级为每个子图定义独立的内部 State父图只保留跨子图共享的必要字段8.1 一个典型排错案例假设你的 Agent 在处理一个包含 200K tokens 文档的任务时报错api error: 400 this models maximum context length is 1048576 tokens.注意这里模型上限是 1M tokens但仍然报错说明请求内容本身超过了模型的上下文窗口总和系统提示 历史消息 工具结果 用户输入。排查顺序打印发送给模型的完整请求统计各部分 token 占比。如果工具结果占大头把工具结果改为“摘要 关键字段提取”不要直接透传原始文档。如果历史消息占大头启用摘要压缩把早期对话转为一段精炼摘要。如果系统提示占大头拆分出“固定指令”和“动态上下文”固定指令可以预编译不参与每次的动态计算。9. 企业级 Agent 记忆系统的最佳实践与工程建议最后把前面所有内容沉淀为 8 条工程建议。这些建议来自对大量 Agent 项目的观察和总结不一定覆盖所有场景但值得每一个做企业级 Agent 的团队认真参考。9.1 记忆分层必须从第一天就做很多团队在原型阶段用简单的“全量对话记录 直接拼 Prompt”跑通了就以为不需要做记忆分层。项目上线两三个月后问题集中爆发Context 经常超限、响应速度越来越慢、数据难以治理。技术债务一旦产生重构成本往往远超一开始多花两天设计分层的成本。9.2 状态管理要显式化、可观测化不要让你的 Agent 的“当前状态”只存在于模型的隐式理解中。把状态字段拆出来明确定义每个字段的含义、更新时机、取值范围。这样你才能写单元测试才能输出审计日志。在 LangGraph 中这意味着认真设计 State 的TypedDict。字段不是越多越好而是“任务真正需要长期跟踪的才放入 State一次性使用的临时变量留在节点内部”。9.3 长期记忆要设计“遗忘机制”这一点再怎么强调都不为过。Agent 的记忆系统如果只能写入、不能删除在企业级环境中会变成合规风险。建议至少实现以下能力按用户维度删除全部记忆。按记忆类型设置过期时间。支持人工后台清理敏感内容。9.4 优先级检索质量 存储容量 模型窗口在有限的研发资源下把精力放在提升检索召回质量上比盲目堆存储容量更有价值。一个召回精准的 10 条记忆胜过检索模糊的 100 条历史记录。提升检索质量的具体方向包括为不同数据源建立独立索引、引入时间衰减权重、用业务规则过滤候选集、在应用层对召回结果排序。9.5 注意 Agent 安全的边界记忆系统中存储的往往是最敏感的用户信息。在设计时建议遵循最小权限原则不同角色只能访问自己权限范围内的记忆数据。记忆内容的读取和更新都要有审计日志。在生产环境测试退出或数据清理功能时先在测试环境验证并做好备份和回滚方案。9.6 把上下文压缩做成可回退方案当 Agent 执行失败需要重试时如果原始上下文已经被压缩处理过重试时可能面临信息缺失。稳妥的做法是压缩前先持久化完整上下文到存储层。这样即使压缩后的重试失败仍然可以从原始记录中恢复。9.7 为每个 Agent 任务设定“记忆边界”不是所有信息都需要被 Agent 记住。在设计阶段明确回答这个 Agent 需要记住哪些业务实体哪些信息随任务结束即可丢弃哪些信息必须跨会话保留没有边界地记忆最终会让系统臃肿、检索变慢、错误率上升。9.8 框架只是起点沉淀自己的记忆抽象层LangChain、LangGraph、DeepAgent 都在快速演进。今天的最佳实践半年后可能就过时了。唯一能对冲框架变化风险的做法是在业务代码和框架之间加一层薄薄的内存接口memory abstraction layer。业务逻辑只调用你自定义的接口不直接感知底层用的是哪个框架的哪个存储模块。这样当新的框架或更好的存储方案出现时你的业务代码迁移成本会小很多。10. 总结与后续学习方向这篇文章把 Agent 记忆系统的核心命题拆成了三部分第一建立了分层认知。Context 是工作台短期记忆是便签纸长期记忆是知识库。三者按需协作而不是互相替代。理解了这一点你就不会再犯“把所有信息都塞给模型”的初级错误。第二梳理了三个框架的定位差异。LangChain 提供组件化记忆能力适合快速上手LangGraph 通过显式状态机和持久化机制把记忆管理纳入流程治理是企业级复杂任务的更稳妥选择DeepAgent 则在长期记忆和智能体产品化方向上做了更前沿的探索提供了不少值得借鉴的设计理念。第三给出了工程治理框架。从分层架构、记忆四操作、上下文压缩到常见问题排查和 8 条最佳实践覆盖了一个企业级 Agent 记忆系统从设计到落地的关键环节。如果你接下来想继续深入建议按这个顺序实践先用 LangChain 跑通一个带基础记忆的多轮对话 Agent感受记忆模块的边界。再用 LangGraph 搭建一个至少包含三个节点、一个条件路由的流程把状态管理练熟。然后自己实现一个MemoryProvider接口把记忆从框架中解耦出来对接真实的数据库或向量库。最后在一个真实的业务场景里做一次 Context 超限的“压力测试”你会发现很多问题只有跑到生产环境附近才会暴露。Agent 记忆系统没有银弹。它更像是一个持续演进的基础设施工程模型在变、框架在变、业务需求在变但“分层、可观测、可治理”的原则不会变。希望这篇文章能帮你少走一些弯路。
返回列表