👋 我是 Yulia,一线 AI 应用开发工程师:4 年工程经验,在职做大模型应用落地。
只写一件事——把最新 AI 技术讲成人话 + 给你能直接上手用的代码(真实可验证,不搬运不注水)。
有用就点个关注,持续更新大模型应用的前沿实战。
📚 本文是《后端开发从入门到靠谱》系列第 14 篇。第十二课我们做出了会调工具的 Agent,但它有个致命短板——每次对话都像第一次见你,记不住你上一句说过什么,更记不住你是谁。这一课给它装上"记忆",让它真正像个靠谱的助理。
你用 AI 助手问了个问题,聊了半天;第二天再打开,它完全不记得你昨天说过什么——又要从头自我介绍一遍。这就是没有记忆的 Agent:一个失忆的助理。
记忆系统(Memory)就是让 Agent 摆脱"失忆",能记住对话上下文、记住用户偏好,跨会话持续提供个性化服务。这是 Agent 从"玩具"到"能用"的关键一跃。
读完你会拿到:
- 一个直觉模型:为什么大模型天生"失忆"(无状态)
- 记忆的两个层次:短期记忆(本次会话)vs 长期记忆(跨会话)
- 短期记忆的实现:上下文管理三招(滑动窗口 / 摘要压缩 / 分层)
- 长期记忆的三类:事实记忆 / 语义记忆 / 情景记忆
- 长期记忆的写入与检索(什么时候存、什么时候取,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 条消息,旧的直接丢掉。简单,但会丢掉"很久之前的关键信息"。
- 摘要压缩:把较早的历史用大模型压缩成一段摘要(“用户刚才说他想学 AI 后端…”),既省 token 又保留要点。
- 分层记忆:最近几条保留原文 + 更早的保留摘要,两者结合。
这就是"上下文管理"(之前系列里提过):短期记忆的本质,是在 token 有限的约束下,尽量保留有用的上下文。
四、长期记忆:跨会话记住用户
短期记忆会话一结束就没了。要让 Agent"下次还认识你",需要长期记忆——把重要信息持久化到数据库/向量库里,下次再取出来。
长期记忆通常分三类:
- 事实记忆:关于用户的事实——“用户叫 Yulia,是后端工程师,用 FastAPI”;
- 语义记忆:通用知识库——公司的产品文档、领域知识(这就是 RAG 的向量库);
- 情景记忆:历史交互记录——“上次我帮你解决过 XX 问题”。
注意:RAG(第十一课)本质上是语义记忆的一种实现。所以记忆系统和 RAG 不是两回事,RAG 是记忆系统里的一个子集。
五、长期记忆的写入:什么时候存
长期记忆最关键的设计是**“什么时候写入”——因为不可能把每一句话都存下来(会爆炸),要挑有价值的存**。
核心是用大模型做"记忆提取(memory extraction)":对话结束后,让大模型判断"这段对话里有没有值得长期记住的信息",有就提取成一条结构化记忆。例如:
defextract_memory(dialogue:str)->str|None:prompt=f"""判断下面的对话里有没有值得长期记住的信息(用户身份、偏好、重要事实)。 如果有,提取成一句话记忆;如果没有,返回"无"。 对话:{dialogue}"""memory=call_llm(prompt)returnNoneif"无"inmemoryelsememory# 示例:对话"我叫 Yulia,是做后端开发的"# 提取出记忆:"用户叫 Yulia,是后端开发工程师"提取出的记忆写入数据库,下次对话时检索出来用。
六、长期记忆的检索:什么时候取
存了记忆,还要在合适的时候取出来用。每次新对话开始时,根据用户当前的问题,去检索最相关的记忆:
检索用向量相似度(和 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,实现个性化。
- 完整闭环:检索记忆 → 拼上下文 → 生成 → 提取新记忆写入。
三个立即可用的行动:
- 给第十二课的 Agent 加一个最简单的短期记忆(
messages列表 + 滑动窗口),感受它"记得上文"的变化; - 写一个
extract_memory函数,让大模型从对话里提取"值得记住"的信息,存进数据库; - 下次对话前,用向量检索把相关记忆取出来注入 prompt,实现"下次还认识你"。
如果这篇对你有帮助,点个赞、收藏一下,下一篇我们讲Multi-Agent 多智能体——让多个 Agent 分工协作。
关注我,我会持续更新 AI 应用开发的前沿实战,陪你从单 Agent 一路进阶到多智能体系统。
你在做 Agent 记忆时,遇到过"记忆越存越多、检索越来越不准"的问题吗?你是怎么解决的?评论区聊聊,我挨个回。
(本文记忆系统方案基于主流 Agent 框架的通用设计,存储可用数据库 + 向量库实现,具体技术栈可替换,评论区提醒我。)