为什么 Agent 需要记忆
大模型本身是无状态的——每次调用都是从零开始,不记得上一次聊了什么。做 Agent 应用时,你必须自己给它加上记忆。没有记忆的 Agent 就像一个每次见面都要重新自我介绍的同事,用起来非常别扭。记忆系统是 Agent 从「聊天机器人」变成「长期助手」的关键一步。
Agent 的记忆分两类:短期记忆是当前对话的上下文(你刚说了什么、Agent 刚答了什么),长期记忆是跨会话保留的信息(用户叫什么、喜欢什么、之前做过什么决策)。两者存储方式不同,使用时机也不同。
没有记忆的 Agent 是一次性的工具,有记忆的 Agent 才是长期助手。记忆决定了 Agent 能不能真正理解你的需求。
- 短期记忆当前对话的上下文,存在提示词里。
- 长期记忆跨会话的用户偏好和事实,存在外部存储。
- 记忆检索根据当前问题从长期记忆里捞出相关信息。
- 记忆更新新信息进来要写入,过时信息要淘汰。
短期记忆:对话上下文
短期记忆就是当前对话的完整上下文。用户和 Agent 一来一回的对话历史,每次请求都要带着。上下文窗口有限,对话轮次多了就要做摘要——这部分前面上下文工程那篇已经讲过。短期记忆的核心问题是:保留多少、怎么压缩、什么时候该截断。
# 短期记忆的滑动窗口策略
# 1. 保留最近 N 轮原文(比如最近 5 轮)
# 2. 更早的对话做摘要,压缩成几句话
# 3. 每次新请求把摘要 + 最近 N 轮一起塞进提示
# 4. 关键决策和事实要显式标注为「需要记住」
长期记忆:用户偏好与历史事实
长期记忆是跨会话保留的信息。用户说过「我是素食主义者」,下次推荐餐厅就应该推荐素食餐厅。用户说过「我在做一个电商网站」,下次问技术问题就应该围绕电商场景。这些信息需要存在外部存储里,每次新会话开始时检索出来塞进系统提示。
- 用户画像职业、行业、技术栈、偏好。
- 历史决策之前讨论过的方案、做过的选择。
- 项目背景用户在做的项目是什么、进展到哪了。
- 明确要求用户说过「以后别再问我这个」这类指令。
记忆存储:向量数据库与摘要
长期记忆存在哪?最常用的方案是向量数据库。每一条记忆(比如「用户喜欢简洁风格」)存成一条记录,附带它的向量嵌入。需要回忆的时候,拿当前问题的向量去做相似度检索,捞出最相关的几条记忆塞进提示词。
| 记忆类型 | 存储方式 | 检索方式 |
|---|---|---|
| 用户画像 | 结构化 KV 存储 | 直接读取 |
| 历史对话摘要 | 向量数据库 | 语义检索 |
| 项目文档 | 向量数据库 | RAG 检索 |
| 对话原文 | 短期上下文窗口 | 滑动窗口 |
记忆检索:什么时候该回忆什么
不是每次请求都要把所有长期记忆塞进去——那会把上下文窗口撑爆。正确做法是:用户问一个问题,先拿这个问题去向量库里检索,只捞出和当前问题相关的 3-5 条记忆,塞进提示词。不相关的记忆就不塞,省 Token 也不干扰模型。
# 记忆检索的基本流程
# 1. 用户发来新问题 Q
# 2. 把 Q 转成向量,去长期记忆库做相似度检索
# 3. 取出 top-K 条最相关记忆(比如 top-5)
# 4. 把这 5 条记忆拼到系统提示里
# 5. 连同当前对话上下文一起发给模型
记忆遗忘与更新
记忆不是只增不减的。用户可能改主意了——之前说喜欢简洁风格,现在说喜欢详细解释。旧记忆就要更新,不能一直留着误导。你要让 Agent 在对话中识别「用户改主意了」这种信号,自动更新对应的记忆条目。太久远的、不再相关的记忆也可以逐步淘汰,别让记忆库无限膨胀。
记忆系统的落地架构
一个完整的 Agent 记忆系统分三层:最外层是短期上下文窗口(当前对话),中间是长期记忆库(向量数据库),最底层是用户画像存储(结构化 KV)。每次请求时,先从用户画像拿基础信息,再从长期记忆库检索相关条目,最后拼上短期上下文,送给模型。这就是一个有记忆能力的 Agent 的完整架构。
好的记忆系统不是把所有信息都塞给模型,而是在对的时机把对的几条记忆拿出来。记忆质量比记忆数量重要得多。