简介:本文面向智能体开发者与架构师,系统讲解如何为 AI Agent 构建从短期上下文到长期持久化的记忆系统。文章从认知科学中的记忆分类出发,结合大模型无状态推理的天然缺陷,给出分层记忆架构、存储选型、召回策略、写入与更新机制、一致性与安全治理等完整落地路径。读者可据此搭建一套可验证、可维护、可扩展的 Agent 记忆底座,避免“对话越长越健忘”的常见问题。
本教程要解决的核心问题是:如何为基于大语言模型的 AI Agent 设计并落地一套从短期工作记忆到长期持久记忆的系统,使 Agent 在跨会话、跨天甚至更长时间尺度上能够稳定记住用户事实、任务进度、偏好与经验,并在合适时机主动召回这些信息辅助决策。
这一目标直接对应一个常见且令人沮丧的现象:很多 Agent 在单次对话中表现正常,但只要会话一长、或者隔天再聊,就开始遗忘关键信息。这不是模型参数不够大,而是架构上缺少有效的记忆层。我们希望通过本教程,帮助读者完成以下任务:
适合阅读本教程的读者包括:
当前主流大语言模型在推理时本质上是无状态的。模型本身不会在两次调用之间保留任何关于“你”的信息,它只能依赖你每次传入的上下文。无论是 128K 还是更大的窗口,都只是把一段文本临时塞进模型,窗口再大也会被截断、也会在会话结束后消失。
这带来两个直接后果:
因此,任何想要从“单轮工具”进化为“长期伙伴”的 Agent,都需要在模型之外增加一层有状态的记忆基础设施。
认知科学通常将人类记忆划分为几种类型,这对 Agent 设计有很直接的启发:
| 认知记忆类型 | 特征 | Agent 对应实现 |
|---|---|---|
| 感觉记忆 | 极短时、高带宽 | 原始输入、实时流数据缓冲 |
| 工作记忆 | 容量有限、当前任务相关 | 模型上下文窗口、当前会话状态 |
| 情景记忆 | 事件、时间、地点 | 会话日志、任务轨迹、用户交互事件 |
| 语义记忆 | 稳定事实、概念 | 用户画像、知识库、偏好库 |
| 程序记忆 | 怎么做、步骤 | 工具调用策略、流程步骤、经验规则 |
这个映射不是学术上的形式主义,而是为了指导工程上的存储粒度、更新频率和召回方式。例如,用户说“我对花生过敏”属于语义记忆,应当长期稳定保存;而“上次帮我订的酒店是哪家”属于情景记忆,需要带时间戳存储并支持按时间召回。
教程开头提到的“花生过敏推荐”场景,问题不在于模型不够聪明,而在于系统缺少三层能力:
下面的实现步骤就是围绕这三层能力展开。
一个可落地的 Agent 记忆系统,建议采用以下三层结构:
短期工作记忆层
中期情景记忆层
长期语义与程序记忆层
这三层不是彼此孤立的,而是通过一个记忆写入管道和记忆召回管道连接起来,形成从感知到存储再到利用的闭环。
在开始实施前,需要具备以下基础条件和知识。
建议读者先熟悉以下通用概念,这会让后续步骤更容易理解:
记忆系统会积累大量用户行为与事实信息,因此在设计前需要明确:
这些准备不仅是合规要求,也会直接影响存储结构设计。
下面按照从简单到完整的顺序,分五个步骤完成记忆系统搭建。
目标:让 Agent 在当前会话内保持连贯的上下文,并显式区分“固定系统指令”“当前任务状态”“历史对话片段”三类信息。
做法:
在应用层维护一个会话状态对象,该对象至少包含以下字段:
session_state = {"session_id": "唯一会话标识","system_prompt": "全局角色与规则描述","turn_history": [{"role": "user", "content": "..."},{"role": "assistant", "content": "..."}],"working_memory": {"current_task": "当前正在处理的任务","recent_entities": ["涉及的关键实体"],"temporary_flags": {"awaiting_user_confirmation": true}}}
每次调用模型时,将 system_prompt、最近若干轮 turn_history 和 working_memory 一起组装为模型输入。
为什么这样做:
短期工作记忆最核心的价值是让模型在多次调用之间保持“当前正在做什么”的认知。如果把所有细节都压入模型窗口,会导致关键信息被稀释;通过 working_memory 显式维护任务状态,可以提升模型对当前目标的把握。
注意事项:
目标:当一个会话过长、或者用户暂时离开后再次回来时,Agent 能快速恢复上下文,而不必重新处理全部历史。
做法:
示例摘要结构可以是:
{"summary_id": "sm_20250601_001","session_id": "sess_8842","timestamp": "2025-06-01T10:24:00Z","summary_text": "用户在规划三天的短途出行,提到预算约2000元,偏好安静住宿,明确对花生过敏。","key_facts": ["用户对花生过敏","出行预算约2000元","住宿偏好安静"],"open_questions": ["尚未确定入住日期"]}
为什么这样做:
中期记忆是工作记忆与长期记忆之间的缓冲层。它既能降低长会话的 token 成本,又能保留跨会话的近期语境。很多“隔天继续聊”的场景,仅靠中期摘要就能恢复足够好的体验。
注意事项:
目标:将用户反复提及的稳定事实、偏好、身份信息等,从对话中提取出来,沉淀为可长期复用的结构化记忆。
做法:
user_profile = {"user_id": "u_12345","facts": [{"type": "allergy", "value": "花生", "source": "user_stated", "confidence": 0.98, "updated_at": "..."},{"type": "preference", "value": "安静住宿", "source": "inferred", "confidence": 0.75, "updated_at": "..."}],"long_term_goals": ["计划一次预算2000元的三天短途出行"],"stable_context": ["职业为软件工程师", "常用语言为中文"]}
为什么这样做:
长期记忆是 Agent 避免“花生过敏”类错误的根本保障。只有把用户明确或隐含表达的稳定信息结构化保存,并在每次相关请求前主动召回,才能让 Agent 表现出真正意义上的“记得”。
注意事项:
目标:当用户提出新请求时,系统能够自动检索出与新请求相关的历史记忆,而不仅仅依赖精确字段匹配。
做法:
示意性检索调用流程如下:
user_input = "今晚吃什么"query_vector = embed(user_input)related_memories = vector_search(collection="agent_memory",query_vector=query_vector,top_k=5,filter={"user_id": current_user_id})context_block = format_memories(related_memories)model_input = build_prompt(user_input, context_block, session_state)
为什么这样做:
长期记忆往往是稀疏但海量的。用户不会每次都说“请考虑我的过敏史再推荐”。只有通过语义召回,才能让“花生过敏”这条事实在“今晚吃什么”这类非字面相关请求中被激活。
注意事项:
目标:让记忆系统不仅能写入,还能随着时间推移和用户变化进行更新、衰减与纠正。
做法:
为什么这样做:
记忆系统如果没有更新和遗忘能力,就会退化为一个不断膨胀且越来越脏的静态库。Agent 越是长期运行,错误记忆的累积越会影响信任度。
注意事项:
在具体实现时,可参考以下通用配置思路。
完成上述步骤后,需要通过以下方式验证记忆系统是否正常工作。
AI Agent 从“单次对话工具”走向“长期数字伙伴”,关键不在于模型本身的大小,而在于是否具备一套可靠的记忆系统。我们从大模型的无状态本质出发,按照认知科学中的记忆分类,给出了短期工作记忆、中期情景记忆、长期语义与程序记忆的三层架构,并详细拆解了从会话状态管理、摘要写入、事实提取、向量召回到更新与遗忘的完整实施路径。
回顾整个过程,有几点值得再次强调:
掌握这些方法后,你可以根据自己的业务场景,逐步构建并完善 Agent 的记忆体系。后续还可以继续深入探索程序性记忆的自动化沉淀、多 Agent 之间的记忆共享与隔离、以及基于用户反馈的主动记忆修正等方向。