☰
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
2026/10/20 2:13:48 网站建设 项目流程

👋 我是 Yulia,一线 AI 应用开发工程师:4 年工程经验,在职做大模型应用落地。
只写一件事——把最新 AI 技术讲成人话 + 给你能直接上手用的代码(真实可验证,不搬运不注水)。
有用就点个关注,持续更新大模型应用的前沿实战。

📚 本文是《后端开发从入门到靠谱》系列第 14 篇。第十二课我们做出了会调工具的 Agent,但它有个致命短板——每次对话都像第一次见你,记不住你上一句说过什么,更记不住你是谁。这一课给它装上"记忆",让它真正像个靠谱的助理。

你用 AI 助手问了个问题,聊了半天;第二天再打开,它完全不记得你昨天说过什么——又要从头自我介绍一遍。这就是没有记忆的 Agent:一个失忆的助理。

记忆系统(Memory)就是让 Agent 摆脱"失忆",能记住对话上下文、记住用户偏好,跨会话持续提供个性化服务。这是 Agent 从"玩具"到"能用"的关键一跃。

读完你会拿到:

  • 一个直觉模型:为什么大模型天生"失忆"(无状态)
  • 记忆的两个层次:短期记忆(本次会话)vs 长期记忆(跨会话)
  • 短期记忆的实现:上下文管理三招(滑动窗口 / 摘要压缩 / 分层)
  • 长期记忆的三类:事实记忆 / 语义记忆 / 情景记忆
  • 长期记忆的写入与检索(什么时候存、什么时候取,Agent 记忆的灵魂)
  • 一个完整记忆系统的代码骨架
  • 常见坑:记忆爆炸、错误记忆、隐私与遗忘权

先看全景图,Agent 记忆系统长这样:

检索相关记忆

提取记忆写入

用户

Agent 大脑

短期记忆 本次会话

长期记忆 跨会话

一、为什么 Agent 天生"失忆"?

先搞懂根本原因,后面的设计才有根基。

大模型是无状态的(stateless)。每次调用 API,它只看你这一次传进去的内容,不会自动记住上一次的对话。你可以把大模型想象成"一个每次都格式化过的临时工":

无记忆

每次都失忆 重新介绍

有记忆

记住用户和偏好

所以"记忆"不是大模型自带的能力,而是你在外面给它搭的一套系统——把该记住的东西存下来,下次再喂回给它。这个"存 + 取"的系统,就是 Agent 记忆系统。

二、记忆的两个层次:短期 vs 长期

Agent 记忆分成两个层次,这是理解整个系统的框架:

短期记忆(Working Memory)长期记忆(Long-term Memory)
作用域当前这一次会话跨会话、永久
存什么本次对话的历史消息用户偏好、历史事实、知识
类比脑子里的临时记忆随身笔记本
生命周期会话结束就清空持久保存

一句话:短期记忆负责"这次对话别聊着聊着忘了上文",长期记忆负责"下次再来还认识你"。

三、短期记忆:上下文管理

短期记忆的实现,本质是把历史消息拼进 prompt。你在代码里维护一个messages列表:

messages=[]# 短期记忆:本次对话的历史defchat(user_input):messages.append({"role":"user","content":user_input})# 加进历史resp=call_llm(messages)# 整个 messages 一起传给大模型messages.append({"role":"assistant","content":resp})returnresp

大模型每次都能"看到"前面的历史,所以能接上话。但这里有个硬约束:大模型上下文长度有限(token 数),历史不能无限塞。于是有了三种管理策略:

历史消息太多

滑动窗口 只留最近N条

摘要压缩 把旧对话压成摘要

  1. 滑动窗口:只保留最近 N 条消息,旧的直接丢掉。简单,但会丢掉"很久之前的关键信息"。
  2. 摘要压缩:把较早的历史用大模型压缩成一段摘要(“用户刚才说他想学 AI 后端…”),既省 token 又保留要点。
  3. 分层记忆:最近几条保留原文 + 更早的保留摘要,两者结合。

这就是"上下文管理"(之前系列里提过):短期记忆的本质,是在 token 有限的约束下,尽量保留有用的上下文。

四、长期记忆:跨会话记住用户

短期记忆会话一结束就没了。要让 Agent"下次还认识你",需要长期记忆——把重要信息持久化到数据库/向量库里,下次再取出来。

长期记忆通常分三类:

长期记忆三类

事实记忆

用户是谁

偏好

语义记忆

知识库

RAG

情景记忆

历史交互

做过什么

  • 事实记忆:关于用户的事实——“用户叫 Yulia,是后端工程师,用 FastAPI”;
  • 语义记忆:通用知识库——公司的产品文档、领域知识(这就是 RAG 的向量库);
  • 情景记忆:历史交互记录——“上次我帮你解决过 XX 问题”。

注意:RAG(第十一课)本质上是语义记忆的一种实现。所以记忆系统和 RAG 不是两回事,RAG 是记忆系统里的一个子集。

五、长期记忆的写入:什么时候存

