Agent的短期记忆和长期记忆
一、为什么Agent需要记忆?
没有记忆的Agent,每次任务都是孤立事件。就像一条金鱼——转一圈就忘了刚才做过什么。记忆让Agent从"一次性回答问题"升级到"持续完成任务",是区分真正有用的AI系统与玩具级AI的关键。
举个例子:你跟一个AI助手说"我对海鲜过敏",下次让它推荐餐厅时,如果它还推荐海鲜大餐——那说明它完全没有"记忆"。一个有记忆的Agent,会在下次直接排除海鲜选项。
二、短期记忆(Short-Term Memory)
什么是短期记忆?
短期记忆是Agent在执行单个任务或一次会话中的临时缓冲区,用于维持任务的连续性和上下文一致性。一旦任务完成或会话结束,这些记忆就会被清除。
类比:就像你去医院看病,看病过程中你记得挂号科室、医生名字、检查结果……但走出医院后,这些细节就慢慢忘了,因为它们对后续生活没什么用了。
短期记忆存储什么?
- 会话内的用户输入和Agent回复
- 工具调用的结果(API返回值、查询结果等)
- 中间推理状态和临时变量
- 当前任务的目标、约束和已完成步骤
短期记忆的关键特性
| 维度 | 说明 |
|---|---|
| 生命周期 | 分钟~小时级(单次会话内) |
| 容量 | MB级,受LLM上下文窗口限制 |
| 存储方式 | 内存数据库(如Redis)或LLM原生上下文 |
常见实现方式
1. 基于上下文窗口的记忆
最简单直接的做法——把历史对话、当前目标和中间结果全部塞进LLM的上下文窗口里。
- 优点:实现成本极低,几行代码搞定
- 缺点:任务变长时上下文迅速膨胀,推理质量下降,token成本飙升
2. 结构化状态记忆
不再用自然语言堆砌,而是用JSON或表单形式记录任务状态:
{
"目标": "帮用户预订巴黎旅行",
"约束": "预算1万以内,靠近地铁",
"已完成": ["查航班", "比价酒店"],
"待办": ["订酒店", "买景点门票"],
"当前步骤": "订酒店"
}
- 优点:执行路径稳定、可解释性强,能显著降低Agent"跑偏"的概率
- 缺点:需要预先设计好数据结构
3. 滚动摘要记忆
定期对已有的长对话进行压缩和总结,用摘要替代原始内容进入上下文。
- 优点:大幅降低token成本,同时保证任务连续性
- 缺点:压缩过程可能丢失细节
- 适用:长任务Agent的标配方案
4. 会话内检索式记忆
本质上是"短期RAG"——将本次任务中产生的信息写入临时可检索空间,需要时按当前问题检索,而不是一次性全部加载到上下文中。
- 优点:按需回忆关键信息,平衡上下文长度和执行可靠性
- 适用:多文档、多工具协作的复杂任务
三、长期记忆(Long-Term Memory)
什么是长期记忆?
长期记忆是跨会话、跨任务的持久化记忆,用于沉淀用户偏好、历史背景、经验教训等可复用信息。
类比:你需要永远记住爸妈是谁、自己叫什么名字、自己对什么过敏——这些信息对生活至关重要,需要长期保留。Agent也一样,需要记住用户的核心偏好和重要事实。
长期记忆存储什么?
- 用户长期偏好(如"喜欢无糖奶茶"、"对海鲜过敏")
- 结构化事实知识和实体关系
- 跨会话的任务经验和历史背景
- 成功/失败的策略总结
长期记忆的关键特性
| 维度 | 说明 |
|---|---|
| 生命周期 | 天级~月级,甚至永久保留 |
| 容量 | GB~TB级,依赖外部存储 |
| 存储方式 | 向量数据库 + 关系数据库 + 图数据库 |
常见实现方式
1. 向量化记忆(长期RAG)
目前最主流、应用最广泛的方式。将用户偏好、历史对话摘要、关键事实进行向量化存储,通过语义相似度进行检索和回忆。
- 优点:天然适合非结构化信息,扩展性强
- 技术栈:Chroma、Milvus、Pinecone等向量数据库
- 典型场景:个人助理记住用户的长期偏好和历史背景
2. 结构化用户画像与事实库
将关键事实拆解为结构化字段,通过明确的写入和更新逻辑维护:
用户画像:
- 姓名: 小明
- 职业: 算法工程师
- 偏好: 技术类内容, 无糖饮品
- 禁忌: 海鲜过敏
- 常用工具: PyTorch, Transformers
- 优点:可控性强、可解释性高、准确性高
- 技术栈:MySQL、PostgreSQL、Neo4j(图数据库)
- 适用:企业级Agent、客服系统
3. 经验与策略记忆
关注的不是"发生了什么",而是"什么方式更有效"。Agent在任务完成后进行复盘,总结成功/失败的策略。
- 形式:案例库、规则权重、策略标签
- 作用:让Agent从"执行者"进化为"决策者"
- 适用:复杂规划型Agent(自动化研究、代码修复、投放优化)
4. 记忆的三层处理
- RAG检索:存储到数据库,方便后续语义检索
- 重要记忆提取:标记一段时间内非常重要的人、事、物
- 记忆摘要:对历史记忆进行总结归纳,大幅减少存储体积
遗忘机制——容易被忽视但至关重要
随着长期记忆规模扩大,"记什么、不记什么"比存储本身更重要。一个成熟的Agent系统需要:
- 写入门槛:只记录高价值信息,避免垃圾信息污染记忆库
- 定期评估:判断已有信息是否仍有价值
- 遗忘策略:对低价值、过期或错误的记忆进行压缩或删除
核心原则:长期记忆的竞争力不在于存得多,而在于存得对、忘得及时。 否则Agent反而会被过去的错误信息拖累。
四、短期 vs 长期记忆对比
| 维度 | 短期记忆 | 长期记忆 |
|---|---|---|
| 核心作用 | 保证单个任务的完成 | 支撑跨任务的成长与个性化 |
| 生命周期 | 分钟~小时级 | 天级~月级(可永久) |
| 容量 | MB级 | GB~TB级 |
| 存储方式 | 内存/Redis/LLM上下文 | 向量库 + 关系库 + 图库 |
| 访问速度 | 毫秒级 | 毫秒~秒级 |
| 典型场景 | 多轮对话、实时客服 | 个性化推荐、长期陪伴 |
一句话总结:短期记忆保证"把事做完",长期记忆决定"下次能否做得更好"。
五、三层记忆体系(进阶)
实际上,除了短期和长期记忆,还有一层更底层的工作记忆(Working Memory):
| 层级 | 工作记忆 | 短期记忆 | 长期记忆 |
|---|---|---|---|
| 时间跨度 | 秒~分钟 | 分钟~小时 | 天~月 |
| 核心作用 | 推理过程中的临时草稿 | 单次会话的上下文缓冲 | 跨会话的知识金库 |
| 存储媒介 | Python内存结构 | Redis / LLM上下文 | 向量库 + 关系库 |
| 典型内容 | 任务拆分的中间步骤 | 用户输入和Agent回复 | 用户偏好和历史经验 |
三层协同示例:旅行助手推荐巴黎景点
- 工作记忆(临时推理):存储推理步骤 →
[检索偏好 → 匹配景点 → 生成推荐] - 短期记忆(本次会话):读取对话历史 →
[用户说"我喜欢印象派艺术"] - 长期记忆(跨会话):检索历史偏好 →
[用户计划7月去巴黎旅行] - 融合推理:结合三层信息,生成个性化推荐 → 推荐奥赛博物馆、橘园美术馆等印象派相关景点
推理完成后:工作记忆立即销毁 → 短期记忆保留到会话结束 → 新发现的偏好提炼后写入长期记忆。
六、常见误区
误区1:短期记忆越长越好
过长的上下文会导致推理质量下降("大海捞针"效应),token成本飙升。应该通过摘要、检索等方式保持简洁高效。
误区2:长期记忆 = 存更多数据
关键是"存什么"和"怎么用",而不是"存多少"。需要定期清理和评估记忆质量,防止错误信息的反噬。
误区3:记忆系统可以后期再加
记忆架构应该在设计阶段就考虑,后期改造成本很高。一开始就应该为记忆的存储、检索和清理留好接口。