长期记忆最关键的设计是**“什么时候写入”——因为不可能把每一句话都存下来(会爆炸),要挑有价值的存**。

有 值得记

无 闲聊

对话结束

LLM 判断有无价值

提取成记忆

写入数据库 向量库

丢弃

核心是用大模型做"记忆提取(memory extraction)":对话结束后,让大模型判断"这段对话里有没有值得长期记住的信息",有就提取成一条结构化记忆。例如:

defextract_memory(dialogue:str)->str|None:prompt=f"""判断下面的对话里有没有值得长期记住的信息(用户身份、偏好、重要事实)。 如果有,提取成一句话记忆;如果没有,返回"无"。 对话:{dialogue}"""memory=call_llm(prompt)returnNoneif"无"inmemoryelsememory# 示例:对话"我叫 Yulia,是做后端开发的"# 提取出记忆:"用户叫 Yulia,是后端开发工程师"

提取出的记忆写入数据库,下次对话时检索出来用。

六、长期记忆的检索:什么时候取

存了记忆,还要在合适的时候取出来用。每次新对话开始时,根据用户当前的问题,去检索最相关的记忆:

新对话

向量检索记忆

取相关记忆

注入 prompt

检索用向量相似度(和 RAG 一样)——把用户当前问题向量化,去找最相关的记忆。比如用户问"帮我推荐一个后端框架",就能检索出"用户是后端工程师、用 FastAPI"这条记忆,然后回答就能个性化。

七、完整实现:一个带记忆的 Agent

把短期 + 长期记忆串起来:

# 短期记忆:本次会话的 messagesmessages=[]defchat(user_id:str,user_input:str):# 1. 检索长期记忆relevant_memories=retrieve_memories(user_id,user_input)# 向量检索# 2. 拼 prompt:长期记忆 + 短期上下文 + 当前问题memory_text="\n".join(relevant_memories)messages.append({"role":"user","content":user_input})prompt_messages=[{"role":"system","content":f"关于用户,你已知:\n{memory_text}"},]+messages[-10:]# 短期记忆:滑动窗口,只留最近 10 条# 3. 调大模型resp=call_llm(prompt_messages)messages.append({"role":"assistant","content":resp})# 4. 提取新记忆,写入长期记忆new_memory=extract_memory(f"用户:{user_input}\n助手:{resp}")ifnew_memory:store_memory(user_id,new_memory)# 写入向量库/数据库returnresp

这段代码把整篇文章串起来了:检索长期记忆 → 拼短期上下文 → 生成 → 提取新记忆写入。四个步骤就是 Agent 记忆系统的完整闭环。

八、常见坑与避坑指南

坑原因解决方案
记忆爆炸什么都存,越存越多用 LLM 判断"值不值得记",只存有价值的
错误/过时记忆记错了或用户情况变了支持记忆更新、过期,冲突时以新为准
记忆污染上下文检索出无关记忆塞进 prompt限制检索数量,做相关性阈值过滤
隐私泄露记忆里存了敏感信息做权限隔离 + 支持"遗忘"(删除指定记忆)
短期上下文太长历史无脑堆滑动窗口 + 摘要压缩

隐私与遗忘权是记忆系统特有的红线:用户有权要求"忘了我"。一个合格的记忆系统必须支持删除指定用户的记忆,这在合规上越来越重要。

总结:一张图带走

这课的核心,一句话串起来:

  • 大模型天生无状态,记忆是你在外面给它搭的"存 + 取"系统。
  • 两层记忆:短期记忆(本次会话,用 messages + 滑动窗口/摘要)vs 长期记忆(跨会话,持久化)。
  • 长期记忆三类:事实记忆(用户是谁)、语义记忆(RAG 知识库)、情景记忆(历史交互)。
  • 写入靠"记忆提取":用大模型判断"值不值得记",只存有价值的,防爆炸。
  • 检索靠向量相似度:新对话时检索最相关的记忆注入 prompt,实现个性化。
  • 完整闭环:检索记忆 → 拼上下文 → 生成 → 提取新记忆写入。

三个立即可用的行动:

  1. 给第十二课的 Agent 加一个最简单的短期记忆(messages列表 + 滑动窗口),感受它"记得上文"的变化;
  2. 写一个extract_memory函数,让大模型从对话里提取"值得记住"的信息,存进数据库;
  3. 下次对话前,用向量检索把相关记忆取出来注入 prompt,实现"下次还认识你"。

如果这篇对你有帮助,点个赞、收藏一下,下一篇我们讲Multi-Agent 多智能体——让多个 Agent 分工协作。

关注我,我会持续更新 AI 应用开发的前沿实战,陪你从单 Agent 一路进阶到多智能体系统。

你在做 Agent 记忆时,遇到过"记忆越存越多、检索越来越不准"的问题吗?你是怎么解决的?评论区聊聊,我挨个回。

(本文记忆系统方案基于主流 Agent 框架的通用设计,存储可用数据库 + 向量库实现,具体技术栈可替换,评论区提醒我。)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询